Page 203 - 《软件学报》2025年第10期
P. 203
4600 软件学报 2025 年第 36 卷第 10 期
删除. 在抽象语法树中, 只需要寻找包含逻辑运算符的语句节点 CASTIfStatement, 然后替换其中的逻辑运算符节
点的值. 这个变异算子只会修改节点的值, 而不会改变节点的类型或子树结构. 替换逻辑连接符在抽象语法树中的
实现效果如图 7 所示, 将包含逻辑连接符&&表达式节点中的值进行替换后, 该节点会变成图中深色节点的样子.
CASTFunctionOefinition int
function()
CASTSimpleDeclSpecifier CASTFunctionDeclarator CASTCompoundStatement
int function()
CASTFunctionStatement CASTExpressionStatement
sem.wait() Free (data)
CASTFunctionCallExpression CASTExpressionCallExpression
sem.wait() free (data)
CASTIdExpression sem CASTName wait CASTIdExpression free CASTIdExpression data
CASTName sem CASTName free CASTName data
图 6 删除子树
CASTBinaryExpression Change to CASTBinaryExpression
b>1 && b<4 b >1 || b<4
CASTBinaryExpression CASTBinaryExpression
b>1 b<4
CASTIdExpression CASTLiteralExpression CASTIdExpression CASTLiteralExpression
b 1 b 4
CASTName b CASTName b
图 7 替换逻辑连接符
该算子适用场景: 用于替换逻辑运算符的场景, 特别是在需要改变逻辑判断条件时. 该算子主要目的: 通过替
换逻辑运算符, 改变逻辑判断条件, 增加代码的执行路径. 该算子输入内容为原始代码的 AST, 输出内容为替换逻
辑运算符后的 AST.
2.5 基于 MOPSG 算法的变异策略
本文提出了一种基于变异算子关联度引导的次序变异方法 MOPSG. 根据关联度来对不同变异算子的执行频
率进行选择, 其中初始关联度由变异算子的权重经过归一化得出. 该方法核心是根据每个变异算子权重动态调整
变异算子执行次数和顺序, 找到最佳的变异算子执行次序后进行抽象语法树级别的变异, 从而针对某一漏洞模式
推断出其漏洞演化路径, 满足在产生尽可能少的样本量的情况下涵盖漏洞样本. 变异算子执行次数的优化函数如
公式 (1) 所示.
∑
i=I
x i = X
i=1 (1)
∑ i=I
F(X) = P i × x i
i=1
其中, X 为变异算子被执行总次数, 为变异算子序列中算子的总数, 每种变异算子可以用序号 进行标注, x i 为第
i
I
i 种变异算子被执行的次数, P i 为第 种变异算子的变异关联度, F (X) 为优化判断值.
i
使用 CUAF 漏洞的代码切片和全排列删除其中 1–n 阶语句的回溯代码作为样本. 对这些样本进行变异, 每次
变异都记录所有算子的执行情况, 根据上一次变异计算判断值, 改变算子执行次数以优化至较大值. 值得一提的

