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

3736                                                       软件学报  2025  年第  36  卷第  8  期



                                                 ClientKeychange
                                                   Empty
                                                                      ApplicationDataEmpty
                                                                          Empty
                               ClientHelloRSA                                     Finished
                               ServerHello/Certifi-  Certificate  ClientKeyExchange  ChangeCipherSpec  ChangeCipherSpecHandshake/  HeartbeatRequest
                              cate/ServerHelloDone  Empty  Empty   Empty          Finish      HeartbeatResponse
                          0                1         3         4         5                6
                                                  Other
                                             Alert Fatal (Unexpected message/
                          Other
                    Alert Fatal (Unexpected message)/  ConnectionClosed)  Other
                       ConnectionClosed  ChangeCipherSpec/Finished/  Alert Fatal (Unexpected message/  Other
                                                           ConnectionClosed)  Alert Fatal (Unexpected message/  ApplicationDataEmpty
                                   ApplicationData/HeartbeatRequest
                                                                       ConnectionClosed)      Empty
                                    Alert Fatal (Unexpected message)/
                                       ConnectionClosed                             Other
                                                                          Alert Fatal (Unexpected message)/ConnectionClosed
                                                     2
                                                        Other
                                      ClientKeyExchangeRSA  Empty            AlertWarningCloseNotify
                                  Alert Fatal (Internal error)/ConnectionClosed  Alert Fatal (Internal error)
                                               图 8 GnuTLS  的简化有限状态机


                          ClientHelloRSA                                               Finished
                         ServerHello/Certifi-  ClientKeyExchange  ChangeCipherSpec   ChangeCipher-
                         cate/ServerHelloDone    Empty               Empty            Spec/Finished
                     0                   1                   3                   4                 5
                                                                                       AppData
                                                                                 AppData/ConnectionClosed
                                                             2
                                           图 9 典型的    TLS  握手流程的状态转移过程

                    为了获取所有的状态转移路径并获得它们边上的信息, SNETFuzzer 使用一种深度优先搜索算法来获得这些
                 状态转移路径, 与传统针对图的深度有限算法不同的是, TLS                 有限状态机的图结构存在以下特点: (1) 图中两个节
                 点之间可能有多条不同的边; (2) 图中存在环路; (3) 图中每个路径必须包括起始节点和终止节点. 算法将都由固定
                 的起始节点开始深度优先搜索, 一直搜索到终止节点为止. 如果遇到两个节点之间都存在多条边, 将每个节点对应
                 的邻接节点列表变成一个字典, 其中键是邻接节点, 而值是边的列表. 如果遇到环路, 则考虑                           1  次、2  次和  3  次循
                 环的情况, 将在运行算法之前对于图结构直接进行预处理以避免在运行状态转移路径获取算法的时候遇到死循环.
                    有限状态机信息提取分析的第           1  个任务就是提取有限状态机中所有的状态转移路径. 然而仅有状态转移路径
                 是无法作为模糊测试种子的, 因为模糊测试种子都是在针对程序的实际输入, 在网络协议模糊测试领域就是实际
                 通信过程中由客户端发送给服务端的数据包. 只有使用真实有效的数据包才能确保协议模糊测试的有效执行, 而
                 不是在一开始就被被测系统判定为非法数据包导致模糊测试无法进行. 所以信息提取分析的第                               2  个任务将是根据
                 提取出来的多条状态转移路径生成多个数据包序列, 每个数据包序列都对应一条状态转移路径, 并且要求每个数
                 据包序列中的每个数据包都是有效可用的, 不会被被测系统判断为非法数据包. 之后这些数据包序列会以模糊测
                 试种子的形式输入到       SNETFuzzer 的模糊测试部分当中进行使用.
                    为实现这个目标, SNETFuzzer 实现了一个简单发包和抓包程序, 能够根据状态转移路径发送构造好的                             TLS
                 数据包到被测系统并且截获双方通信中的数据包序列.

                 3.5   基于有限状态机引导的网络协议模糊测试
                    SNETFuzzer 将作为客户端对被测系统进行灰盒模糊测试. 在进行模糊测试的过程中, 将持续监控二进制程序
                 覆盖率, 二进制程序覆盖率和代码覆盖率是成正比的. 在收集覆盖率的同时, 该模块还需要评估每个输入的质量,
                 具体而言如果一个输入导致一段新的代码路径被执行, 那么它就是一个有趣的输入, 这个输入将会被保留并且分
                 配更多的能量, 也就是分配更多的运行时间和资源.
                    为使得模糊测试尽可能随机和激进以便更好地探索被测系统的状态空间, SNETFuzzer 会使用一种融合性变
   308   309   310   311   312   313   314   315   316   317   318