Page 36 - 《软件学报》2025年第7期
P. 36

欧先飞 等: 语义可感知的灰盒编译器模糊测试                                                          2957


                 的变异操作符, 其测试修复的工作量远低于我们的                   72  个操作符. 如果投入更多的测试运行时间, 我们相信
                 SemaAFL  的可编译程序比例可以比肩甚至超越            GrayC. 此外, AFL++仅能维持约    4%  的可编译程序比例, 这是由于
                 字符级别变异对程序结构的不可知性. 在表              4  中, 输出程序数量与变异次数正相关, 同时会受崩溃次数、havoc 机
                 制的影响, 在这里不存在严格的等式关系.

                                             表 4 输出程序和可编译程序吞吐量对比

                                工具           输出程序数量           可编译程序数量            可编译比例 (%)
                              SemaAFL         1 717 460          1 332 405           77.58
                               AFL++          2 772 711          110 353             3.98
                               GrayC           716 227           708 562             98.92

                 4.2.2    可靠性对比
                    在可靠性方面, 由于      AFL++的字符级别变异操作符实现逻辑非常简单, 易于人工验证. 如表                     5  所示, 在整个  5
                 次  24 h  的对比实验中, 我们未曾观测到      AFL++的崩溃发生. 而相较而言, SemaAFL       平均在每    24 h  的时间段内仅发
                 生了  4 821 次崩溃, 这一崩溃频率仅有      GrayC  的约  1/80. 同时由于我们采用了进程隔离, 这些崩溃没有对            SemaAFL
                 的模糊测试进程产生任何影响. 平均到每个崩溃而言, SemaAFL                 发生一个崩溃需要耗费近         20 s 的时间, 而  GrayC
                 仅需要   0.22 s. 这里需要额外说明的是, 由于      GrayC  在实施变异前需要先将输入文件复制到输出文件, 然后再在输
                 出文件上进行原地变异, 因此即使发生崩溃, 也至少能保留输出文件, 这也是表                       3  中  GrayC  有高达  83%  的输出与
                 输入相同的原因.

                                                  表 5 崩溃发生的频率对比

                               工具          总崩溃次数          每小时崩溃次数         平均每个崩溃发生的时间 (s)
                             SemaAFL         4 821            200                 17.92
                              AFL++            0               0                   -
                              GrayC         379 805          15 825               0.22

                 4.3   测试能力横向对比
                    图  5 展示了 SemaAFL、GrayC 和 AFL++ 在 GCC-14 和 Clang-18 上的平均覆盖率趋势. 总体而言, SemaAFL
                 在 GCC 和 Clang 上比  GrayC 和 AFL++ 的最佳结果提高了      14.5% 和 11.2%. 而  GrayC  仅通过  5  个精心设计的语
                 义级别的变异操作符, 便在 GCC 和 Clang 上的表现优于 AFL++. 这些结果表明, SemaAFL              在探索编译器的不同行
                 为上较   GrayC  和  AFL++具有显著优势.

                         350                                    350

                        Covered brances (k)  300               Covered brances (k)  300

                                                                250
                         250

                                                    AFL++
                         200
                                                    GrayC       200                         AFL++
                                                                                            GrayC
                                                    SemaAFL                                 SemaAFL
                         150                                    150
                            0      6      12      18     24         0      6      12      18     24
                                         时间 (h)                                 时间 (h)
                                        (a) GCC-14                             (b) Clang-18
                                   图 5 GCC-14 和 Clang-18 的各个测试工具在     24 h  内的覆盖率趋势

                    SemaAFL 的出色表现归因于其高效的语义级别的变异策略, 这使得它能够更深入地探索代码路径, 发现更多
                 的边界情况和潜在的漏洞. 此外, GrayC 虽然没有 SemaAFL 表现出色, 其利用少量但高效的可感知语法的变异操
   31   32   33   34   35   36   37   38   39   40   41