近日,Google和Red Hat的安全人員發現GNU C Library (glibc)中存在嚴重的安全漏洞,可導致Linux軟件被攻擊者劫持,進而在Linux平台上執行任意代碼,獲取密碼,監視用戶,甚至控制計算機。CVE編號為CVE-2015-7547。
glibc是GNU發布的libc庫,即c運行庫。它是Linux系統中最底層的API,幾乎其它運行庫都會依賴於glibc。glibc應用於眾多Linux發行版本中,所以此類漏洞影響范圍十分廣泛。
glibc的DNS客戶端解析器中存在基於棧的緩沖區溢出漏洞。當軟件用到getaddrinfo庫函數(處理名字到地址以及服務到端口的轉換)時,攻擊者便可借助特制的域名、DNS服務器或中間人攻擊利用該漏洞,控制軟件,並試圖控制整個系統。
攻擊者使用惡意的DNS域名服務器創建類似於evildomain.com的域名,然後向目標用戶發送帶有指向該域名的鏈接的郵件,一旦用戶點擊該鏈接,客戶端或浏覽器將會開始查找ildomain.com,並最終得到惡意服務器的buffer-busting響應。該域名被嵌入服務器日志中,一旦解析就會觸發遠程代碼執行,SH客戶端也會因此被控制。或者,位於目標用戶網絡中的中間人攻擊者可以篡改DNS響應,向惡意代碼中動態注入負載。
根據目前的調查情況,此漏洞影響自2.9之後的所有版本,其他舊版本也可能受到影響。
glibc通過alloca()函數在棧中為_nss_dns_gethostbyname4_r函數2048字節的空間,用於托管DNS響應。若響應大於2048字節,程序會從堆中重新分配一個緩沖區,並更新所有信息(緩沖區指針,緩沖區大小和響應大小)。
在一定條件下,會出現棧緩沖區和新分配的堆內存的錯誤匹配,導致超過棧緩沖區大小的響應仍然存儲在棧中,進而發生緩沖區溢出。觸發該漏洞的利用向量十分普遍,並且ssh、sudo和curl等工具中。
該漏洞存在於resolv/res_send.c文件中,當getaddrinfo()函數被調用時會觸發該漏洞。技術人員可以通過將TCP DNS響應的大小限制為1024字節,並丟棄所有超過512字節的UDPDNS數據包來緩解該問題。值得慶幸的是,許多嵌入式Linux設備,例如家庭路由器,更傾向於使用uclibc庫,因此可以免受該漏洞的影響。
補丁獲取:sourceware
POC:github