写在前面的话
近期,世界上最流行的torrent客户端uTorrent被爆出了一个安全漏洞,该漏洞的CVE编号为CVE-2020-8437。根据研究人员透露的信息,远程攻击者可以利用该漏洞来入侵任何一个连接至互联网的uTorrent实例,并让其运行崩溃。作为合格的白帽黑客,我们在发现了该漏洞之后便立刻将其上报给了uTorrent团队,该漏洞也在短时间内迅速得到修复。现在在这篇文章中,我们将公开该漏洞的概况以及相应的利用方式。
Torrent协议
Torrent下载(传说中的BT下载)可以同时与多个对等节点建立连接(其他人下载同一文件),并创建一个分散的下载网络来使整个对等节点组共同受益。每个对等节点都可以上传和下载数据到任何其他的对等节点,这种方式可以消除任何单一故障点或宽带瓶颈,从而使所有对等节点的下载速度更快更稳定。
对等节点之间使用了BitTorrent协议进行通信,而这种协议通信方式需要通过握手来发起。在接下来的分析过程中,我们将主要关注握手包以及随后的数据包。
BitTorrent握手
握手包是对等节点之间初始化通信所要发送的第一个数据包,握手包中包含了五个字段,每个字段都有严格的结构化格式。
握手包格式:
- Name Length:1字节无符号整型,后跟字符串长度。
- ProtocalName:可变长度的字符串,用于标记发起初始化的对等节点支持的协议。此字段将用于兼容性问题,不过在目前主要的协议实现中该字段都被设置为了“BitTorrent protocol”。
- Reserved Bytes:8字节比特字段,每一位代表了一个协议功能扩展,现代Torrent客户端将使用这个字段来跟高级功能进行通信以优化下载任务。
- Info Hash:20字节SHA1,用于识别初始化对等节点想要下载的种子文件,这个哈希是目标种子文件全部信息的哈希,其中包括种子名称、文件域哈希、文件大小、数量等等。
- Peer ID:20字节缓冲区,一个发起方跟自己指定的随机标识。
当一个节点收到一个握手包之后,它将会用自己的握手包来回应。如果两个节点的Reserved Bytes字段都设置为了“Extension Protocol”,那么节点之间将使用一个“扩展”消息握手来交换更多关于扩展组建的信息。
BitTorrent扩展消息握手
扩展消息握手是对等节点之间用于共享额外扩展实现信息时使用的,跟我们之前分析的BitTorrent握手包不同的是,BitTorrent握手包的大小是固定的,但扩展消息握手包是可以动态变化的,这将允许该数据包传输大量扩展数据。
扩展消息握手包格式:
- Length:4字节无符号整型,后跟整个信息的长度。
- BitTorrent Message Type:1个字节,即数据包的BitTorrent消息ID,扩展消息对应的是20(0x14)。
- BitTorrent Extended Message Type:1个字节,代表扩展消息的ID,对应的值为0。
- M:动态变化的数据包大小,支持的补充扩展Bencoded格式字典。
Bencoded字典
M字段是一个Bencoded格式的字典,这种格式跟Python字典格式类似:即字符串类型的键值对。但是,跟Python字典相比,Bencoded字典在值前面会包含每一个字符串的长度,“d”和“e”分别用来代表“{”和“}”。下面给出的是Python字典和Bencoded字典的对比图:
除此之外,Python字典和Bencoded字典都可以在字典内部包含一个单独的字典,即支持字典嵌套:
漏洞CVE-2020-8437
漏洞CVE-2020-8437存在于uTorrent解析Bencoded字典的代码之中,说准确一点,就是解析嵌套字典的代码。在补丁发布之前(uTorrent 3.5.5及其之前版本),uTorrent将使用一个32位整数作为一个比特字段来跟踪Bencoded字典当前正在解析的部分。比如说,当uTorrent在解析第一层时,这个比特字段将会被设置为‘00000000 00000000 00000000 00000001’,当uTorrent在解析第二层时,这个比特字段将会被设置为‘00000000 00000000 00000000 00000011’。
但是,如果一个Bencoded字典的嵌套层数超过32层的话,会发生什么呢?于是乎,我便创建了一个这样的字典,然后丢给了uTorrent的字典解析器,结果如下:
这就很Nice!uTorrent崩溃啦!深入分析后,我们发现这是一个空指针引用错误。
漏洞利用
漏洞CVE-2020-8437有两个简单的利用向量,首先是要一个远程对等节点发送一个包含恶意Bencoded字典的扩展消息数据包,其次就是需要一个包含了恶意Bencoded字典的.torrent种子文件。
1. 远程对等节点利用
当两个支持扩展消息的对等节点开始交互通信时,它们都会发送一个数据包来枚举各自支持的扩展功能,而关于支持扩展的消息就是通过Bencoded字典来发送的,如果字典是恶意字典,那么客户端在解析Bencoded字典时就会触发漏洞CVE-2020-8437。
2. Torrent文件利用
.torrent种子文件封装了客户端开始下载torrent所需的最基本信息,这些文件在torrent网站上公开共享,任何人都可以直接下载,然后使用torrent客户端来打开,因此这些文件都有可能成为触发漏洞CVE-2020-8437的工具。一个.torrent文件相当于是一个以文件格式保存的Bencoded字典,因此我们只需要将一个恶意Bencoded字典保存为一个.torrent文件,就可以实现攻击向量的创建了。
漏洞利用代码:【点我获取】
漏洞利用演示视频
视频地址:【点我观看】
缓解方案
根据该漏洞的严重性情况,建议广大用户尽快将uTorrent客户端程序升级至最新版本!