Analysis of DTLS Implementations Using Protocol State Fuzzing

https://www.usenix.org/system/files/sec20-fiterau-brostean.pdf

DTLS的主要挑战就是需要在无状态不稳定的UDP上传输保密数据,这导致引入新的特性,复杂性增加。本文使用协议状态fuzz对DTLS进行了深入分析,扩展了TLS-Attacker,支持DTLS,并且支持底层UDP协议的无状态不稳定特性。建立了一个框架,可以对DTLS服务器进行协议状态fuzz,并使用它学习13个DTLS实现的状态机。分析学习到的状态,发现了4个严重的安全漏洞,包含最新版JSSE客户端全绕过,和几个功能性的不保证一致性的问题。还展示了模型之间的不同,确认了DTLS状态机的复杂性。

Knowledge

DTLS客户端和服务器端都实现了一个状态机,跟踪协议操作进行到哪了:哪个类型的消息已经交换完成,加密材料是否验证或计算。每一个DTLS实现必须依照配置和密钥交换机制正确维护状态机。实现缺陷,也叫状态机bug,可能被利用。要找到这种缺陷,状态fuzz被证明可以用于多种协议,并且已经发现了几个严重漏洞。

状态机fuzz是一种基于黑盒模型,可以使用模型学习推断协议实现的状态机。给实现发送一系列的消息,观测对应的输出,产生一个Mealy机,可以用于抽象描述实现对于消息的回复。Mealy机被用于分析并定位控制逻辑缺陷或检测描述的一致性。状态fuzz不需要任何状态机的先验知识,但是依赖于手动构造的对应协议的测试工具。MAPPER可以用于翻译Mealy机中的符号到协议包。

Motivation

DTLS是TLS的变种,为了在UDP上传数据保证安全性。一开始是为IoT设计的,IoT目前有很大的增长趋势。DTLS用在WebRTC中。在保证TLS的安全性上下了很大功夫,但是DTLS并没有受到足够的审查。

Methodology

本文提供了一个可扩展的平台,用于测试基于DTLS的系统,并使用它分析已有的几个DTLS实现。本文的目标是找到逻辑漏洞,会在受到非标准或非期望的消息序列时展现,使用协议状态fuzz的技术。

挑战:DTLS比其它安全协议更难状态fuzz。DTLS基于UDP,由于无连接,DTLS必须实现自己的重连机制并提供消息丢失、记录、分段支持。正在进行的DTLS无法通过简单的关闭连接结束交互。因此很多DTLS实现即使收到了未期望消息,也会继续交流,毕竟可能只是乱序,并可能随后允许握手,中间重新开始,最后重新完成。和TLS相比,DTLS需要额外的消息交换,来阻止DoS攻击。这增加了协议状态fuzz的复杂性。

对于映射构造的支持:DTLS对于消息丢失、记录和分段的功能需要额外的包参数,需要使用MAPPER正确管理。当偏离期望握手序列时需要额外注意,因为每一个特殊的参数管理策略可能允许或禁止重启握手。为了方便MAPPER构建,作者开发了DTLS测试框架,允许定义任意协议包并高效测试参数管理策略。

处理DTLS状态机的复杂性:DTLS的上述属性意味着DTLS的实现的状态机会更加复杂。当分析4个主密钥交换时更加复杂。本文通过以下方式避免复杂性:1)测试工具不适用记录和分段2)利用MAPPER允许握手重启,会在减少学习模型方面有更多边缘效应,因为成功的重启作为正常握手状态。

获取多个实现和配置的模型:在13个实现应用平台。对于每一个实现,测试了密钥交换和客户端证书认证配置。这保证了不会错过这里的bug。

Result

模型构建好之后会分析模型,找到多余或非期望状态。主要的发现就是:

  • JSSE完整的认证绕过,允许攻击者通过发送一个乱序DTLS消息认证自身,无需向服务器证明自己知道私钥。
  • Scandium框架的状态机bug,允许结束一个DTLS握手,无需发送ChangeCipherSpec消息,导致服务器接受明文消息,即使沟通了加密机制。
  • 在PionDTLS中一个相似的bug,导致更严重的问题,握手完成后,服务器可以自由处理未加密数据。
  • TinyDTLS中三个认证功能bug

贡献

  • 使用DTLS功能扩展了TLS-Attacker,并使用它实现了DTLS服务器的协议状态fuzz
  • 提供了13个DTLS实现的Mealy机,支持探索大多数密钥交换算法和客户端认证设置
  • 分析了学习的模型报告了几个不符合项bug和几个DTLS实现安全漏洞