Page 209 - 《软件学报》2025年第10期
P. 209
4606 软件学报 2025 年第 36 卷第 10 期
变异体的生成, 以应对可能出现的更复杂的 CUAF 漏洞. 当这些变异算子所涉及的范围不再局限于同一漏洞模式
时, 由于算子数量增加, 每轮执行后差异化并不会太大, 可能会出现变异算子的权重经过归一化后转化的概率差距
不大. 这一点 MOPSG 算法是可以解决的. 在本实验阶段由于代码规模受到计算机性能的限制而被约束, 所以限制
了该算法在推断演化路径时初始的算子执行次数, 当规模扩大, 对每个算子的执行次数将改动, 以适应对应的代码
规模. MOPSG 算法配合随机子树执行的启发式算法, 将可以约束变异样本数量的完成基于权重的变异执行. 本实
验最终运用于实际变异过程时并不会对所有变异算子的执行顺序和次数直接固定, 而是以最终的权重来对不同的
变异策略的执行频率和构造的变异样本的多样性做抉择.
模糊测试中的变异算子粒度很小, 变异算子基本都是在字节级别对测试用例进行变异. 变异测试则是在代码
语句级别进行修改来验证测试集的完备性, 其本质就是模拟程序员在编程过程中因某些细微错误引发的漏洞. 因
此, 横向对比的是在代码语句级别进行的全随机变异过程.
3.2 变异策略实验
3.2.1 实验数据
本节数据用于比较变异算子序列在抽象语法树级别和在代码语句级别执行时的效率差异, 以及变异策略优化
算法优化前后的变异数量对比. 本文选取了 GitHub 中开源的 Linux 内核中, 涉及 CUAF 同源漏洞和多线程竞争相
关漏洞的错误提交报告, 从 150 多个包含重复提交的记录中筛选出 25 个用于实验, 以及 CWE 漏洞库中的 10 个
CUAF 漏洞代码片段. 本文筛选漏洞的标准是参考开源漏洞在时间线上两个版本 (即修改前后) 的漏洞语句位置跨
度, 以及漏洞位置附近代码的线程复杂度. Linux 内核中大部分漏洞代码都处于多线程环境, 尤其是涉及接口函数
的. 本文选择跨度不超过 1 000 行的接口漏洞进行分析, 这类漏洞具有真实危害性和广泛影响; 同时将代码片段限
制在 50 行以内, 这样不容易导致变异数量过大而无法进行比较.
3.2.2 变异策略有效性实验分析
为了探究在实际代码中基于变异算子优先级调度的变异策略的有效性, 通过对 Linux 内核中关于 CUAF 漏洞
的修改代码的前后两个版本进行变异. 通过在 GitHub 中搜索“concurrent use after free”和“concurrent-use-after-free”
等关键字, 找到一些规模合适的, 且触发漏洞语句在代码切片中跨度不大于 50 行的代码切片共 25 个. 对这些代码
切片进行分析, 它们大多数是针对驱动程序的提交, 在研究日志消息和代码修复以确认报告的漏洞是否为 CUAF
后, 筛选出 10 段代码切片作为对比实验的样本.
接着将把漏洞修复版本的代码切片转化为抽象语法树数据结构并依据上文得到的变异策略进行变异执行. 同
时按照变异测试的逻辑对同样的代码切片进行语句级别的变异, 该变异过程对于变异算子的抉择是全随机的. 实
时地对变异样本进行核对, 当首次出现 CUAF 漏洞的变异样本后, 统计无效样本总量, 同时设置变异样本阈值为
200 万以强行终止其核对过程, 达到该阈值视为无法有效地获取有效样本 (并非不含有有效样本, 只是没有在一定
数量限制内找到目标样本, 证明此变异过程的效率已经低于可与本文变异方法比较的最低值). 后文图 10 展示了
对同一代码切片进行两种变异方式的无效样本占比, 比例达到 1.00 表明阈值比例达到前没有找到目标样本.
图 10 中橙红色柱状为使用变异策略执行变异结果, 蓝色柱状为随机变异测试结果. 从图中可知, 除了在限制
变异轮次内达到阈值而没有出结果的变异过程外, 基于本文变异策略执行的变异过程要比模糊变异测试中全随机
的变异方式平均要少产生 34% 的无效变异样本. 虽然样本数量有限, 但是根据耦合效应假设以及相关推论, 我们
认为更复杂的缺陷是在原有程序上依次执行多次单一语法修改形成的. 因此小规模的验证可以反映该算法在演化
形成某一同源漏洞家族的变异样本时具有一定的优势, 能高效地生成用于训练零日漏洞检测模型的漏洞样本数据.
3.2.3 变异策略优化算法有效性实验分析
本节测试所涉及的启发式算法主要是部分子树截断算法. 由于当前针对 CUAF 漏洞模式的变异算子种类少,
且前文在变异过程中已经对该实验的固定变异算子顺序进行了测试, 所以对增加线程变异算子进行固定, 可以较
容易地达到降低无效样本的产生的效果. 本部分以是否使用部分子树截断算法对样本变异结果产生的影响做对
比. 其中, 用于实验的数据来自 Linux 内核中关于 CUAF 漏洞的修改代码 15 段与 CWE 中 10 个关于 CUAF 漏洞
的公开代码段.

