WebAssembly(Wasm),这一革命性的二进制指令格式,正逐步成为Web应用性能提升的关键。它不仅能够作为C、C++、Rust等多种高级语言的编译目标,还能在Web上实现接近原生应用的运行效率。相较于在虚拟机中执行的Java,尽管Java通过即时编译(JIT)优化性能,但在与原生C和C++代码的性能比拼中仍稍显逊色。Wasm的优势在于,它同样运行在类似VM的环境中,却能提供更卓越的性能。两者间的无缝交互,让开发者既能享受Java丰富的生态和友好的语法,又能拥抱Wasm带来的原生级性能。
开发者通常使用C等语言编写Wasm模块,并编译成.wasm文件。然而,这些文件并不能直接被浏览器识别,而是需要通过特定的胶水代码,如Java代码,进行加载。这一过程虽然增加了些许复杂性,但也为Web应用带来了前所未有的性能飞跃。
然而,随着Wasm的广泛应用,其安全隐患也逐渐浮出水面。作为现代Web应用的核心技术之一,Wasm通过沙箱化执行机制确保了高性能与安全性。但近年来,越来越多的浏览器漏洞被发现源于Wasm组件。在Pwn2Own等国际安全竞赛中,Wasm相关的漏洞已被多次利用,实现了远程代码执行(RCE)等攻击。从各大厂商的漏洞跟踪平台也能看到,Wasm漏洞的披露数量正逐年增加。
Wasm技术的快速发展,尤其是新特性的不断引入,为其带来了潜在的漏洞风险。因此,Wasm已成为当前浏览器漏洞挖掘的热点。云鼎实验室在这一领域进行了深入探索,成功挖掘了多个高危漏洞,并获得了苹果、Mozilla等公司的官方致谢。
在Wasm漏洞挖掘的过程中,模糊测试(Fuzzing)发挥了重要作用。云鼎实验室通过改写Wasm Fuzzer,成功发现了新的漏洞。该Fuzzer的工作流程包括种子生成、生成器映射成Wasm模块、JS模板嵌入以及执行与反馈等环节。其中,生成器和JS模板的设计是关键技术点,它们分别负责生成合法且多样化的Wasm样本和触发引擎的各种行为。
以CVE-2025-1933漏洞为例,该漏洞源于Wasm在64位系统上对int32类型值处理不当。在函数调用过程中,一个经过Wasm-Ion编译的函数返回整数值,该值被存储在栈中。然而,在另一个经过Wasm-Baseline编译的函数中,弹出该值时,高32位包含了未初始化的垃圾数据。这导致了装箱后的结果不正确,进而可能引发程序崩溃或任意代码执行。
针对这一漏洞,修复方法相对简单直接:在64位系统上,将int32值扩展为64位,并确保高32位被正确清零。这一补丁有效防止了高位残留垃圾数据,从而避免了潜在的安全风险。
随着大模型(LLM)的兴起,基于LLM的模糊测试方法在Wasm Fuzzing领域也逐渐受到关注。LLM具备理解和生成代码的能力,可以辅助生成更智能的测试样本,覆盖更多的代码路径。LLM还可以用于漏洞预测与分类以及辅助漏洞分析,从而加速漏洞的发现和修复过程。
Wasm作为现代浏览器的重要攻击面之一,其安全性和稳定性至关重要。随着新特性和标准的不断引入,Wasm将继续为安全研究带来新的挑战和机遇。腾讯安全及云鼎实验室将持续跟踪Wasm的发展动态,深入挖掘潜在的安全风险,为企业组织提供及时有效的安全保障。
领取专属 10元无门槛券
私享最新 技术干货