(论文阅读)Wasmati-An efficient static vulnerability scanner for WebAssembly

Wasmati: An efficient static vulnerability scanner for WebAssembly

作者:Tiago Brito, Pedro Lopes, Nuno Santos

时间:2022.4

期刊:Computers & Security(B刊)

Code:wasmati/wasmati: A Generic and Efficient Code Property Graph Infrastructure forScanning Vulnerabilities in WebAssembly Code (github.com)

ABSTRACT

本文提出了Wasmati,一种static analysis tool用于寻找Wasm binary中的漏洞。其基于code property graph(CPG)。作者给出了Wasm中CPG的定义和生成方法,自定义了快速生成CPG的算法和一个查询语言Wasmati Query Language(WQL)。作者实现了10中不同的vulnerability查询,并在四种dateset和真实程序上做了测试。

Code Property Graph(CPG)

CPG包含了AST(Abstract Syntax Tree), CFG(Control Flow Graph), DDG(Data Dependency Graph)和CG(Call Graph)四种图。CG表示函数调用图,在Wasm程序间分析方面至关重要,它是一个简单的有向图,连接调用节点和相应被调用函数的根节点。在图5中看不到它,因为我们没有分析程序间的情况,但我们会在第4节中解释其重要性。

原文提到:

“In WebAssembly, buffer overflows happen when a buffer is incorrectly used inside a loop”

在这个结论正确的前提下,做个查找buffer overflow的query需要在一个loop中查找:

  • 包含一个不断增长的local $i;
  • 包含一个使用了$i的store指令;
  • 缺乏一个判断$i边界的br_if指令。

所以可以在loop中查找是否有使用了$i的i32.addstore指令,并查找是否存在判断$i边界的br_if指令即可。

Wasmati

整个Wasmati包括CPG的生成和查询两个步骤,其中查询可以自定义,关键在于查询模式的定义。下面是作者自定义的10中pattern:

Query for UAF

上图是作者定义的UAF查询pattern,其需要满足:

  • node1 调用了malloc
  • node2 调用了free
  • node3在node2之后调用了node1返回的指针

这里作者找到了所有可能的node2,并在最后一步排除不使用node1返回的地址的node3。