Page 200 - 《软件学报》2025年第10期
P. 200
郑炜 等: 基于抽象语法树变异的漏洞样本生成方法 4597
31. endfor
32. endif
33. end function
34. return T'
2.3 变异算子生成
随着软件架构的变化, 攻击方式也在不断变化, 从而导致了软件漏洞发生类似 UAF → CUAF 的演化. 本节用
谓词逻辑和统计分析的技术方法, 为 UAF 和 CUAF 漏洞特征构建不同的谓词公式, 公式中的个体词代表该漏洞
产生的关键位置, 谓词代表漏洞中一个或多个关键位置所蕴含的联系, 以此来构建已有漏洞类型的谓词公式集合.
对集合中的不同个体词和谓词进行重组, 不同的组合方式蕴含了不同软件漏洞之间的演化规律, 再以新的谓词公
式集合的形式存储下来, 从而有效指示了零日漏洞的潜在特征. 例如, 在 UAF 演化生成 CUAF 漏洞过程中, 将目
标函数在多线程环境线程调用对应一个谓词公式, 映射为演化规律变异算子后对应操作为在目标函数体中增加线
程初始化语句. 根据谓词公式集合可转化得到一系列演化规律变异算子, 再结合模糊测试的变异算子得到变异算
子序列. 具体的变异算子序列如表 1 所示, 表中前 5 个变异算子为包含演化规律的变异算子, 后 4 个为传统模糊变
异测试的变异算子.
表 1 变异算子及其作用
变异算子 作用
AT (add thread and function additions) 增加线程初始化语句
LTGV (local variable to global variable) 将局部变量与全局变量转换
RJ (replace the join operations) 替换join子树
AM (add mutex operations) 增加互斥锁声明语句
AS (add signal operations) 增加并发机制的信号量
LCR (logical connector replacement) 替换逻辑连接符
ROR (relational operator replacement) 替换关系运算符
SD (statement deletion) 按序删除语句
SPS (statement position swap) 按序互换语句位置
变异算子的设计目标是基于已有漏洞引入随机变异生成新的漏洞, 这些漏洞共同组成漏洞样本集合, 其中与
原漏洞类型相同的生成漏洞样本集合被称为有效样本集合. 通过变异算子序列优化实验, 结果表明更高频次的算
子投入能够更加有效地使有效变异样本快速出现, 证明了这些算子拥有符合预期的效果.
为了确保无效样本的检测准确性, 我们在每轮次中随机抽取一定比例的样本进行详细检查, 通常检查约 30%
的变异样本, 这一比例基于前期实验和经验数据确定. 我们意识到由于人工检查的工作量较大, 确实可能存在因懒
得检查而导致无效样本比例偏小的情况. 为了减少这种情况的影响, 我们引入了以下措施: 交叉验证, 每轮次的样
本由不同的实验人员进行交叉验证, 确保样本检查的全面性和准确性; 重复检查, 对于关键轮次的样本, 进行重复
检查, 以验证初次检查结果的可靠性; 自动化辅助, 引入部分自动化脚本, 辅助人工进行样本的初步筛查, 提高检查
效率. 尽管如此, 我们承认在实际应用中, 仍可能存在少量误报和漏报的情况. 这些问题在方法有效性分析中得到
了充分考虑. 我们将继续探索和引入更自动化和智能化的验证方法, 以进一步提高变异样本检测的准确性和效率.
2.4 抽象语法树变异
本节介绍了针对给定的变异算子序列进行抽象语法树层面变异的方法. 根据变异算子对节点操作方式的不
同, 可将变异执行方式分为两类. 第 1 类变异需要修改抽象语法树中的子树结构, 包括对子树进行增删改操作, 优
先寻找语句节点以减少遍历复杂度. 共有 7 种属于此类的变异算子, 分别为 AT、LTGV、RJ、AM、AS、SD 和
SPS. 第 2 类变异不需要改变抽象语法树节点的位置结构, 只需要改变其节点值. 为此需要遍历特殊的表达式节点,
去寻找符合变异规则的节点值, 通常需要遍历到叶子节点. 共有 3 种属于此类的变异算子, 分别为 LCR、ROC 和

