Clear Sky Science · zh
基于栈的静态 WebAssembly 二进制切片与变异以生成有效子二进制
为何将代码拆分为更小片段至关重要
现代 Web 应用越来越依赖 WebAssembly,这是一种紧凑的类机器语言,使以 C、C++ 或 Rust 编写的程序能在浏览器、云端乃至小型嵌入式设备上以接近本地的速度运行。随着越来越多系统执行 WebAssembly,我们需要安全且彻底的方法来测试这些执行引擎中的 bug 与安全缺陷。但真实世界的 WebAssembly 程序规模大、结构复杂且难以收集到足够多样的样本。本文提出了一种新方法,将现有的 WebAssembly 程序切分为许多自包含的小型程序并对其进行巧妙修改。其结果是生成大量有效、便于处理的小型测试用例,能比现有工具更有效地对 WebAssembly 引擎施加压力测试。

从一个大程序到多个小程序
作者首先注意到,简单地随机生成 WebAssembly 代码几乎从不奏效:该语言有严格的检查,特别是在使用保存临时值的栈方面。与其从头生成代码,他们以已有的“基准” WebAssembly 二进制为起点,采用一种称为程序切片的技术。切片是程序的精简版本,仅保留会影响某个感兴趣点的代码片段,例如函数内的某条特定指令。通过沿数据流、内存使用和控制流向后跟踪,该方法提取出仍具有实际计算意义的紧凑片段,而非随机噪音。
保持看不见的栈平衡
WebAssembly 程序依赖严格的栈纪律:每条指令都会弹出和推入值,结构化的块与分支在结束时必须令栈呈现精确的形状。简单地剪裁程序片段几乎总会破坏这一纪律,使结果无效。早期工作通过在切片中填充固定模式的占位指令来修复,使其可运行但限制了多样性。本文则引入了一种专门的栈平衡修正算法。它分析每个切片内部的控制流,定位分支或块终止处破坏预期栈形状的位置,然后插入定制的指令序列以丢弃不需要的值并合成正确类型的新值。这些小“装置”在恢复正确性的同时允许比简单填充更丰富的指令模式。
构建具有可控复杂度的完整小程序
被修正的切片仍然只是函数体,而该函数可能调用其他函数或依赖于模块级特性,如全局变量和线性内存。于是作者将方法扩展为组装完整、可执行的小型模块。从随机选择的入口函数开始,他们反复对被调用的任意函数进行切片与修复,直到用户指定的“调用深度”为止,该深度控制保留多少层调用。超过该深度的调用会被替换为短小的替代体,模拟正确数量的参数和结果而不再引入更多代码。系统还重建了 WebAssembly 模块的周边区段——类型、表、内存等——以保证每个生成的二进制都是自包含的,可以被标准工具和运行时直接运行。

通过精心变异增加多样性
即便经过切片,许多生成的二进制仍与其父程序相似。为扩大覆盖范围,作者引入了一个从函数末端向前工作的变异阶段。对于消耗输入的指令,算法随机选择一个新的结果类型,寻找能产生该类型的替代指令,然后递归地变异为其提供输入的早期指令链,使整条链仍能配合工作。这保持了栈的正确性同时重塑了计算过程。与一组基线的真实世界 WebAssembly 程序相比,变异后的二进制包含更多不同的指令模式,并大量使用少见特性,例如向量运算,这对于全面测试 WebAssembly 引擎的实现非常重要。
实验揭示了什么
为检验其方法,作者实现了约 17,000 行 Python,覆盖了几乎完整的 WebAssembly 2.0 标准。使用一个包含数千个真实世界二进制的大型公共数据集,他们表明该技术能常规地将程序缩减到原始指令数的一小部分——在许多情况下低于最大基线大小的 40%——且在启用变异时仍能在超过 99% 的情况下保持有效。该方法运行迅速,通常针对中等大小的生成二进制每个耗时远低于一秒,并显著增加了指令类型的范围以及观察到的唯一指令序列数量。实务上,这意味着测试人员和安全研究者可以将有限的 WebAssembly 程序语料库转化为大量多样且有效的小型二进制,非常适合用于模糊测试、差异测试和对 WebAssembly 运行时的回归测试。
这如何有助于保障 WebAssembly 的安全
通俗地说,论文描述了一个智能的 WebAssembly “代码精炼器”:它将大型程序切分为许多更小且有意义的片段,自动修复使其仍遵循语言的严格规则,然后重塑它们以探索指令集的不寻常角落。由于这些小程序保持了现实感但更为紧凑,它们可以快速并大量运行,从而增加发现微妙 bug 或安全问题的机会。随着 WebAssembly 从浏览器扩展到云和设备,这种系统化生成有效且多样的测试二进制的方法,成为保持该生态健壮与安全的重要工具。
引用: Choi, G., Jeon, S. Stack-based static WebAssembly binary slicing and mutation for generating valid sub-binaries. Sci Rep 16, 10910 (2026). https://doi.org/10.1038/s41598-026-45837-y
关键词: WebAssembly 测试, 程序切片, 二进制变异, 软件安全, 运行时验证