[论文解读] Modular Abstract Definitional Interpreters for WebAssembly
本文研究了将C程序编译为x86和WebAssembly时的安全差异,发现4,469个存在漏洞的C程序中有24%因WebAssembly中缺少栈溢出保护(stack canaries)而导致执行结果不同。研究表明,编译器提供的保护机制(如栈溢出保护)在WebAssembly中并未一致应用,从而可能使缓冲区溢出攻击得以成功,而这些攻击在原生代码中本应被阻止。
Even though static analyses can improve performance and secure programs against vulnerabilities, no static whole-program analyses exist for WebAssembly (Wasm) to date. Part of the reason is that Wasm has many complex language concerns, and it is not obvious how to adopt existing analysis frameworks for these features. This paper explores how abstract definitional interpretation can be used to develop sophisticated analyses for Wasm and other complex languages efficiently. In particular, we show that the semantics of Wasm can be decomposed into 19 language-independent components that abstract different aspects of Wasm. We have written a highly configurable definitional interpreter for full Wasm 1.0 in 1628 LOC against these components. Analysis developers can instantiate this interpreter with different value and effect abstractions to obtain abstract definitional interpreters that compute inter-procedural control and data-flow information. This way, we develop the first whole-program dead code, constant propagation, and taint analyses for Wasm, each in less than 210 LOC. We evaluate our analyses on 1458 Wasm binaries collected by others in the wild. Our implementation is based on a novel framework for definitional abstract interpretation in Scala that eliminates scalability issues of prior work.
研究动机与目标
- 评估C程序的安全属性(特别是缓冲区溢出保护)在编译为WebAssembly时是否得以保留。
- 调查现有编译器保护机制(如栈溢出保护)是否在WebAssembly二进制文件中缺失,相较于原生x86代码。
- 识别并分析WebAssembly与原生代码之间可能导致生产环境中安全风险的执行差异。
- 为未来关于跨编译安全的研究提供1,088个存在差异的程序数据集。
- 鼓励对WebAssembly编译中超出缓冲区溢出的更广泛安全差异展开研究。
提出的方法
- 使用Clang和Emscripten工具链,将4,469个已知存在缓冲区溢出的C程序分别编译为x86和WebAssembly。
- 在Linux系统上使用Wasmer运行时,在相同条件下执行x86和WebAssembly二进制文件。
- 通过比较程序行为(特别是缓冲区溢出时是否发生崩溃)来识别执行差异。
- 对存在差异的二进制文件进行手动逆向工程,分析生成代码的差异,重点关注栈溢出保护机制的缺失。
- 评估编译器优化级别(如-O1)对差异存在与否的影响,注意到优化级别可能影响保护机制是否被生成。
- 公开发布1,088个存在差异的程序数据集,包含对应的x86和WebAssembly二进制文件,以支持可复现性和进一步分析。
实验结果
研究问题
- RQ1当已知存在缓冲区溢出的C程序被编译为WebAssembly与x86时,其执行结果是否不同?
- RQ2在存在漏洞的C程序中,WebAssembly与原生代码之间执行差异的根本原因是什么?
- RQ3编译器安全机制(如栈溢出保护)在WebAssembly与原生代码后端之间有多大差异?
- RQ4编译器优化和代码变体如何影响WebAssembly二进制文件中安全保护机制的存在或缺失?
- RQ5在编译为WebAssembly时,是否存在超出缓冲区溢出的更广泛安全差异?
主要发现
- 在4,469个存在漏洞的C程序中,有24%在x86和WebAssembly二进制文件之间表现出执行结果的差异。
- 差异的根本原因是WebAssembly二进制文件中始终缺少栈溢出保护机制,而x86二进制文件中则存在。
- x86二进制文件在发生基于栈的缓冲区溢出时会崩溃,而WebAssembly二进制文件则继续执行,表明缺乏运行时保护。
- WebAssembly中缺少栈溢出保护并非由于WebAssembly规范本身存在缺陷,而是编译器后端实现的选择所致。
- 编译器优化级别(如-O1)会影响安全保护机制是否被生成,从而影响差异的存在与否。
- 包含1,088个存在差异程序的公开数据集(含x86和WebAssembly二进制文件)可供未来研究使用。
更好的研究,从现在开始
从论文设计到论文写作,大幅缩短您的研究时间。
无需绑定信用卡
本解读由 AI 生成,并经人工编辑审核。