0%

TOSEM23

Yixuan Zhang, Shangtong Cao, Haoyu Wang, Zhenpeng Chen, Xiapu Luo, Dongliang Mu, Yun Ma, Gang Huang, and Xuanzhe Liu. 2023. Characterizing and Detecting WebAssembly Runtime Bugs. ACM Trans. Softw. Eng. Methodol. Just Accepted (September 2023). https://doi.org/10.1145/3624743

Introduction

首先收集了903个github上wasm bug相关的post,确认了311个真实的bug。基于数据,总结了31类wasm运行时的漏洞并且总结了共同的修复策略。设计了基于pattern的漏洞检测框架来自动检测Wasm中的bug。采用该漏洞检测框架测试了7个WASM运行时,发现了60个漏洞。

研究对象

  • wasmtime
  • wasmer
  • WAMR

贡献

  • 第一篇对Wasm运行时漏洞的系统研究,总结了漏洞的种类和对应的修复措施
  • 开发了基于模式的漏洞检测框架,对真实世界的wasm运行时进行了检测,能够发现错误
  • 脚本 数据集和漏洞检测工具已经开源(https://github.com/bnmcxlzd/TOSEM2023_Complementary_materials)

Background

wasm binary

wasm是一种底层的类似汇编的语言,设计目标是高效处理和紧凑表示。对应的二进制文件是.wasm。

Wasm标准定义了概念性的堆栈虚拟机,用于执行pop和push,并将结果留在堆栈上。

wat format

.wat 是为开发者提供的漂亮的印刷文本格式,能够用于理解语义和wasm模块、进行测试、调试和优化等等。开发者可以使用wabt工具将wasm binary转换成文本格式

模块module是wasm代码的基本单元,表现为扁平树的形式;本地变量强类型

image-20231128201211895

exec

Frontend compiler(AssemblyScript, Emscripten, Rustc/WASM-Bindgen)能够把高级语言编译为wasm bin,WASM被设计为高级编程语言的可移植编译目标,能够以接近本地执行的速度在多个平台上执行。wasm runtime是硬件和wasm bin之间的中间层

image-20231128201749638

wasm runtime architecture

image-20231128201825541

后端编译器:支持提前编译Ahead-of-time compilation (AOT)和传统的即时编译Just-in-Time compilation

解释器:交互式执行

运行时环境:负责内存分配,栈的操作,报错

API:运行wasm运行时被嵌入到高级语言中作为库来使用

系统接口:支持类似操作系统的功能

STUDY DESIGN

研究问题

image-20231129102622855

漏洞分类的根本原因;是否存在普遍的修复策略;提出的分类方法对漏洞检测的有效性

数据收集

如何说明实验对象的代表性:

  • LOC
  • star
  • 支持的编译模式多
  • 不同的编程语言实现

数据来源

  • github issue
    • 从github issue中提取有bug label的issue,最终304个wasmer的issues,167个wasmtime的issues和333个WAMR的issues(未label,全选)
  • Stack Overlow
    • Stack Overlow问题有标签,可根据标签爬取对应的post
    • image-20231129103818825

数据集的refine

  • 筛去了没有确定性回答的issue和post

  • 手工去除了install和build相关的错误,文档错误,用户误用等和wasm运行时无关的bug

结果就是只剩下311个issue,SO全部没了(解释是可能github上wasm专家比较少)

image-20231129104347208

标记漏洞和修复策略

  • pilot labelling 首先随机选了50%的post,论文前两位作者共同分析,进行分类
  • 可靠性分析:根据之前的分类,两位作者独立标记剩下的40%的post验证之前对漏洞分类的正确性,采用Cohen’s kappa系数;对于出现的分歧与intercessor进行了讨论,新增了2类漏洞和3类修复措施;
  • 对于剩下的10%,两位作者独立进行了分类,没有发现新的漏洞种类和修复措施,证明了分类的饱和 saturation

RQ1: TAXONOMY OF WASM RUNTIME BUGS

根据wasm的架构分析了漏洞种类

image-20231129110601087

后端编译部分负责将bin编译为本地机器码,需要OS和CPU的支持,占总共bug的38.3%

RQ3:PATTERN-BASED BUG DETECTOR FOR WASM RUNTIMES

Bug detectors for Backend Compilation

No interest

Bug detectors for WASI Robustness

  • 文件操作错误:测试是否能重命名文件、是否能判断文件不存在、是否能移动文件、计数目录下的文件
  • import错误:不支持多个wasi的版本
  • 输入输出流错误:用c++写程序编译为wasm bin再检查值和类型是否正确
  • OS错误:时间的API不一样,利用QuickJS进行测试

Bug detectors for Runtime environment

  • module实例化错误:检查是否支持实例化 空 的wasm模块,短时间内大量实例化是否会内存泄漏
  • module导入错误:部分runtime省略了检查导入对象序号的步骤

  • Calling host functions:调用函数对象是否正确

  • memory issue:检查内存的增长是否是线性的

  • trap error:设计了带有不可达指令的module来测试运行时是否能正常跳出执行并且报告不可达代码的位置
  • 入口错误:wasm运行时可能会不允许入口函数或拒绝没有入口函数的module
  • 未处理异常