Targeting wolfSSL
在Trail of Bits实习期间,我们添加了多个wolfSSL版本作为模糊测试目标。选择wolfSSL库是因为它在2022年初被发现存在两个认证漏洞(CVE-2022-25640和CVE-2022-25638),这让我们能验证tlspuffin通过重新发现已知漏洞的有效性。
由于tlspuffin使用Rust编写,我们首先需要为wolfSSL创建绑定。在实现绑定过程中,我们在OpenSSL兼容层发现了几个bug并报告给wolfSSL团队。绑定完成后,模糊测试器就可以开始工作:发现wolfSSL中的异常状态。
Discovered Vulnerabilities
实习期间,我在wolfSSL中发现了多个可导致拒绝服务(DoS)的漏洞:
DOSC: CVE-2022-38153允许中间人或恶意服务器通过拦截修改TLS数据包对TLS 1.2客户端发起DoS攻击,影响wolfSSL 5.3.0。
DOSS: CVE-2022-38152是针对使用wolfSSL_clear函数而非wolfSSL_free/wolfSSL_new组合的wolfSSL服务器的DoS漏洞,会话恢复会导致空指针解引用崩溃,影响wolfSSL 5.3.0至5.4.0。
BUF: CVE-2022-39173是由缓冲区溢出引起的wolfSSL服务器DoS漏洞,攻击者通过伪装会话恢复并在Client Hello中发送重复密码套件触发,可能在某些架构上实现远程代码执行(RCE),影响5.5.1之前版本。
HEAP: CVE-2022-42905是解析TLS记录头时的缓冲区越读漏洞,影响5.5.2之前版本。
“几个wolfSSL的CVE,tlspuffin的巨大飞跃”
这些漏洞标志着该模糊测试器的重要里程碑:它们是首个使用该工具发现的具有广泛影响的漏洞。平均而言,模糊测试器发现漏洞和崩溃用时不到一小时。
在准备wolfSSL测试环境时,我们还发现了一个严重的API误用导致的内存泄漏问题。wolfSSL团队在一周内修复了所有发现的问题,堪称"最佳协调披露"典范。
DOSC: 针对客户端的拒绝服务
在wolfSSL 5.3.0中,中间人或恶意服务器可崩溃TLS客户端。漏洞存在于AddSessionToCache函数中,当客户端收到服务器的新会话票据时调用。
关键问题在于当新会话票据较大(700字节)时,会尝试释放未在堆上分配的内存指针。与Heartbleed不同,此漏洞是由逻辑错误而非缓冲区溢出引起。
模糊测试器通过将会话票据替换为700字节大数组,在大约一小时内发现了该漏洞。触发漏洞需要客户端会话缓存中有约30个先前连接。
BUF: 服务器缓冲区溢出
wolfSSL 5.5.1之前版本中,恶意客户端可在恢复TLS 1.3握手时引发缓冲区溢出。攻击者需要发送两个精心构造的Client Hello:第一个伪装会话恢复,第二个响应Hello重试请求。
漏洞位于RefineSuites函数中,当ssl->suites包含单个密码套件而peerSuites包含13个重复相同套件时,会导致169个套件写入仅支持150个套件的缓冲区,造成栈溢出。
下一代协议模糊测试
加密协议实现历来容易出错。与传统文件格式模糊测试不同,加密协议需要特定的加密消息流才能到达深层协议状态。
tlspuffin受Dolev-Yao模型启发,这是自1980年代以来用于形式化协议验证的符号模型。该模型假设攻击者能完全控制通信网络中的消息。
Dolev-Yao跟踪
Dolev-Yao跟踪使用术语代数符号化表示消息。例如有缺陷的Needham-Schröder协议可表示为包含输入输出步骤的跟踪序列,精确建模中间人攻击。
TLS 1.3握手协议
TLS握手分为四个阶段:密钥交换(未加密)、服务器参数、服务器认证和可选的客户端认证。每个消息都可以用符号术语表示,如Client Hello可表示为fn_client_hello(fn_key_share, fn_signature_algorithm, psk)。
模糊测试Dolev-Yao跟踪
tlspuffin基于LibAFL进化模糊测试器设计,主要流程:
- 种子语料库:包含常见攻击场景的手工跟踪
- 调度和变异阶段:基于启发式选择种子并进行变异
- 执行器、反馈和目标:在实际实现中执行跟踪,收集覆盖率反馈和安全违规目标
实习亮点
实习期间为tlspuffin增加了多项新功能:
- 支持更多模糊测试目标(如wolfSSL)
- 扩展协议支持(添加SSH)
- 改进安全违规检测
- 增强漏洞重现能力
结论
Dolev-Yao模型引导的模糊测试是测试加密协议的新颖技术,已通过重新发现已知认证漏洞和在wolfSSL中发现新DoS攻击证明其可行性。
虽然集成新协议或目标需要大量工作(SSH支持耗时5-6周,新目标1-2周),但对TLS或SSH等广泛使用协议来说非常值得。开发者还可使用tlspuffin编写测试套件,实现回归测试。
互联网高度依赖TLS和SSH协议,其安全问题影响深远。让我们通过验证、测试和模糊测试加密协议来保持网络安全!