Page 206 - 《软件学报》2025年第10期
P. 206
郑炜 等: 基于抽象语法树变异的漏洞样本生成方法 4603
1. while T .node is not null do
2. if Node.id = CASTFunctionCallExpression and Node.valuecontainsfree then
3. freeNodeList.add(Node)
4. end if
5. end while
6. if freeNodeList is null then
7. t i ← T.mutationOperator; T' ← t i
8. return T'
9. else
10. t i ← T.mutationOperator
11. if t i is not contains freeNodeList.nodes then
12. currentMutation.End
13. T' ← t i
14. return T'
15. end if
16. end if
例如, UAF 和 CUAF 漏洞是在错误的时机对已经释放的内存进行了访问. 漏洞代码中可以看出 free 操作是该
漏洞的重要特征之一, 但并不是所有的 UAF 漏洞代码都包含 free, 可以作为一个参考. 在抽象语法树层面执行变
异算子序列变异之前, 会将源代码转化为抽象语法树, 在算法 3 中, 遍历抽象语法树寻找 free 操作, 如果存在 free
操作, 那么在每一次执行抽象语法树变异之前都去遍历寻找包含 free 的子树. 如果一个变体在变异过程中丢失了
free 关键字所对应分支, 就把接下来的对变异体的变异停止.
3 实验分析
所有实验都在一个服务器上进行, 该服务器配备有 Intel(R) Xeon(R) Silver 4 110 CPU 和 64 GB RAM.
3.1 变异算子序列优化实验
3.1.1 实验数据
部分是用于优化变异算子序列, 推断演化路径的数据, 该数据来源于 CVE (common vulnerabilities &
exposures) 开源漏洞库中与 UAF 相关的 30 段代码切片. 本文根据切片跨度、对漏洞特征植入的便捷性和 UAF 代
码 use 与 free 形成的相关性等方面筛选了 10 段进行后续操作, 最终本文基于机器处理大数据量的时间和存储效
率的考虑, 选择了 5 段切片进行漏洞植入. 筛选过程如表 2 所示. 值得强调的是, 该筛选过程的最终评价指标是综
合 3 个特征后选择的性价比最高的代码切片, 因为它们可以在尽可能少的代码语句中跨函数植入更多的 CUAF
漏洞特征. 这也正是漏洞形成的一大原因, 即由于改进代码性能 (将单线程代码改为多线程) 时误触发的漏洞. 这
样含有大量 CUAF 漏洞特征语句的 UAF 漏洞代码切片一旦实现多线程化, 有极大风险会直接触发 CUAF 漏洞,
但是漏洞是否会对程序本身造成危害是待定的.
表 2 CVE 代码切片
代码切片序号 切片跨度 (行) 漏洞特征植入数量 use与free关系
CVE-2018-21008 43 4 多函数
CVE-2019-15917 16 3 单函数
CVE-2019-20934 31 3 多函数
CVE-2020-27835 32 4 单函数
CVE-2021-33034 33 3 多函数

