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 中的空指针的间接
引用.

