專家解析Adobe Flash零時差漏洞攻擊技術
幾個星期前,網絡上有人發現了一個新的Adobe Acrobat/Reader零時差漏洞,沒多久就立刻出現專門利用此漏洞的攻擊。從技術角度來看,此一攻擊最引人注目的地方,在于它運用了返回指標漏洞攻擊(Return-Oriented Exploitation,簡稱 ROP)技巧來規避Windows的數據執行防止(DEP)安全機制。此外,它還使用了二階段的攻擊程序代碼(shellcode)來執行惡意軟件。其第一階段運用 ROP 技巧來加載第二階段的程序。第二階段才是惡意行為真正執行的地方,而且是透過JavaScript來將.PDF檔案內的程序代碼加載內存。
從這類威脅我們可以看出,專門攻擊漏洞的惡意軟件真是越來越精密。盡管Microsoft等廠商已盡量加入一些新的技術來防止漏洞攻擊,但看來黑客也不是省油的燈,使用者的日子也不會太好過。
靜態分析
當我們在分析.PDF檔案時,我們在內部發現了一個很可疑的FontDescriptor(字型描述)對象。(FontDescriptor 對象用來描述.PDF檔案內所用到的字型。)
這筆字型數據采用FlateDecode方式編碼。當我們將它解碼之后,我們看到一個SING表,并且立刻發現了可疑的內容。其uniqueName(獨特名稱)字段應該是一個采用7位ASCII編碼且用NULL字符結尾的27字符字符串。
但是,此處的數據卻超過28個字符。這就是典型的緩沖區溢出。
除錯
我們從靜態分析得知此漏洞攻擊使用了.PDF檔案中的哪一部分數據。接下來,我們要運用程序除錯器(debugger)來驗證我們的看法,并且看看它實際上如何運作。當這個惡意.PDF檔案在Adobe Reader中開啟時,會呼叫strcat函式。讓我們來看看此函數調用的來源緩沖區內容。
我們已看過「A8AAAAAA…」這段內容。這就是先前uniqueName字段的實際內容。而目的地緩沖區則是一個固定大小的堆棧。正是因此才會造成緩沖區溢出。
在緩沖區溢出之后,堆棧上的一個函式指標就會被覆寫成0x4a80cb38。接著后面會呼叫這個函式指標,攻擊者就因此獲得程序執行控制權。
返回指標漏洞攻擊
其實緩沖區溢出本身并不是太嚴重或太不尋常的問題。但是,這項攻擊利用了ROP技巧來避開Windows用來防止漏洞攻擊的DEP機制。DEP機制可以防止系統執行非可執行內存分頁中的內容。
但ROP技巧會覆蓋已加載的可執行碼來讓自己的程序執行,巧妙地避開了DEP機制。ROP背后的邏輯是,只要程序夠大,就能讓攻擊程序運用現有的程序代碼來組成一個程序代碼“串行”。
此攻擊的作者選擇了Adobe Reader的icucnv36.dll組件為目標。此組件并未設定使用地址空間配置隨機化(Address Space Layout Randomization,簡稱ASLR)功能,因此才會輕易成為 ROP 攻擊的目標。前述的地址(0x4a80cb38)就是icucnv36.dll內以下這段攻擊程序代碼的起點。
4a80cb38 81c594070000 add ebp,794h 4a80cb3e c9 leave 4a80cb3f c3 ret |
只要修改一下堆棧指針,這段程序代碼就會變成 ROP 串行的起點。后面接著的程序代碼則指向用來做為ROP串行的堆棧數據。堆棧數據內容則是使用惡意.PDF檔案內的JavaScript來加載內存內。以下是一段這項攻擊所用到的程序代碼:
框出來的部分經過一些置換和反跳位運算之后,最后在內存內是一個雙字組(double word)大小的數值:0x4a801064。
真正具備惡意行為的第二階段攻擊程序代碼一開始也是先由JavaScript加載內存內。在經過解碼之后,真正的程序代碼應該像下面這樣:
%u52e8%u0002%u5400%u7265%u696d%u616e%u6574%u7250 %u636f%u7365%u0073%u6f4c%u6461%u694c%u7262%u7261 %u4179%u5300%u7465%u6946 |
這是原生 x86 機器碼,用來執行真正的惡意攻擊。
回到堆棧指針調整好后的第一階段ROP程序,其程序代碼會搜尋icucnv36.dll的某些部分,并且呼叫幾個API函式:
呼叫CreateFileA來建立一個名為“iso88591”的檔案(檔名不重要)。
呼叫CreateFileMappingA,指定flProtect=0×40(讓檔案可執行)。
呼叫MapViewOfFile來映像剛才建立的檔案。
呼叫memcpy來將第二階段的程序代碼復制到緩沖區,也就是此映射共享檔案的開頭。
接著,程序跳到映像檔案所在的緩沖區開頭來執行。由于此區為可執行的內存,因此就能避開DEP保護機制。
【編輯推薦】