uTorrent協(xié)議層遠(yuǎn)程漏洞的分析和利用
寫在前面的話
近期,世界上最流行的torrent客戶端uTorrent被爆出了一個安全漏洞,該漏洞的CVE編號為CVE-2020-8437。根據(jù)研究人員透露的信息,遠(yuǎn)程攻擊者可以利用該漏洞來入侵任何一個連接至互聯(lián)網(wǎng)的uTorrent實例,并讓其運行崩潰。作為合格的白帽黑客,我們在發(fā)現(xiàn)了該漏洞之后便立刻將其上報給了uTorrent團(tuán)隊,該漏洞也在短時間內(nèi)迅速得到修復(fù)。現(xiàn)在在這篇文章中,我們將公開該漏洞的概況以及相應(yīng)的利用方式。
Torrent協(xié)議
Torrent下載(傳說中的BT下載)可以同時與多個對等節(jié)點建立連接(其他人下載同一文件),并創(chuàng)建一個分散的下載網(wǎng)絡(luò)來使整個對等節(jié)點組共同受益。每個對等節(jié)點都可以上傳和下載數(shù)據(jù)到任何其他的對等節(jié)點,這種方式可以消除任何單一故障點或?qū)拵款i,從而使所有對等節(jié)點的下載速度更快更穩(wěn)定。
對等節(jié)點之間使用了BitTorrent協(xié)議進(jìn)行通信,而這種協(xié)議通信方式需要通過握手來發(fā)起。在接下來的分析過程中,我們將主要關(guān)注握手包以及隨后的數(shù)據(jù)包。
BitTorrent握手
握手包是對等節(jié)點之間初始化通信所要發(fā)送的第一個數(shù)據(jù)包,握手包中包含了五個字段,每個字段都有嚴(yán)格的結(jié)構(gòu)化格式。
握手包格式:
- Name Length:1字節(jié)無符號整型,后跟字符串長度。
- ProtocalName:可變長度的字符串,用于標(biāo)記發(fā)起初始化的對等節(jié)點支持的協(xié)議。此字段將用于兼容性問題,不過在目前主要的協(xié)議實現(xiàn)中該字段都被設(shè)置為了“BitTorrent protocol”。
- Reserved Bytes:8字節(jié)比特字段,每一位代表了一個協(xié)議功能擴(kuò)展,現(xiàn)代Torrent客戶端將使用這個字段來跟高級功能進(jìn)行通信以優(yōu)化下載任務(wù)。
- Info Hash:20字節(jié)SHA1,用于識別初始化對等節(jié)點想要下載的種子文件,這個哈希是目標(biāo)種子文件全部信息的哈希,其中包括種子名稱、文件域哈希、文件大小、數(shù)量等等。
- Peer ID:20字節(jié)緩沖區(qū),一個發(fā)起方跟自己指定的隨機(jī)標(biāo)識。

當(dāng)一個節(jié)點收到一個握手包之后,它將會用自己的握手包來回應(yīng)。如果兩個節(jié)點的Reserved Bytes字段都設(shè)置為了“Extension Protocol”,那么節(jié)點之間將使用一個“擴(kuò)展”消息握手來交換更多關(guān)于擴(kuò)展組建的信息。
BitTorrent擴(kuò)展消息握手
擴(kuò)展消息握手是對等節(jié)點之間用于共享額外擴(kuò)展實現(xiàn)信息時使用的,跟我們之前分析的BitTorrent握手包不同的是,BitTorrent握手包的大小是固定的,但擴(kuò)展消息握手包是可以動態(tài)變化的,這將允許該數(shù)據(jù)包傳輸大量擴(kuò)展數(shù)據(jù)。
擴(kuò)展消息握手包格式:
- Length:4字節(jié)無符號整型,后跟整個信息的長度。
- BitTorrent Message Type:1個字節(jié),即數(shù)據(jù)包的BitTorrent消息ID,擴(kuò)展消息對應(yīng)的是20(0x14)。
- BitTorrent Extended Message Type:1個字節(jié),代表擴(kuò)展消息的ID,對應(yīng)的值為0。
- M:動態(tài)變化的數(shù)據(jù)包大小,支持的補(bǔ)充擴(kuò)展Bencoded格式字典。

Bencoded字典
M字段是一個Bencoded格式的字典,這種格式跟Python字典格式類似:即字符串類型的鍵值對。但是,跟Python字典相比,Bencoded字典在值前面會包含每一個字符串的長度,“d”和“e”分別用來代表“{”和“}”。下面給出的是Python字典和Bencoded字典的對比圖:

除此之外,Python字典和Bencoded字典都可以在字典內(nèi)部包含一個單獨的字典,即支持字典嵌套:

漏洞CVE-2020-8437
漏洞CVE-2020-8437存在于uTorrent解析Bencoded字典的代碼之中,說準(zhǔn)確一點,就是解析嵌套字典的代碼。在補(bǔ)丁發(fā)布之前(uTorrent 3.5.5及其之前版本),uTorrent將使用一個32位整數(shù)作為一個比特字段來跟蹤Bencoded字典當(dāng)前正在解析的部分。比如說,當(dāng)uTorrent在解析第一層時,這個比特字段將會被設(shè)置為‘00000000 00000000 00000000 00000001’,當(dāng)uTorrent在解析第二層時,這個比特字段將會被設(shè)置為‘00000000 00000000 00000000 00000011’。
但是,如果一個Bencoded字典的嵌套層數(shù)超過32層的話,會發(fā)生什么呢?于是乎,我便創(chuàng)建了一個這樣的字典,然后丟給了uTorrent的字典解析器,結(jié)果如下:

這就很Nice!uTorrent崩潰啦!深入分析后,我們發(fā)現(xiàn)這是一個空指針引用錯誤。
漏洞利用
漏洞CVE-2020-8437有兩個簡單的利用向量,首先是要一個遠(yuǎn)程對等節(jié)點發(fā)送一個包含惡意Bencoded字典的擴(kuò)展消息數(shù)據(jù)包,其次就是需要一個包含了惡意Bencoded字典的.torrent種子文件。
1. 遠(yuǎn)程對等節(jié)點利用
當(dāng)兩個支持?jǐn)U展消息的對等節(jié)點開始交互通信時,它們都會發(fā)送一個數(shù)據(jù)包來枚舉各自支持的擴(kuò)展功能,而關(guān)于支持?jǐn)U展的消息就是通過Bencoded字典來發(fā)送的,如果字典是惡意字典,那么客戶端在解析Bencoded字典時就會觸發(fā)漏洞CVE-2020-8437。
2. Torrent文件利用
.torrent種子文件封裝了客戶端開始下載torrent所需的最基本信息,這些文件在torrent網(wǎng)站上公開共享,任何人都可以直接下載,然后使用torrent客戶端來打開,因此這些文件都有可能成為觸發(fā)漏洞CVE-2020-8437的工具。一個.torrent文件相當(dāng)于是一個以文件格式保存的Bencoded字典,因此我們只需要將一個惡意Bencoded字典保存為一個.torrent文件,就可以實現(xiàn)攻擊向量的創(chuàng)建了。
漏洞利用代碼:【點我獲取】
漏洞利用演示視頻
視頻地址:【點我觀看】
緩解方案
根據(jù)該漏洞的嚴(yán)重性情況,建議廣大用戶盡快將uTorrent客戶端程序升級至最新版本!