近日,Google 的安全研究團隊披露了glibc getaddrinfo溢出漏洞。經研究發現,所有Debian、Red Hat以及更多其它Linux發行版,只要glibc版本大于2.9就會受到該溢出漏洞影響。攻擊者可以通過該漏洞直接批量獲取大量主機權限。
關于漏洞的詳細發現過程,請移步Google的博客。
百科:glibc是什么?
glibc是GNU發布的libc庫,即c運行庫。glibc是linux系統中最底層的api,幾乎其它任何運行庫都會依賴于glibc。glibc除了封裝linux操作系統所提供的系統服務外,它本身也提供了許多其它一些必要功能服務的實現。由于 glibc 囊括了幾乎所有的 UNIX 通行的標準,可以想見其內容包羅萬象。而就像其他的 UNIX 系統一樣,其內含的檔案群分散于系統的樹狀目錄結構中,像一個支架一般撐起整個操作系統。在GNU/Linux 系統中,其C函式庫發展史點出了GNU/Linux 演進的幾個重要里程碑,用 glibc 作為系統的C函式庫,是GNU/Linux演進的一個重要里程碑。
漏洞的成因及POC使用測試
據悉,漏洞的成因在于DNS Server Response返回過量的(2048 ) 字節, 導致接下來的response 觸發棧溢出。
目前,Google已提供了POC,據其博客中所述,該漏洞應該是可以繞過內存防護技術,從而形成代碼執行漏洞。
具體POC 地址如下:github.com/fjserna/CVE-2015-7547
對此,烏云白帽子路人甲在自己的本地lubuntu 上進行了測試,libc 版本為 2.19。lubuntu系列也屬于Debian 的一個發行版,故理論上滿足漏洞條件。測試過程如下:
根據漏洞描述,我們可以做一個假的DNS Server 作為中間人,來驗證該漏洞。
更改DNS 解析為 127.0.0.1,刷新DNS 緩存 sudo /etc/init.d/nscd restart
執行 CVE-2015-7547-poc.py, 注意無需更改 ip_addr 。
編譯 CVE-2015-7547-client.c, 執行CVE-2015-7547-client
若含有漏洞,會造成Segmentation Fault。
(圖片來自烏云安全中心)
由于gilbc 2.9 是在2008年發行的,所以大量Linux 系統都會受到該漏洞影響。若一旦繞過內存防護技術,則該漏洞可以成為一大殺器。被劫持的DNS server進行中間人攻擊,可直接批量獲取大量主機權限。
修復方案: 打patch,詳見官方介紹
如何檢查Linux上的glibc版本
方法一:
下面給出了命令行下檢查GNU C庫的簡單命令。
$ ldd --version
方法二:
另一個方法是在命令行“輸入”glibc 庫的名稱(如,libc.so.6),就像命令一樣執行。
輸出結果會顯示更多關于glibc庫的詳細信息,包括glibc的版本以及使用的GNU編譯器,也提供了glibc擴展的信息。glibc變量的位置取決于Linux版本和處理器架構。
在基于Debian的64位系統上:
$ /lib/x86_64-linux-gnu/libc.so.6
在基于Debian的32位系統上:
$ /lib/i386-linux-gnu/libc.so.6
在基于Red Hat的64位系統上:
$ /lib64/libc.so.6
在基于Red Hat的32位系統上:
$ /lib/libc.so.6
下圖中是輸入glibc庫后的輸出結果樣例。
寫在最后
小編建議廣大用戶盡快給操作系統打補丁,并且提醒管理員在修補漏洞的同時,千萬不要忘記查看服務器或網站是否已經被入侵,是否存在后門文件等,盡量將損失和風險控制在可控范圍內。
參考文獻:
https://googleonlinesecurity.blogspot.ca/2016/02/cve-2015-7547-glibc-getaddrinfo-stack.html?m=1
https://isc.sans.edu/diary/CVE-2015-7547: Critical Vulnerability in glibc getaddrinfo/20737