Page 210 - 《软件学报》2025年第10期
P. 210

郑炜 等: 基于抽象语法树变异的漏洞样本生成方法                                                        4607



                                       1.00                               1.00
                          1.0                                                       优化算法变异执行
                                                                                    随机变异执行
                          0.9                                                    0.88
                                0.83                 0.74
                          目标样本出现时的无效样本比例  0.7  0.39  0.61  0.67    0.47        0.46     0.61
                          0.8
                          0.6
                          0.5

                          0.4
                          0.3
                          0.2  0.34                       0.31 0.19  0.22  0.19       0.29  0.24 0.33
                                            0.15
                          0.1
                               usb   mlxsw  btrfs  resctrl  netsocket netdevsim  Btrfs1  net  ruc  isdnhisax
                                              图 10 两种变异方式的无效样本占比

                    基准数据为这两个来源的代码直接使用算法                2  所得的权重来执行的结果, 执行结果会展示每一组代码切片在
                 检测到对应目标漏洞样本切片首次出现时的累计样本量. 选择用样本数量来作为基准是因为不同代码切片数量差
                 异较大, 且部分切片并不受到子树截断算法的影响. 算法                 2  在得到变异算子序列的最终权重后, 依然是随机选择算
                 子来执行, 所以即使重复执行两次也可能会得到不同的结果.
                    对比数据为子树截断算法介入变异执行过程后的结果. 截断算法会根据抽象语法树中的相关节点                                  Id  和节点
                 值进行匹配. 一旦在变异过程中出现新的样本不含有关键词, 则会标注该文件以终止其后续更高阶的变异.
                    图  11  所示  CWE  中  10  个关于  CUAF  漏洞代码经过部分子树截断算法与不经过该算法直接变异的对比结果.

                 CWE  漏洞代码切片较为简洁, 其中函数调用关系清晰且均含有                  free 操作相关函数与函数调用语句. 因此, 在         CWE
                 代码集上进行同样的实验时, 对照数据与基准数据对比明显. 在                    CWE  中  10  个关于  CUAF  漏洞代码切片中, 经过
                 部分子树截断启发式算法的变异平均会减少               30.1%  无效样本.


                            ×10 4
                           9                                                           不执行算法
                                                                                       执行剪裁算法
                           8
                                          74 986  63 494  62 222  60 577  65 006  72 577  67 305  68 343
                           是否执行剪裁算法时样本规模  6 57 565  53 353  55 076  45 320  37 559  49 631  40 949  44 685  54 155  43 354
                           7
                                   63 330

                           5
                           4
                               34 289

                           2 3

                           1
                            102291bad 240373bad 240387bad  240266bad 240398bad 240347bad 240357bad 240277bad 240291bad 240306bad
                                           图 11 CWE  漏洞代码两种变异方式结果对比

                    实验的时间取决于代码片段与漏洞语句的行数之间的跨度. 因此, 排除比较时间后, 完成所有样本突变的平均
                 时间为   3.2 h. 与此同时, 作为基线的突变方法的平均完成时间为              4.9 h (这包括了对超过阈值的代码片段强制结束
   205   206   207   208   209   210   211   212   213   214   215