Windows,Linux等作業系統支援多種映像格式:Bmp, GIF, JPG, ANI, PNG etc.檔案格式眾多,代碼複雜易找到漏洞 Windows中很多映像格式解析的實現方式與開原始碼及其相似,經常發現同一bug;(Why?)
目標:用戶端的漏洞?
用戶端易受攻擊:IE,Outlook,Firefox,MSN,Yahoo etc.
駭客利益的驅使:Botnet,Visa,CD-Key,DDOS etc.
發現漏洞較容易(More 0day?):較容易發現,新的領域
為什麼挖掘映像格式中的漏洞?
Windows,Linux等作業系統支援多種映像格式:Bmp, GIF, JPG, ANI, PNG etc.檔案格式眾多,代碼複雜易找到漏洞
Windows中很多映像格式解析的實現方式與開原始碼及其相似,經常發現同一bug;(Why?)
駭客們並沒有在每種格式中發現漏洞,沒有足夠的“eyes”關注
從安全人員的角度:
格式眾多,演算法複雜容易出現漏洞
影響範圍極廣跨應用跨平台,例如:
Windows 平台上任何解析jpg 的應用,office,outlook,IE...GDIPLUS.dll
Windows 核心實現對Ani 的支援,通過ie 不需要使用者互動操作。誰會懷疑網頁上的指標檔案?
PNG Msn, libpng 很多開源軟體
隱蔽性嚴重威脅使用者安全
從駭客的角度:
如果利用映像格式觸發的漏洞,會降低了受害者的警覺性,易利用社交工程學。蠕蟲擴散可能利用一些非常容易讓人警惕的檔案格式,但我們現在討論的是圖片格式jgp, png, ani...不容易讓人引起懷疑
多種攻擊媒介,利於駭客攻擊:通過網頁,郵件可以穿越防火牆的保護,IDS不易檢查,需要對各種格式,協議進行解析才能檢查出漏洞攻擊。
映像的基本格式
流格式由很多段構成,段裡面又由標記,參數(漏洞點),資料區段構成
還可能有段裡面再嵌套段(漏洞點)
Gif,Ani可能包含很多幀,重新整理率,幀的索引(漏洞點)
可能會有標記圖形模式的bit-map,可能會有邏輯上的錯誤png
http://scary.beasts.orghttp://security.chinaitlab.com/CESA-2004-001.txt
JPG格式中的漏洞
先來一個實際的例子:
GDIPlus.DLL漏洞MS04-028 Nick DeBaggis
影響巨大,攻擊很多
漏洞產生原因:
JPEG格式中的注釋段(COM)由0xFFFE開始(標記)+2位元組得注釋段位元組數(參數) +注釋(資料)構成。因為位元組數這個參數值包含了本身所佔的2位元組,所以GDIPLUS.dll在解析jpg格式檔案中的注釋段時會把這個值減去2,如果這個值設定成0,1就會產生整數溢出。
JPG格式中的漏洞
是不是覺得很相似?
2000 Solar Designer 發現了Netscape 瀏覽器的JPEG 解析漏洞,與Nick DeBaggis 發現的漏洞原理是相同的。
http://www.openwall.com/advisories/OW-002-netscape-jpeg.txt
另一個相似的例子
Stefan Esser發現的XBOX Dashboard local vulnerability,該漏洞存在於XBOX Dashboard對.wav格式和.xtf格式檔案的解析上,雖然說不是圖形格式但漏洞原理卻相同。
細節:同樣存在一個size參數這次是它本身的大小是4位元組,所以當size值為0-3時就會發生整數溢出。
疑問
疑問:為什麼會一再出現同類型的漏洞?
是否程式員們從概念上忽略了某些問題?
為什麼都是整數溢出漏洞?
此類漏洞的本質是什麼?
是否還有這種漏洞?
問題的本質
這些檔案格式是由很多“段”構成的資料流,而每個段由:標記,參數,資料等結構構成,在程式解析這些檔案格式的時候會依據“標記”來確認段,並讀勸參數” 進行一定的運算,再依據這些參數來處理隨後緊跟的“資料”。以上提到的幾個漏洞的產生原因就是在對參數進行運算的時候相信了檔案輸入的參數沒有進行確認而導致的。
思維擴充
不要相信使用者的輸入,同樣不要相信檔案的輸入;
包括標記,錯誤的標記也會導致問題
包括參數,詳細檢查輸入參數
包括資料,資料裡面可能還嵌套著另一個“段”
思維擴充的結果
Venustech AD-Lab:Windows LoadImage API Integer Buffer overflow
影響極為廣泛: bmp,cur,ico,ani格式的檔案都受影響。
描述:
WINDOWS的USER32庫的LoadImage系統API 存在著整數溢出觸發的緩衝區溢位漏洞,這個API允許載入一個bmp,cur,ico,ani格式的表徵圖來進行顯示,並根據圖片格式裡說明的大小加4來進行資料的拷貝,如果將圖片格式裡說明的大小設定為0xfffffffc-0xffffffff,則將觸發整數溢出導致堆緩衝區被覆蓋。攻擊者可以構造惡意的bmp,cur,ico,ani格式的檔案,嵌入到HTML頁面,郵件中,發送給被攻擊者,成功利用該漏洞則可以獲得系統的許可權。
LoadImage API 整數溢出漏洞分析
代碼:
.text:77D56178 mov eax, [ebx+8] //Direct read our size here:P
.text:77D5617B mov [ebp+dwResSize], eax
.text:77D5617E jnz short loc_77D56184
.text:77D56180 add [ebp+dwResSize], 4 //add 4 int overflow...
.text:77D56184
.text:77D56184 loc_77D56184: ; CODE XREF: sub_77D5608F+EF_j
.text:77D56184 push [ebp+dwResSize] //allocate a wrong size
.text:77D56187 push 0
.text:77D56189 push dword_77D5F1A0
.text:77D5618F call ds:RtlAllocateHeap
總結:轉換思路後找到這個加4的漏洞,同樣的類型,信任“檔案”輸入。
思維擴充的結果
EEYE 2004:Windows ANI File Parsing Buffer Overflow
堆棧漏洞極易利用,攻擊方法隱蔽。
原理:
相信“ 檔案” 輸入參數,沒做檢查直接用作memcpy 的參數。
PNG漏洞,不同的模式
邏輯問題1:
EEYE PNG (Portable Network Graphics) Deflate Heap Corruption Vulnerability
原因:對 Length 碼 #286 and #287沒有做正確的處理,導致解壓程式認為長度是0
do { *dest = *src; ++dest; ++src; } while (--len);
邏輯問題2:libPNG 1.2.5 堆疊溢位
代碼:
if (!(png_ptr->mode & PNG_HAVE_PLTE)) {
/* Should be an error, but we can cope with it */
g_warning(png_ptr, "Missing PLTE before tRNS"); }
else if (length > (png_uint_32)png_ptr->num_palette) {
g_warning(png_ptr, "Incorrect tRNS chunk length");
g_crc_finish(png_ptr, length);
return;
}
分析:代碼編寫的邏輯錯誤,錯誤的使用了else if.
相似漏洞:MSN png 漏洞,Media player png 漏洞
邏輯問題的總結
非常容易出現在複雜的檔案格式處理中
容易出現在壓縮,解壓代碼中:需要處理很多長度,大小相關的參數。
這種漏洞不一定是緩衝區溢位,也可能是越界訪問等等
想象漏洞
發現漏洞有時候是一種想象的過程
例子1:
Venustech ADLab:Microsoft Windows Kernel ANI File Parsing Crash Vulnerability
介紹:ANI是WINDOWS 支援的動畫游標格式,在ANI是由多個普通的游標檔案組成一個動畫,其中ANI檔案的頭處會標記是幾個表徵圖frame,WINDOWS 的核心在顯示光線標的時候並未對該值進行檢查,如果將這個數字設定為0,會導致受影響的WINDOWS系統計算出錯誤的游標的地址並加以訪問,觸發了核心的藍屏崩潰。不僅僅是應用使用ANI檔案時會觸發,只要在EXPLORER下開啟ANI檔案存在的目錄就會觸發。攻擊者也可以發送游標的檔案,引誘使用者訪問含有惡意游標顯示的頁面,以及發送嵌入游標的HTML郵件,導致被攻擊者系統藍屏崩潰。
原理:在計算frame地址的時候失敗。
邏輯問題2:libPNG 1.2.5 堆疊溢位
代碼:
if (!(png_ptr->mode & PNG_HAVE_PLTE)) {
/* Should be an error, but we can cope with it */
g_warning(png_ptr, "Missing PLTE before tRNS"); }
else if (length > (png_uint_32)png_ptr->num_palette) {
g_warning(png_ptr, "Incorrect tRNS chunk length");
g_crc_finish(png_ptr, length);
return;
}
分析:代碼編寫的邏輯錯誤,錯誤的使用了else if.
相似漏洞:MSN png 漏洞,Media player png 漏洞
邏輯問題的總結
非常容易出現在複雜的檔案格式處理中
容易出現在壓縮,解壓代碼中:需要處理很多長度,大小相關的參數。
這種漏洞不一定是緩衝區溢位,也可能是越界訪問等等
想象漏洞
發現漏洞有時候是一種想象的過程
例子1:
Venustech ADLab:Microsoft Windows Kernel ANI File Parsing Crash Vulnerability
介紹:ANI是WINDOWS 支援的動畫游標格式,在ANI是由多個普通的游標檔案組成一個動畫,其中ANI檔案的頭處會標記是幾個表徵圖frame,WINDOWS 的核心在顯示光線標的時候並未對該值進行檢查,如果將這個數字設定為0,會導致受影響的WINDOWS系統計算出錯誤的游標的地址並加以訪問,觸發了核心的藍屏崩潰。不僅僅是應用使用ANI檔案時會觸發,只要在EXPLORER下開啟ANI檔案存在的目錄就會觸發。攻擊者也可以發送游標的檔案,引誘使用者訪問含有惡意游標顯示的頁面,以及發送嵌入游標的HTML郵件,導致被攻擊者系統藍屏崩潰。
原理:在計算frame地址的時候失敗。
例子2:
Venustech ADLab:Microsoft Windows Kernel ANI File Parsing DOS Vulnerability
介紹:ANI是WINDOWS 2000支援的動畫游標格式,在ANI是由多個普通的游標件組成一個動畫,其中ANI檔案的頭處會標記每FRAME切換的頻率,該值越小切換的速度越快,WINDOWS 的核心在切換游標FRAME的時候並未對該值進行檢查,如果將這個數字設定為0,受影響的WINDOWS的核心會陷入核心的死結,不再響應任何使用者介面的操作。該漏洞觸發必須要在使用ANI檔案的應用中才能觸發,攻擊者引誘使用者訪問含有惡意游標顯示的頁面,以及發送嵌入游標的HTML郵件,導致被攻擊者系統核心死瑣。
原因:沒有考慮重新整理頻率是0的情況。
總結
下溢:Size參數小於自身所佔大小
上溢:Size加上一個正整數值產生上溢
直接作為參數輸入memcpy類函數
非法參數導致地址訪問越界
多種邏輯上的錯誤
充分發揮想象:重新整理率?
總結
安全提示:
檔案格式是攻擊者的另一種輸入渠道,同樣不要信任從檔案讀取的資料
解析檔案格式時應該對參數進行充分的檢查
同樣需要想象力,需要考慮到每種可能的情況
原文出自【位元網】,轉載請保留原文連結:http://sec.chinabyte.com/392/9110892.shtml