IE腳本漏洞CVE-2018-8653分析
最近,微軟修補了Internet Explorer腳本引擎中一個可能導致遠程代碼執行的關鍵漏洞。該漏洞正在野外被利用,它最初由谷歌威脅分析小組的研究人員報告。微軟發布了一個例外補丁,在正常的補丁周期之前修復了該漏洞。McAfee產品在補丁程序發布後不久就做出更新,以便檢測此威脅。
遠程攻擊者可以通過特製網頁針對Internet Explorer 9到11,而惡意網路上的本地攻擊者也可以針對使用存在漏洞的相同腳本引擎(jscript.dll)的Web代理自動發現服務。Microsoft Edge不受影響;但是,在應用Microsoft的安全補丁程序之前,包含腳本引擎的其他Windows應用程序可能容易受到攻擊。
一、前言
可以遠程或本地觸發的針對Internet Explorer的漏洞是網路犯罪分子破壞許多未打補丁的計算機的主要工具。這就是犯罪分子通常將這些漏洞整合到漏洞利用工具包中的原因,這些工具包會傳播惡意軟體或針對受感染的主機進行其他惡意活動。漏洞利用工具包的威脅是跟蹤此類漏洞並確保及時部署所有安全補丁的一個原因。2018年,在Microsoft腳本引擎(Internet Explorer或Edge)中發現了100多個內存損壞漏洞。有關詳細信息,請訪問MITRE網站(MITRE website)。 (在縱深防禦方面,McAfee Endpoint Security或McAfee Host Intrusion Prevention等產品可以檢測並消除此類威脅,直到打上補丁。)
一旦發布了CVE ID,網路犯罪分子需要幾周(在某些情況下幾天)將其集成到他們的漏洞利用工具包中。例如,CVE-2018-8174最早是在4月底由兩組威脅研究人員向微軟報告的,他們觀察到了它在野外的利用。微軟在一周內(5月初)發布了一份公告。同時,研究人員發表了他們對該漏洞的安全性分析。僅僅兩周後,一個PoC漏洞利用被公開發布。在接下來的幾周內,漏洞利用工具包RIG和Magnitude集成了他們的武器化版本的漏洞利用。 (可在此處找到更詳細的時間表。)
網路犯罪分子花了不到一個月的時間就將微軟最初披露的漏洞武器化;因此,了解這些攻擊媒介所構成的威脅至關重要,並確保採取對策措施以便在威脅造成任何損害之前制止它。
二、技術細節
IE腳本引擎jscript.dll是經過大量審核的代碼庫:
·https://googleprojectzero.blogspot.com/2017/12/apacolypse-now-exploiting-windows-10-in_18.html
·https://www.exploit-db.com/search?q=jscript
毫無疑問,可利用的漏洞正變得越來越異彩紛呈。這是CVE 2018-8653的情況,它採取了三種看似無辜的行為,並將它們變成了一種use-after-free漏洞。Microsoft特定的擴展會觸發一個很少探索的代碼路徑,該路徑最終行為不當並使用不常見的參數調用常規函數。這導致在野外利用的use-after-free條件。
枚舉器對象:此漏洞的入口點是Microsoft特定的擴展,即枚舉器對象。它提供了一個API來枚舉屬於Windows world (主要是ActiveX組件,例如用於列出系統上驅動器的文件系統描述符)的不透明對象。但是,它也可以在JavaScript數組上調用。在這種情況下,可以照常訪問數組成員,但以這種方式創建的對象在內存中的存儲方式略有不同。這就會引發有趣的副作用。
意外的副作用:覆蓋ActiveX對象prototype成員最初看起來無害,但可以利用它來探索不可訪問的代碼路徑。
使用「instanceof」關鍵字時,我們可以看到關鍵字的右側需要一個函數。但是,對於特製的對象,instanceof調用成功,更糟糕的是,我們可以控制正在執行的代碼。
在特製的ActiveX對象上調用instanceof的邊緣情況使我們有機會從我們控制的回調中運行自定義JavaScript代碼,這通常是容易出錯的情況。
攻擊者成功地將這個bug變成了一個use-after-free的狀態,我們將在下面看到。
利用漏洞:無須深入了解細節(請參閱本文檔後面的PoC部分以獲取更多信息),此漏洞可以轉換為primitive的「delete this」類型,類似於之前報告的漏洞。當回調函數(在前面的例子中為「f」)被調用時,關鍵字「this」指向eObj.prototype。如果我們將其設置為null然後觸發CollectGarbage,則可以釋放支持該對象的內存並在以後回收。但是,正如Project Zero漏洞報告(Project Zero bug report)中所提到的,為了成功,需要在釋放內存之前清除整個變數塊。
例外補丁:微軟發布了一個未安排的?丁來修復此漏洞。對我們來說,通常的做法是查看修補程序之前和之後發生的變化。有趣的是,這個補丁改變了嚴格的最小位元組數,而DLL的版本號保持不變。
使用流行的比對工具Diaphora,我們比較了Windows 10 x64位(功能版本1809)的jscript.dll。
我們可以看到只修改了一些功能。除了一個指向與數組相關的函數。那些可能是針對CVE 2018-8631的補丁(jscript!JsArrayFunctionHeapSort越界寫入)。剩下的唯一一個經過實質性修改的是NameTbl::InvokeInterna。
Diaphora為我們提供了此函數兩個版本彙編代碼的差異。在此情況下,使Ida Pro中並排比較功能,更容易查看已更改的內容。快速瀏覽函數的末尾會顯示兩次調用GCRoot::~GCRoot(對象GCRoot的析構函數)。
看看~GCRoot的實現,我們看到它與編譯器在舊版本DLL中創建的函數內聯的代碼相同。
在新版本的DLL中,此函數被調用兩次;在未修補的版本中,代碼只被調用一次(由編譯器內聯,因此沒有函數調用)。用C 的說法,~GCRoot是GCRoot的析構函數,所以我們可能想找到GCRoot的構造函數。一個簡單的技巧是注意魔術偏移0x3D0,查看該值是否在其他地方使用。我們發現它靠近同一個函數的頂部(未修補的版本在左側):
深入研究jscript.dll垃圾收集的細節超出了本文的範圍,所以讓我們做一些假設。在C / C#中,GCRoot通常會設計一個模板來跟蹤指向正在使用的對象的引用,因此那些沒有CollectGarbage。這看起來好像我們將堆棧地址(也就是局部變數)保存到GCRoot對象列表中,以告訴CollectGarbage不要收集其指針位於堆棧上那些特定位置的對象。事後看來,這是有道理的;我們能夠「delete this」,因為「this」沒有被垃圾收集器跟蹤,所以現在Microsoft確保將該堆棧變數專門添加到被跟蹤的元素中。
我們可以通過跟蹤instanceof的調用來驗證這個假設。事實證明,在調用我們的自定義「isPrototypeOf」回調函數之前,對NameTbl :: GetVarThis的調用將指針存儲在新的「受保護」堆棧變數中,然後調用ScrFncObj :: Call來執行我們的回調。
查看`instanceof`中的意外行為:好奇的讀者可能想知道為什麼可以在自定義對象而不是函數上調用instanceof(如前所述)。在JavaScript中調用instanceof時,會在場景後面調用CScriptRuntime :: InstOf函數。早期,該函數有兩種不同情況。如果變數類型是0x81(堆上JavaScript對象的寬泛類型),那麼它調用一個虛函數,如果可以調用該對象,則返回true / false。另一方面,如果類型不是0x81,則遵循不同的路徑;它嘗試自動解析prototype 對象並調用isPrototypeOf。
0x81路徑:
不為0x81時的路徑:
三、PoC
現在我們已經看到了bug的來龍去脈,讓我們來看一個簡單的PoC,它展示了use-after-free行為。
首先,我們創建了幾個數組,以便分配所有可以預分配的數據,並且堆在處於準備狀態以供空閑後使用。
然後,我們聲明我們的自定義回調並觸發漏洞:
出於某種原因,需要釋放對象數組並在下一步利用之前CollectGarbage。這可能是由於釋放ActiveX對象的一些副作用。當我們將「1」分配給reallocPropertyName屬性時,將回收內存。該變數是一個魔術字元串,將被複制到最近釋放的內存中以模仿合法變數。它的創建如下所示:
0x0003是一個變數類型,它告訴我們接下來的值是一個整數,並且就是1337。字元串必須足夠長,以觸發與最近釋放的內存塊相同或相似大小的分配。
總而言之,JavaScript變數(這裡是RegExp對象)存儲在一個塊中;當釋放塊中的所有變數時,塊本身被釋放。在適當的情況下,新分配的字元串可以代替最近釋放的塊,並且因為「this」仍然在我們的回調中懸空,它可以用於某種類型的混淆。(這是攻擊者使用的方法,但超出了本文的範圍。)在此示例中,代碼將列印1337而不是空的RegExp。
四、MITRE分
此漏洞的基本分數(CVSS v3.0)為7.5(高),影響分數為5.9,可利用性分數為1.6。
五、總結
CVE-2018-8653針對Internet Explorer的多個版本以及依賴於相同腳本引擎的其他應用程序。攻擊者可以在未修補的主機上從特製的網頁或JavaScript文件中執行任意代碼。即使最近微軟修復了這個漏洞,我們也可以預見漏洞利用工具包很快部署這個關鍵漏洞的武器化版本,利用它來針對剩餘的未打補丁的系統。本文中的技術分析能為防禦者提供足夠的信息,以確保他們的系統能夠抵禦威脅並知道哪些可以作為攻擊的切入點。可以利用McAfee安全產品為此威脅提供特定的「虛擬補丁」,直到可以部署完整的軟體補丁,同時可以使用當前的通用緩衝區溢出保護規則來針對此漏洞和類似漏洞進行指紋攻擊嘗試。


※如何提取包括媒體文件、位置和文檔在內的全部iCloud內容
※看!研究人員演示如何攻破加密貨幣硬體錢包的安全防線
TAG:嘶吼RoarTalk |