Page 316 - 《软件学报》2025年第8期
P. 316

袁斌 等: 基于有限状态机引导的网络协议模糊测试方法                                                      3739


                 盖率也呈现出优势, 除了在        MatrixSSL  实验对比中以   23%  的差距稍落后外, 在其他实现中均占领先地位. 整体而
                 言, SNETFuzzer 在当前输入覆盖率方面比        AFLNET  提高了  76%, 而在总体语料库覆盖率方面则高出了            29%. 在探
                 索有趣路径的能力指标上, SNETFuzzer 同样表现出色, 其平均表现比                   AFLNET  高出  53%. 在边覆盖数方面,
                 SNETFuzzer 平均超过  AFLNET 51%. 特别是在    OpenSSL  上, SNETFuzzer 不仅在程序覆盖率上大幅领先, 同时在
                 其他各类性能指标上也呈现出显著的领先优势.
                    在辅助指标路径深度, SNETFuzzer 在       OpenSSL、GnuTLS、MatrixSSL  的路径深度好过      AFLNET, AFLNET
                 则在另外两个     TLS  实现当中领先; 类似的, SNETFuzzer 在      OpenSSL、GnuTLS、WolfSSL   的路径稳定度好过
                 AFLNET, AFLNET  则在另外两个    TLS  实现当中领先. 这证明      SNETFuzzer 虽然在程序覆盖率上领先, 但是不能证
                 明  SNETFuzzer 的模糊测试种子从引导方式中获得了比            AFLNET  更多的收益.

                                 25
                                                    当前输入覆盖率      语料库总覆盖率
                                 20
                               程序覆盖率 (%)  15


                                 10
                                 5

                                 0
                                   SNETFuzzer AFLNET  SNETFuzzer  AFLNET  SNETFuzzer  AFLNET  SNETFuzzer  AFLNET  SNETFuzzer  AFLNET
                                       OpenSSL    GnuTLS     MatrixSSL   WolfSSL    MbedTLS
                                               图 11 不同方法的程序覆盖率对比

                 4.4   实验数据分析
                    实验结果表明, 在大部分实验环境中, SNETFuzzer 比现有的主流协议模糊测试工具                     AFLNET  更为出色, 在多
                 个重要指标上都取得了不错的成绩. 尤其是在能反映代码覆盖率的指标中, 如语料库总覆盖率、有趣路径和边覆
                 盖数等, 均高于目前主流的工作.
                    表  5  展示了  SNETFuzzer 与  AFLNET  在  OpenSSL  实验当中的部分数据对比. 在       OpenSSL 1.0.1b  版中,
                 SNETFuzzer 在完成有限状态机学习后, 发现了其中存在的                12  个不同状态和    108  个状态转移. 基于这些发现,
                 SNETFuzzer 生成了初始种子集合, 用以映射这些状态转换, 在模糊测试阶段, 它进一步识别了                        3  个新增状态和   7
                 个状态转移. 相比之下, AFLNET      默认配置下的初始种子反映了正确握手过程中的                  6  个不同状态和   5  个状态转移,
                 在随后的模糊测试阶段, 它额外发现了            6  个状态和   10  个状态转移. 尽管   AFLNET  在模糊测试过程中识别出了比
                 SNETFuzzer 更多的状态和状态转移, 但鉴于         SNETFuzzer 已经通过预先的有限状态机学习步骤发掘了众多状态
                 和转移, 因此   SNETFuzzer 在模糊测试中相较于        AFLNET  在反映代码覆盖率的多个关键指标上领先. 综上所述,
                 SNETFuzzer 一共识别了   15  个状态和  115  次状态转移, 而   AFLNET  在默认设定下则仅发现        12  个状态和  15  次状
                 态转移, 这些显著的差异同样体现在代码覆盖率的相关指标上.


                                  表 5 SNETFuzzer 与  AFLNET  在  OpenSSL  实验当中的部分数据对比

                       方法          初始的状态/状态转移数            新发现的状态/状态转移数             共发现的状态/状态转移数
                    SNETFuzzer           12/108                   3/7                     15/115
                     AFLNET               6/5                     6/10                    12/15

                    SNETFuzzer 比  AFLNET  多发现了  3  个状态和  100  个状态转移. 从有限状态机的角度来看, 这意味着在模糊
                 测试中, SNETFuzzer 实际上呈现了比       AFLNET  多出了  3  个状态节点和    100  条状态转移的边. 这些额外的状态和
                 状态转移可能代表了更多的函数调用、更多的条件判断或者更多的变量赋值等. AFLNET                           虽然同样能够识别和追
                 踪网络协议的状态变化, 但是其在不依赖协议字母表的前提下, 所发送的数据包随机性很强, 探索新状态更为随机
   311   312   313   314   315   316   317   318   319   320   321