DNS漏洞影響數百萬iot設備

研究人員在C標準庫的DNS組件中發現一個安全漏洞,利用該漏洞可以對DNS進行投毒攻擊,影響數百萬嵌入式和IoT設備。

uClibc庫和uClibc-ng庫是兩個標準的C語言庫,可以提供擴展的DNS客戶端接口,允許應用程序即時執行lookup和其他DNS相關的查詢。被Netgear、Axis、Linksys等主流設備廠商使用,被適用於Linux系統的嵌入式應用中。

Nozomi研究人員在IoT設備測試過程中發現,DNS請求的transaction ID首先是遞增的,然後重置爲0x2,然後繼續遞增。

圖 測試IoT設備執行的DNS請求記錄

研究人員進一步分析發現產生這一結果的原因是其使用的C標準庫——uClibc 0.9.33.2 (“libuClibc-0.9.33.2.so”)。研究人員分析uClibc源碼發現位於“/libc/inet/resolv.c”源文件調用了“__dns_lookup”函數:

圖 uClibc的DNS lookup函數

在第1240行,函數聲明瞭一個靜態變量“last_id”。該變量包含上一個DNS請求中使用的transaction ID值,並在“__dns_lookup” 的第一次調用時初始化爲1。

在第1260行,該函數聲明瞭變量“local_id”。該變量中包含一個用於下一個DNS請求的transaction ID值,未初始化。

之後,會執行以下代碼:

圖 uClibc (2)中的DNS lookup函數

在第1309行,第一個DNS請求中,“local_id”變量被初始化爲上一個DNS請求的transaction ID的值。第1320行是漏洞產生的原因:local_id是在原值的基礎上+1遞增的。考慮到該值在第一次調用的時候被初始化爲1,這也是前面圖中transaction ID被重置爲0x2的原因。

在第1321行,在進行位與(AND)運算後,該值仍被保存在“last_id”變量中(第1323行)。最後,在第1335行,“local_id”的值會被複制到struct resolv_header “h”變量中,表示DNS請求header的真實內容。

由於transaction ID是可預測的,攻擊者可以構造一個含有正確源端口的DNS請求,並贏得合法DNS響應的競爭。攻擊者可以使用DNS投毒或DNS欺騙來重定向受害者到攻擊者控制的惡意網站或IP地址(服務器)。如果操作系統應用端口隨機化技術,攻擊者可以通過發送多個DNS請求來暴力破解16位源端口,同時贏得合法DNS請求的競爭。

DNS投毒可以誘使目標設備指向任意定義的終端並參與網絡通信。攻擊者通過DNS投毒可以重定向流量到其控制的服務器。然後,攻擊者可以竊取和修改用戶傳輸的信息,執行鍼對這些設備的其他攻擊。

Nozomi 在2021年9月發現了該漏洞,並報告給了CISA。12月,將該漏洞提交給了CERT/CC。2022年1月,將漏洞通告給了超過200個受影響的廠商。

目前,該漏洞並非分配CVE編號,也未發佈補丁。相關廠商正在協作開發補丁。

完整技術分析參見:https://www.nozominetworks.com/blog/nozomi-networks-discovers-unpatched-dns-bug-in-popular-c-standard-library-putting-iot-at-risk/

參考及來源:https://www.bleepingcomputer.com/news/security/unpatched-dns-bug-affects-millions-of-routers-and-iot-devices/