由Ghost漏洞引發的“血案”

wyzsk發表於2020-08-19
作者: 阿里雲安全 · 2015/02/03 22:18

0x00 背景


最近某安全公司發現的glibc gethostbyname buffer overflow漏洞,該漏洞被命名為ghost,其原因是glibc的Gethostbyname函式在處理傳入的畸形域名資訊作解析時導致堆溢位,眾多網路應用依賴glibc模組的將受到影響,現已經確認受影響的版本是glibc 2.2<=version<=2.17,但是在我們的安全研究人員在測試時觸發了另一個有意思的格式串漏洞,讓我們來看看具體過程。

0x01 分析細節


測試環境ubuntu glibc 2.12 python 2.6.6

當我們的研究人員在執行python如下程式碼時發現程式崩潰

#!python
import socket
socket.gethostbyname('0'*10000000)

enter image description here

enter image description here

讓我們看看漏洞觸發流程,上gdb看看

enter image description here

透過檢視異常資訊點發現,異常發生在如下程式碼處

enter image description here

在memcpy函式進行記憶體複製時出錯

enter image description here

透過分析發現,rdx是複製長度,rsi是源緩衝區,rdi是目的緩衝區,透過分析發現rsi是我們傳入的資料,而rdi這個地址不能訪問,所以memcpy函式進行複製操作時將會出現寫入目的地址空間失敗,透過分析發現這個地址未初始化,最終導致程式crash.

enter image description here

我們透過分析發現python語句

#!python
Import socket
Socket.gethostbyname(‘0’*10000000)

將會呼叫sscanf格式轉換字串’0’*10000000成整形資料“%d.%d.%d.%d”,我們透過分析glibc裡面的原始碼stdio-common/vfscanf.c發現,將會如下處理

enter image description here

關鍵問題發生在宏ADDW,如下程式碼是glibc 2.12

enter image description here

這裡程式碼的作用是把我們傳入的字串迴圈複製到棧上面去,alloca函式是開闢棧空間,我們知道預設情況下Linux的棧空間是8MB,當我們傳入的引數超長時,會導致棧空間耗盡,導致記憶體寫上溢,當我們寫入不可預知的未對映的記憶體時導致程式崩潰. 透過搜尋發現這個格式串漏洞在2.15版被修復

enter image description here

補丁程式碼如下:

enter image description here

補丁程式碼的處理邏輯是把傳入的資料複製到堆記憶體裡面去而不是在棧空間裡面。 https://sourceware.org/bugzilla/show_bug.cgi?id=13138

0x02 漏洞利用


該格式串漏洞很難利用,複製到的目的地址不可預測並且很難控制。

0x03 結論 & 引用


該漏洞會造成遠端crash,趕緊升級glibc吧。

感謝阿里安全研究團隊和漏洞分析團隊的努力

引用:

https://sourceware.org/git/?p=glibc.git;a=commit;f=stdio-common/vfscanf.c;h=3f8cc204fdd077da66ffc8e9595158b469e2b8e5

https://sourceware.org/git/?p=glibc.git;a=blob;f=stdio-common/vfscanf.c;h=7356eeb3626665a0524bbf1be37398ea22e05d7e;hb=6164128f1ca84eea240b66f977054e16b94b3c86

http://seclists.org/fulldisclosure/2015/Jan/111

source:http://blog.sina.com.cn/s/blog_e8e60bc00102vhz7.html

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章