0%

WRTester

Cao S, He N, She X, et al. WRTester: Differential Testing of WebAssembly Runtimes via Semantic-aware Binary Generation[J]. arXiv preprint arXiv:2312.10456, 2023.

摘要

现有的测试框架受到测试用例质量的限制,即它们在生成语义丰富和语法正确的Wasm二进制文件方面面临挑战,因此无法触发复杂的错误。对真实世界Wasm二进制文件的反汇编和汇编来生成复杂的Wasm测试用例,从而触发Wasm运行时之间的隐藏不一致性。为了进一步确定意外行为的根本原因,我们设计了一种与运行时无关的根本原因定位方法,可以准确地定位错误。广泛的评估表明,WRTester在效率和效果方面优于现有技术。

在流行的Wasm运行时中发现了33个漏洞,其中25个已经得到确认。

Introduction

尽管最近的自动化测试方法通过Wasm二进制生成在识别Wasm运行时错误方面取得了有希望的结果,但它们受到无法生成语义丰富二进制文件的限制,因此无法触发复杂的错误。

例如,WADIFF只能测试单个指令级别的实现错误,因为它无法生成具有大量指令的测试用例,而真实世界的Wasm二进制文件实际上要复杂得多。具体而言,Wasm中存在超过430种指令和13种具有不同功能的部分类型,这表明Wasm是一种具有丰富语义的字节码格式。为了进行全面的测试,确保生成的Wasm二进制文件尽可能涵盖多样的语义是至关重要和必要的。

此外,不可能任意生成Wasm二进制文件,因为每个Wasm二进制文件在执行之前都应该经过语法正确性验证,包括堆栈平衡验证等,这确保了生成的Wasm二进制文件应该是符合语法的。

主要工作:从真实世界的Wasm二进制文件中提取基本元素,并将它们随机组装成具有有效语法和丰富语义的Wasm二进制文件的算法。

NeoDiff是随机在已有字节码后拼接、翻转比特、插入字节或进行特殊操作

image-20240113223841937

不一致性根本原因定位

不能简单将不一致性认为是bug(不同runtime对异常处理、支持SIMD、类型的实现有区别)

定义wasm二进制在生命周期内的不一致性行为

image-20240829185003634

  • 编译失败
  • 运行时失败:抛出异常
  • 非预期输出:majority

提出了一种运行时无关的二进制插桩方法进行根本原因定位

函数级别定位

针对编译失败和运行时失败

静态二进制插桩 执行call前后进行插桩,记录调用参数和返回值

指令级别定位

如果错误类型是output不同,进行指令级插桩

打印opcode和value

错误定位依然是定位到被执行文件的级别,我们期望定位到寻找到被测程序源代码

指令级定位

我们参考eip 进行了运行时插桩,不需要插桩