只需點擊一個鏈接或是連接到服務器,便可導致遠程代碼執行。攻擊者可盜取口令、監視用戶,甚至控制計算機。更甚者,任何與網絡相連的軟件,如果使用glibc的話,都有危險。
Glibc(GNU C Library)是大多數Linux中的關鍵組件,漏洞(CVE-2015-7547)存在于glibc的DNS解析器中,是一個基于堆棧的緩沖區溢出漏洞。一臺惡意DNS服務器可以返回給查詢者超量的信息,利用這個漏洞用代碼淹沒程序內存,從而危害該程序,或者是掌握整個系統。
攻擊方法
攻擊者首先建立一個惡意的DNS服務器,然后發送帶有此域名的惡意鏈接,受害者一旦點擊這個鏈接,其使用的客戶端或瀏覽器就會發送這個域名的查詢請求,最終從這個惡意DNS服務器得到一個緩沖區溢出的響應。
這個域名還能夠插入到服務器日志文件中,當解析這個域名時將觸發遠程代碼執行,即便是SSH加密的客戶端也無法避免。同樣,在網絡中使用中間人攻擊的手段,即可篡改DNS響應,注入惡意代碼的載荷。
有各種各樣的漏洞利用方法,影響自2009年5月以來發行的glibc2.9版以后所有的版本。
漏洞原理
發現這個漏洞的谷歌研究人員解釋,glibc通過alloca()函數在堆棧中保有2048字節,這個函數響應DNS查詢請求的函數_nss_dns_gethostbyname4_r() ,然后是send_dg()和send_vc()兩個函數。如果響應大于2048字節,就會從堆分配一個新的緩沖區并更新所有的信息,包括緩沖區指針、新的的緩沖區大小和響應包大小。在某些情況下,造成堆棧緩沖之間的不匹配,并會分配新的堆。最后的結果就是,堆棧緩沖將被用于存儲DNS響應,即使響應包大小超過了堆棧緩沖,以及分配了堆緩沖。該行為導致堆棧緩沖的溢出。
關鍵問題存在于resolv/res_send.c中,并在使用getaddrinfo()函數調用時觸發。當啟動sudo、curl或其他工具時,均可觸發此漏洞利用。
影響程度
凡是使用glibc的Linux用戶均受此漏洞影響,幸運的是許多嵌入式Linux設備逃過此劫,因為諸如家用路由器等設備使用的是輕量級的uclibc庫。
實際上,該漏洞早去年7月就已經被發現,但當時這個編程上的問題被嚴重低估。當谷歌安全人員撞到這個漏洞時,他們發現紅帽的兩位研究人員也正在分析這個問題,但由于問題的嚴重性,兩人并未公布相關信息,只是在私下的進行研究。最終谷歌、紅帽雙方合力開發了補丁更新。
補救措施
實現遠程代碼執行,攻擊者必需繞過操作系統的安全機制,如ASLR(地址空間布局隨機化)、非可執行堆棧保護等。防火墻也可以過濾一些可疑的DNS響應。
因此,安全運維人員可以限制所有TCP協議的DNS響應包大小在1024字節之內,并丟棄超過512字節的UDP協議DNS包。
最后,補丁已出,趕緊更新!
https://sourceware.org/ml/libc-alpha/2016-02/msg00416.html
POC:
https://github.com/fjserna/CVE-2015-7547