An Analysis of Modern Web Security Vulnerabilities Inside WebAssembly Applications

该论文指出 WebAssembly 模块中的二进制漏洞(如缓冲区溢出)可能破坏 Web 应用的安全机制并引发 SQL 注入等 Web 安全威胁,同时提供了相应的缓解策略与最佳实践。

Lorenzo Corrias, Lorenzo Pisu, Davide Maiorca, Giorgio Giacinto

发布于 Wed, 11 Ma
📖 1 分钟阅读☕ 轻松阅读

Each language version is independently generated for its own context, not a direct translation.

这篇论文就像是在给 WebAssembly(简称 WASM)这个“新来的超级实习生”做了一次全面的安全体检。

为了让你更容易理解,我们可以把整个 Web 应用想象成一家高科技餐厅,而 WASM 就是餐厅里新招的一位拥有神速厨艺的“黑盒厨师”

1. 背景:为什么我们需要这位“黑盒厨师”?

以前的网页(JavaScript)就像是用普通食材慢慢炒的菜,虽然灵活,但处理复杂任务(比如 3D 游戏、视频编辑)时太慢了。
于是,大家引入了 WebAssembly (WASM)。它就像是从传统 C/C++ 语言里直接“移植”过来的黑盒厨师

  • 优点:速度极快,像火箭一样,能处理以前网页做不到的重活。
  • 隐患:这位厨师虽然快,但他来自一个“野蛮生长”的旧厨房(C 语言环境)。在这个旧环境里,厨师们习惯把刀随便乱放,或者切菜时不小心切到了自己的手(内存漏洞),而且没有像现代厨房那样严格的“防切手手套”(安全保护机制)。

2. 核心发现:厨房里的“小事故”如何变成“餐厅大灾难”?

这篇论文最惊人的发现是:即使这位黑盒厨师在厨房里切到了自己的手(发生了底层漏洞),他也不会直接崩溃,而是会把这种“混乱”传染给整个餐厅,导致原本安全的菜单被篡改。

研究人员通过几个生动的实验(PoC),展示了这种“传染”是如何发生的:

场景一:SQL 注入(篡改菜单)

  • 比喻:餐厅经理(前端代码)告诉厨师:“请给 3 号桌做一份‘番茄炒蛋’"。厨师本来很安全,会按标准流程做。
  • 漏洞:但是,如果厨师的切菜板(内存)旁边放着一把刀,而有人(黑客)偷偷把切菜板上的字擦掉,改成了“给 3 号桌做一份‘番茄炒蛋’,顺便把后厨保险柜打开"。
  • 后果:因为厨师太信任自己的切菜板,他不仅做了菜,还执行了“打开保险柜”的指令。
  • 论文结论:即使你用了“参数化查询”(就像给厨师准备了标准的预制菜包),如果黑客能通过缓冲区溢出(把切菜板撑破,把旁边的字覆盖掉)或释放后重用(把刚用完的盘子洗了又拿来装毒药),依然能篡改指令。

场景二:服务器端模板注入(SSTI)(伪造特制餐牌)

  • 比喻:餐厅为了安全,让厨师生成一个随机的“防伪标签”(Nonce),贴在菜上,防止有人伪造。
  • 漏洞:黑客利用厨师的内存漏洞,把原本应该生成“随机标签”的机器,改成了生成“特制餐牌”的机器。比如,把标签改成了 #{7*7}(这是模板引擎的代码)。
  • 后果:当餐厅经理把这个标签贴到菜单上时,系统不仅看到了标签,还执行了标签里的代码(计算出了 49),甚至可能执行更危险的命令。
  • 论文结论:餐厅经理太信任厨师生成的标签了,没意识到标签本身已经被黑客通过“切菜板溢出”给污染了。

场景三:XS-Leaks(侧信道窃听)(听声音猜密码)

  • 比喻:黑客想偷听隔壁 VIP 包厢(用户隐私)里的秘密,但被一堵墙(浏览器安全策略)挡住了,什么都看不见。
  • 漏洞:黑客发现,如果让厨师在厨房里做一道极其复杂的菜(比如用正则表达式去匹配一个很长的秘密),厨师会花很长时间。
  • 操作
    1. 黑客通过漏洞,偷偷把厨师的“菜谱”(搜索规则)改成了针对某个特定字母的复杂匹配。
    2. 黑客让顾客点菜,并掐表计时
    3. 如果厨师花了 5 秒钟才端出菜,说明那个字母在秘密里;如果 0.1 秒就端出来了,说明猜错了。
  • 后果:黑客通过听厨师切菜的声音和端菜的时间,一点点拼凑出了 VIP 包厢里的所有秘密。
  • 论文结论:即使厨师被隔离在厨房里,他干活的时间长短也能泄露秘密。

3. 为什么这很危险?

这就好比我们以为给餐厅装上了最先进的防盗门(浏览器的安全沙箱),但没想到后厨的地板(WASM 内存)是漏的

  • 黑客不需要攻破防盗门,只需要在后厨把地板弄破,就能把毒药(恶意代码)直接倒进客人的汤里。
  • 传统的防御手段(比如“参数化查询”)在厨师自己把切菜板弄乱时,完全失效。

4. 怎么办?(给餐厅老板的建议)

论文最后给出了一些实用的“厨房安全守则”:

  1. 别太信任“黑盒”:不要把从厨师(WASM)那里拿回来的东西直接当成安全的。就像经理在把菜端给客人前,必须再检查一遍。
  2. 缩小权限:只给厨师必要的工具。如果厨师只需要切菜,就别给他开保险柜的钥匙(限制导入/导出接口)。
  3. 穿上防切手手套:在编译厨师的代码时,开启安全选项(如 Emscripten 的防护功能),虽然可能会让上菜慢一点点(性能损耗),但能防止切到手。
  4. 双重检查:在 JavaScript 和 WASM 交接的地方,严格检查数据类型和长度,防止出现“整数溢出”这种低级错误(比如把 0 变成 2 的 32 次方,结果又变回 0)。

总结

这篇论文告诉我们:WebAssembly 虽然快,但它继承了旧代码的“坏毛病”。 如果开发者不重视这些底层漏洞,黑客就能利用它们,把原本安全的网页变成“提款机”或“窃听器”。

一句话概括:别以为把 C 语言代码放进浏览器就万事大吉了,如果那个“黑盒厨师”在厨房里把切菜板弄乱了,整个餐厅的菜单都可能被篡改。我们需要给这位厨师穿上防护服,并时刻盯着他。