Page 314 - 《软件学报》2025年第8期
P. 314
袁斌 等: 基于有限状态机引导的网络协议模糊测试方法 3737
异方式 havoc. havoc 拥有更大程度的随机性, 会在输入的随机位置插入和删除字节, 也对进行大范围字节替换. 它
会融合位反转、随即字节插入和删除、模糊字节、数值替换、重组数据块等多种变异方式, 进行更加激进的模糊
测试.
在模糊测试过程中, 通过变异操作常常能够进入新的状态. 这些新状态可能是冗余状态、导致程序挂起或崩
溃等异常情况 (如图 10), 并且通常伴随对未曾探索过的代码的覆盖. SNETFuzzer 将这些能够探索到新状态的输入
视为具有较大潜在价值的, 因为它们有可能揭示系统的潜在漏洞或异常行为. 因此, 在模糊测试的过程中, 针对这
些能够触发新状态的输入, 则会为其分配更多的能量, 以促进 SNETFuzzer 更深入地探索系统的状态空间, 提高漏
洞发现的可能性. 通过识别并重点关注导致状态变化的输入, 模糊测试可以更有针对性地探索被测系统的状态空
间, 提高对潜在漏洞的发现概率.
9
随机变异的数据包
ClientHelloRSA
ServerHello/Certifi- ClientKeyExchange ChangeCipherSpec Finished AppData
cate/ServerHelloDone Empty Empty ChangeCipher- AppData/ConnectionClosed
Spec/Finished
0 1 3 4 5 2
图 10 模糊测试中触发了一个新状态
在网络协议模糊测试领域, 通常采用实际通信中的数据包作为种子, 以确保模糊测试程序能够正确理解协议
数据包的结构. 这一做法的重要性在于, 大多数协议实现会对数据包的关键字段进行严格检查. 如果数据包中存在
非法内容, 协议实现通常会直接丢弃该数据包, 导致模糊测试失效. 此外, 数据包中还包含了目标系统的 IP 地址和
端口号等关键信息. 若这些信息在变异过程中被修改, 就会导致变异后的数据包无法到达目标系统. 因此, 确保模
糊测试程序的变异范围十分重要. SNETFuzzer 将避开一些 TLS 重要字段, 以确保每个变异后的数据包都能被被
测系统所接受.
4 实验分析
为了评估 SNETFuzzer 的实用性和有效性, 我们研究了以下两个问题.
● RQ1: SNETFuzzer 与其他主流网络协议模糊测试工具相比性能如何?
● RQ2: SNETFuzzer 能否挖掘出网络协议实现当中的漏洞? 能否发现新的漏洞?
4.1 实验环境
表 3 列出了实验当中的具体实验环境配置参数. 为了确保 TLS 协议实现的正确安装和测试, 本实验为每个协
议实现构建了独立的虚拟化环境. 这是因为每个 TLS 协议实现通常依赖于不同的软件库和工具, 如果将不同的实
现安装在同一环境下, 很容易引发依赖冲突, 影响测试的可靠性和准确性. 为了解决这一问题, 系统使用了 Docker
Engine 作为虚拟化环境的实现工具. Docker Engine 允许将每个 TLS 协议实现封装在独立的容器中, 确保了它们之
间的隔离性.
4.2 实验评价指标
为了回答 RQ1, 本实验设置了多个指标来综合评估 SNETFuzzer 的性能, 分别为以下 5 个.
(1) 程序覆盖率 (map density): 程序覆盖率指的是从二进制程序插桩中获取的二进制程序覆盖率. 该指标的值
越大表示模糊测试的输入覆盖了更多的状态路径. 该指标的格式为 A/B. A 描述了当前输入的覆盖率, 而 B 则表示
整个语料库的覆盖率. 较高的程序覆盖率与更全面的代码覆盖相关, 是模糊测试中最重要的评估指标之一.
(2) 有趣的路径 (favored paths): 有趣的路径指的是模糊测试程序认为有趣的路径数量. 该指标的增加代表着
模糊测试程序能够发现更多有趣的路径, 直接反映了模糊测试的效果. 它是模糊测试中的一个关键指标, 用于评估
测试用例的多样性和发现能力.

