Page 211 - 《软件学报》2025年第10期
P. 211
4608 软件学报 2025 年第 36 卷第 10 期
突变的时间). 即使我们从中排除了在作为基线的随机突变方法中超过时间的片段, 平均时间也超过了 4.6 h. 然而,
不能直接就执行时间来衡量这种方法与基线的效率, 因为其算法中涉及的突变操作符的优化本身就消耗了一定的
时间.
表 4 展示了 Linux 内核实际代码切片经过部分子树截断算法与不经过该算法直接变异的对比结果. 由于内核
实际代码跨度较长, 在做代码片段切分时, 可能会有部分对 free 操作进行调用的函数或语句被排除. 值得一提的
是, 我们依然保留了变异样本阈值为 100 万以强行终止其核对过程这一机制. 我们根据每段代码切片中是否包含
完整的 free 操作流程进行分类. 表中数据可以展示部分子树截断算法在针对 CUAF 漏洞演化过程中对 free 操作
的截断是有明显成效的. 在包含完整的 free 操作流的切片中, 经过部分子树截断启发式算法的变异平均会减少
33.1% 无效样本. 在对缺失部分 free 操作的代码切片进行对比实验时, 是否启用部分子树截断算法对降低无效样
本量的提升幅度较小, 但是平均也有 9.5% 的提升.
表 4 Linux 内核代码两种变异结果对比
Component Contains free No execute Execute
usb Contains 524 287 292 143
btrfs Contains 211 423 136 927
btrfs1 Contains 65 535 32 767
mlxsw Contains 23 427 21 332
netdevsim Contains 948 575 700 786
X86resctrl Contains 16 383 14 335
usbnet Contains 262 143 150 174
smackfs Contains 131 071 98 303
rpmsg Contains 154 306 116 356
isdnhisax Not fully contains 15 269 14 644
net Not fully contains 32 767 34 180
netsocket Not fully contains 15 981 14 802
ruc Not fully contains 262 016 206 278
cw1200 Not fully contains 445 790 423 514
Ip4 Not fully contains 32 767 34 478
在目前的漏洞代码生成研究中, Nong 等人 [40] 提出了一种基于神经网络的代码编辑技术, 可以生成逼真的漏洞
代码. 首先通过分析现有的漏洞数据集, 发现漏洞代码具有一些常见的结构模式, 例如条件语句、循环语句等. 作
者使用神经网络对这些结构模式进行建模, 并提出了一种代码编辑器, 可以在保留代码语法正确性的同时, 改变代
码的结构和行为, 但是生成新的漏洞代码数量较少, 且只关注了特定的漏洞类型. Nong 等人 [41] 还提出了一个新的
漏洞生成方法, 该方法可以利用现有的漏洞数据库来学习漏洞的模式, 并生成与这些模式相似的漏洞. 该方法使用
了深度学习模型来对漏洞模式进行建模, 并使用生成模型来生成新的漏洞, 这些漏洞具有与真实漏洞相似的特征
和语法结构. 但是该方法依赖于已知的漏洞数据库, 因此对于那些没有被记录在数据库中的新型漏洞, 该方法可能
无法生成相应的漏洞.
通过上述实验数据对比分析, 在进行小规模的实际代码进行变异后, 本文提出基于抽象语法树变异的漏洞样
本生成技术, 非常有效地改善了变异算子特征不明显、执行随机性过强和变异样本高耦合性等问题, 且不过分依
赖漏洞数据库. 本文对根据 CUAF 演化规律总结的变异算子和变异测试中针对多线程代码的变异算子进行了处
理. 通过获取的变异算子权重执行各个算子, 在 Linux 内核的多段针对 CUAF 修改的代码上进行变异执行都取得
了不错的拟合效果. 相较于变异测试中对代码的随机变异过程, 本方法更容易构造出接近真实漏洞的变异样本, 并
且相对代价更低.
3.2.4 不足与有效性讨论
下面讨论本文方法在 3 个方面有效性上的可改进点.
外部有效性主要涉及研究发现的普遍性问题. 本研究集中于 Linux 内核代码的静态模糊变异和相关的公开漏
洞数据集. 但不同的编程语言有其特有的漏洞家族和演变模式, 因此本研究的结论可能不适用于其他编程语言,

