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

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


                 和被动. 另一方面, AFLNET    也缺少状态机中已有状态转移信息的引导, 因此导致其最终效果不如                       SNETFuzzer.

                 4.5   漏洞分析
                    针对问题    RQ2, SNETFuzzer 成功地发现了两个新漏洞和一个已发现漏洞, 本节将详细介绍这些漏洞.

                 4.5.1    MatrixSSL  漏洞分析
                    SNETFuzzer 在  MatrixSSL  上一共触发了  68  次异常崩溃, 其中独特的崩溃为        21  次. 经过程序调试, 发现这些
                 漏洞虽然触发位置不同, 但漏洞类型可以分为两类.
                    图  12  为第  1  种漏洞的调试信息. 在   21  次独特的崩溃中, 有    15  次为此类崩溃. 这是一种非常经典的内存泄露
                 漏洞, 是在使用    C  语言的标准库函数 free() 释放内存时出现的错误消息之一. 这通常是由于程序中某处发生了内
                 存越界、内存重复释放、内存损坏等情况. 与此错误相关的                   CWE  是  CWE-762, 即不匹配的内存管理例程.






                                              图 12 在  MatrixSSL  上发现的漏洞   1

                    图  13  为第  2  种漏洞的调试信息. 在   21  次独特的崩溃中, 有    6  次为此类崩溃. 这同样是一种内存泄露漏洞, 是
                 在使用   C  语言的标准库函数 free() 释放内存时出现的错误消息之一. 这种错误通常表示发生了重复释放或者内存
                 损坏的情况. 与这种错误相关的         CWE  是  CWE-415, 即重复释放.






                                              图 13 在  MatrixSSL  上发现的漏洞   2

                    经过分析, 这两个漏洞虽然错误类型不同, 但实际上指向同一行代码, 位于                      matrixssl.c: 1566. 漏洞触发流程如
                 下, 首先客户端发送了用于触发漏洞的数据包序列到服务端, 共包含了                      6  个数据包. MatrixSSL  接收了前面几个数
                 据包并且写入到了内存当中, 在接收到某一个数据包的时候, 服务端想要结束连接, 并且进入了                              closeConn  函数,
                 在  closeConn  函数中, 存在一个  matrixSslDeleteSession  函数负责删除  socket 的连接以释放内存, 而这个函数存在
                 matrixssl.c 当中. 在  matrixSslDeleteSession  尝试删除并且释放数据缓冲区, 清除任何剩余的用户数据的时候出现了
                 错误. 程序使用了一个      psFree 函数进行已写入    buffer 的数据释放, 这个函数在     psmalloc.h 中被定义. 而  psFree(A, B)
                 就是  free(A) 函数, 也就说调用了一个危险的       free 函数并且在释放内存之前并没有对释放的对象做检查. 以上两个
                 漏洞并未在    CVE  或  CNVD  网站上登记, 属于新漏洞.

                 4.5.2    OpenSSL  漏洞分析
                    SNETFuzzer 于  OpenSSL  上一共触发了  12  次异常崩溃, 其中独特的崩溃也为         12  次. 图  14  展示了对应的调试
                 信息, 经过程序调试后发现, 这        12  个漏洞都指向相同的位置, 即       s23_srvr.c 文件的第  628  行.
                    进一步分析表明漏洞出现在           ssl23_get_client_hello  函数, 该函数无法正确处理未知的协议而导致崩溃. 相关
                 CWE  编号为  CWE-476, 即空指针取消引用错误. 该类错误指在程序中使用了空指针进行内存访问操作, 导致程序
                 崩溃或产生未定义的行为.
                    该漏洞实际上已经登录至           CVE  网站, 其  CVE  号为  CVE-2014-3569. 该漏洞是由于 OpenSSL 构建配置实
                 施不当造成的, 在某些特定版本中, s23_srvr.c 中的 ssl23_get_client_hello 函数无法正确处理使用不受支持的协议
                 的尝试, 这使得远程攻击者可以通过构造特殊数据包来造成拒绝服务攻击. 当                         OpenSSL 打开 no-ssl3 选项的时候
                 仍然接收到一个未知协议的握手请求时, SSL              方法会被置为 NULL      并将导致在之后       SSLerr 中的空指针的间接
                 引用.
   312   313   314   315   316   317   318   319   320   321   322