Wasmati: An efficient static vulnerability scanner for WebAssembly
作者:Tiago Brito, Pedro Lopes, Nuno Santos
时间:2022.4
期刊:Computers & Security(B刊)
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.add
和store
指令,并查找是否存在判断$i边界的br_if
指令即可。
Wasmati
整个Wasmati包括CPG的生成和查询两个步骤,其中查询可以自定义,关键在于查询模式的定义。下面是作者自定义的10中pattern:
Query for UAF
上图是作者定义的UAF查询pattern,其需要满足:
- node1 调用了malloc
- node2 调用了free
- node3在node2之后调用了node1返回的指针
这里作者找到了所有可能的node2,并在最后一步排除不使用node1返回的地址的node3。