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

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


                    目前已经有一部分工作将灰盒模糊测试技术应用在网络协议模糊测试当中. 为了将                             AFL  用于网络协议模糊
                 测试, Pham  等人提出了    AFLNET [20] . 该工具采用突变方式, 并利用状态反馈机制指导模糊测试过程. AFLNET                利
                 用这些服务器返回的响应代码来标记被测网络协议实现的内部状态, 这些状态共同构成                              AFLNET  所理解的被测
                 系统状态空间. Song    等人提出的    SPFuzz [21] 也是专门针对网络协议的灰盒模糊测试工具. 与           AFLNET  不同, SPFuzz
                 定义了一种语言来描述协议规范、协议状态转换和依赖关系, 并采用三级变异策略. 它结合随机分配消息和策略
                 权重的方法来推动模糊测试过程, 以覆盖更多的路径. SnapFuzz              [22] 则在效率上有了较大的提升, 它将原本慢速的异
                 步网络通信转换为快速的同步通信.

                 1.2   有限状态机技术
                    有限状态机     (finite state machine, FSM) 是一种抽象化的数学模型, 被用来描述系统的行为. 它在计算机科学、
                 控制科学、电子工程、机械自动化等领域都有广泛应用. 有限状态机所描述的系统具有有限个状态, 并能按照规
                 则在这些状态之间转移. 状态机的状态用于表示系统的不同运行状态, 而状态之间的转移描述了系统在不同状态
                 之间的过渡规则和条件. De Ruiter 等人提出了一种           TLS  协议状态机学习框架      [23] , 并利用该框架检查   TLS  协议实
                 现中潜藏的逻辑性漏洞. 逻辑性漏洞与内存型漏洞不同, 指的是系统在错误情况下发生了不应该出现的状态转移,
                 这种转移不符合协议        RFC  文档的规定, 可能会造成严重的安全威胁. 该框架采用一种有限状态机学习算法对
                 TLS  协议进行状态机建模, 其黑盒自动化的方式颇具前瞻性. De Ruiter 等人对生成的协议状态机进行人工检查,
                 在  3  个  TLS  实现中发现了新的安全漏洞. 之后, Fiterau-Brostean  等人在此基础上扩展了工作, 增加了对            DTLS  的
                 支持  [24] , 并发现了多个安全漏洞. 同时他们证明了这种方法的通用性, 最近还将其扩展到                    SSH  协议上  [25] . Zou  等人
                 基于  TCP  状态模型的前提知识提出了         TCP-Fuzz [26] . 在此之前的  TCP  模糊测试更多地关注覆盖更多的状态, 而忽
                 略了状态转移, 导致程序覆盖范围有限. TCP-Fuzz 专注于覆盖更多的状态转移, 并考虑了数据包和系统调用之间
                 的依赖关系, 在    5  个不同的  TCP  堆栈程序中发现了多个内存错误和语义错误. StateAFL            [27] 则提供了一种适用于大
                 量流行协议的模糊测试工具, 与          AFLNET  类似, 它利用逐步探索和构建协议有限状态机来帮助模糊测试, 并加入
                 了内存分析判断.

                 2   基础知识

                    本节将主要展示与本方法相关的基础知识, 其中包括                 TLS  协议、有限状态机学习框架.

                 2.1   TLS  协议
                    本文选择    TLS  协议作为主要研究对象, 主要原因在于其在当今互联网通信中的广泛应用. TLS                      协议不仅提供
                 了数据加密、身份认证、数据传输等多种功能, 而且其安全性对于保障网络通信的机密性和完整性至关重要.
                    TLS  协议由两层组成: 记录协议和握手协议. 记录协议规定传输数据的封装格式, 而握手协议通过交换应用数
                 据来传递双方所需的所有信息, 包括身份认证和加密方式等安全属性. 需要注意的是, TLS                           并不完全符合     OSI 模
                 型或  TCP/IP  的任何一层. 它运行在可靠的传输协议          (如  TCP) 之上, 理论上应该位于传输层之上, 提供的加密服务
                 通常属于表示层的功能. 然而, 应用程序通常将              TLS  视为传输层协议, 因为使用       TLS  需要发起握手和处理身份验
                 证证书.
                    如图  1  所示, TLS  握手过程可以分为     4  个主要阶段  [28] : (1) 协商阶段. 首先由客户端发送一条     ClientHello  消息,
                 指定其支持的     TLS  协议版本、随机数、建议的密码套件和数据压缩方法. 之后服务端将用                       ServerHello  消息予以
                 相应, 消息中包含指定的       TLS  协议版本、随机数、密码套件和压缩方法. 服务器还会发送证书消息                       (Certificate),
                 并且可能发送     ServerKeyExchange 消息  (根据所选密码套件, 可能会不发送这个消息), 最后发送             ServerHelloDone
                 消息表明握手协商完成. 客户端在确认服务端传来的上述消息后, 会使用                      ClientKeyExchange 消息进行响应. 随后,
                 服务端和客户端将使用随机数来计算一个主密钥                  (master secret), 该连接的所有其他密钥数据都会源于这个主密
                 钥. (2) 客户端发送一条    ChangeCipherSpec 消息. 实际上是告诉服务器, 接下来之后的所有消息将经过身份验证和
   301   302   303   304   305   306   307   308   309   310   311