亚洲小说春色综合另类小说-91精品麻豆人妻一区二区-久久精品国产亚洲av香蕉高-18禁黄网站禁片免费观看久久-中文字幕 日韩二区-成人av精品免费网-久久爱在线视频免费观看-中文字幕版日本麻豆-天天舔天天操天天操

數(shù)字經(jīng)濟的安全基石

申請試用

首頁 > 關于我們 > 安恒動態(tài) > 2019 > 正文

一個補丁引發(fā)的RCE: 對CVE-2019-1208的深入分析

閱讀量:

前言

CVE-2019-1208是趨勢科技的@elli0tn0phacker在今年6月發(fā)現(xiàn)的一個vbscript漏洞,報告中提到這個漏洞是通過補丁比對發(fā)現(xiàn)的,這引起了筆者的興趣。最近,筆者花了一些時間對該漏洞進行了比較詳細的研究。在這篇文章中,筆者將從漏洞成因、修復方案、利用編寫三個方面對該漏洞進行介紹。

讀者將會看到,代碼開發(fā)者是如何在修復舊漏洞時不經(jīng)意間引入新漏洞。在這個例子中,引入的還是一個非常嚴重的遠程代碼執(zhí)行漏洞。通過這個例子讀者也會發(fā)現(xiàn),有時候通過補丁比對就可以發(fā)現(xiàn)新漏洞。

該漏洞從2019年6月更新被引入,到2019年9月更新被修復,只存活了短短3個月,因此編寫這個漏洞的利用并無價值,筆者寫這個漏洞的利用只是為了概念驗證。

盡管微軟已經(jīng)在2019年8月的IE更新中全面禁用了vbscript,但出于安全性考慮,完整利用代碼不予公開。

?

漏洞成因

這是一個vbscript的UAF(Use After Free)漏洞,漏洞成因還要從微軟今年6月的補丁說起。

漏洞成因

微軟在2019年6月的vbscript更新中引入了下面幾個函數(shù):

?SafeArrayAddRef

?SafeArrayReleaseData

?SafeArrayReleaseDescriptor

?

引入SafeArrayAddRef的作用是為SafeArray提供一種類似引用計數(shù)的機制。

?

源碼中通過使用STL的 map將一些對象/數(shù)據(jù)指針(如pSafeArray和pvData)與一個int型的計數(shù)器進行綁定。

?

在VbsFilter和VbsJoin這兩個函數(shù)中,在調用實際的rtJoin和rtFilter前,會調用SafeArrayAddRef對相關指針的引用計數(shù)+1。調用完畢后,再調用SafeArrayReleaseData和SafeArrayReleaseDescriptor在map中將指針對應的計數(shù)-1,并將指針所對應的key從map中刪除。

?

開發(fā)者應該是用這種方式修復了一些UAF問題。但修復方案中沒有考慮到當Join/Filter傳入的數(shù)組中有類對象時,在Public Default Property Get這一潛在的回調中可以對數(shù)組進行操作(比如ReDim)。這樣,當調用完 rtJoin/rtFilter后返回VbsJoin/VbsFilter時,對應的pSafeArray/pvData指針已被更新,原先的設計是將之前已在Map中“注冊”的指針傳入后續(xù)的SafeArrayReleaseData/SafeArrayReleaseDescriptor進行引用計數(shù)減操作,但現(xiàn)在傳入SafeArrayReleaseData/SafeArrayReleaseDescriptor的指針均不在map中(因為被重新創(chuàng)建了)。這導致在調用RefCountMap::Decrement函數(shù)時,find方法找不到對應的key,函數(shù)直接返回0。這個返回結果被SafeArrayReleaseData/SafeArrayReleaseDescriptor理解為對應的指針的引用計數(shù)為0,從而將對應的SafeArray對象和數(shù)據(jù)銷毀。

?

具體地,開發(fā)者借助RefCountMap類實現(xiàn)了一個“偽引用計數(shù)機制”,通過一個map將所關心的SafeArray指針與一個int型計數(shù)器綁定起來,計數(shù)值只有0、1、不存在,三種情況。

?

相關操作函數(shù)的聲明如下:

RefCountMap::Decrement函數(shù)的偽代碼如下:

了解了這些知識后,回過頭去理解@elli0tn0phacker報告中的Figure 5就會容易多了。

?

PoC分析

@elli0tn0phacker給出的poc大致如下:

由于漏洞的存在,我們知道arr(0) = 1語句執(zhí)行前arr已被釋放,而且從代碼中可以看到arr是在回調中被ReDim的。那么arr到底存在哪里?為什么arr(0) = 1索引的是ReDim后被釋放的SafeArray,而不是Redim前的SafeArray?

這就涉及到 vbscript虛擬機的相關知識。

卡巴斯基實驗室的Boris Larin曾寫過一篇關于vbscript虛擬機的文章,并且開源了相關的調試插件。

在文章中,作者對vbscript虛擬機進行了比較細致的介紹。vbscript的所有代碼都會先被編譯為P-Code,隨后通過CScriptRuntime::RunNoEH對所有P-Code進行解釋執(zhí)行,CScriptRuntime對象的成員變量中存儲著解釋所需的許多信息,比較重要的幾個如下:

借助調試插件,我們可以得到 PoC代碼編譯后的P-Code:

?以下是上述用到的部分指令對應的字節(jié)碼(全部指令請參考Boris的插件源碼):?

從P-Code中可以看出, arr(0) = 1這句對應的指令索引的是本地變量棧(OP_CallLclSt, 0x25),Call Join(arr)這句對應的指令索引的也是本地變量棧(OP_LocalAdr, 0x19),從兩個指令名稱中我們可以猜測arr被存儲在本地變量棧上。?

?

在IDA Pro中對vbscript!CScriptRuntime::RunNoEH進行逆向,我們來看一下上述兩個指令解釋分支的匯編代碼:?

上述兩個分支都調用了CScriptRuntime::PvarLocal方法,再來看一下CScriptRuntime::PvarLocal方法的實現(xiàn):

可以看到CScriptRuntime::PvarLocal接收一個索引,并且基于CScriptRuntime對象+0x28或0x2C處的值進行偏移運算。調試時發(fā)現(xiàn)PoC兩處對arr的操作索引均為1,所以存儲arr的地址為:

poi(pCScriptRuntime + 0x28) - 0x10*1? ?

上述分析驗證了上面對于指令作用的猜想,PoC中每次使用arr變量時,都會傳入對應的索引去本地變量棧中進行訪問。

?

明白了arr的存取原理后,我們可以清晰地在調試器中觀察arr的變化過程,從而理解整個UAF的過程。

?

筆者在開啟頁堆后對PoC進行了調試。我們先將斷點下到OP_LocalAdr指令的解釋分支,可以看到Join(arr)執(zhí)行時訪問到的arr,命中斷點時ebx即為CScriptRuntime,調試時arr從本地變量棧(ebx+0x28)進行索引,讀者請留意下圖中藍色高亮的指針,ReDim語句執(zhí)行后它會發(fā)生變化。

我們對上圖中高亮數(shù)據(jù)(SafeArray指針)所在的內存下一個寫入斷點,觀察這個位置上數(shù)據(jù)的幾次變化過程。

?

第一次是在ReDim(OP_ArrNamReDim)執(zhí)行時,對之前arr的清理階段(OP_ArrNamReDim指令的解釋流程在后面“修復方案”一節(jié)中會進一步說明。):

第二次是在OP_ArrNamReDim執(zhí)行時,將新創(chuàng)建的arr復制到本地變量棧的對應內存處,可以看到藍色高亮處的指針已經(jīng)發(fā)生變化,此時的SafeArray已經(jīng)變?yōu)閯倓倓?chuàng)建的二維數(shù)組。

最后,我們將斷點下到OP_CallLclSt的解釋分支,目的是斷在arr(0) = 1這句對arr的訪問過程,由于“漏洞成因”所描述的設計上的問題,此時本地變量棧上的arr已經(jīng)被釋放:

追蹤到的釋放?;厮萑缦聢D,讀者可以看到,這個不當?shù)尼尫耪怯捎赟afeArrayReleaseDescriptor傳入了未在map注冊的指針所導致。

通過以上調試,讀者應該可以清晰感受到整個Use After Free過程。

?

修復方案

清楚漏洞成因后,我們來看一下微軟在9月更新中是如何修復該漏洞的。筆者用Bidiff工具比對了8月更新和9月更新兩個vbscript.dll,發(fā)現(xiàn)在rtJoin(rtFilter均類似,下面只以rtJoin進行說明)函數(shù)中,在對數(shù)組內的元素進行操作前后,加了一對SafeArrayLock/SafeArrayUnlock函數(shù):?

微軟采用對SafeArray加鎖的方式來修補這個由之前的補丁引入的問題。SafeArrayLock會令pSafeArr->cLocks的值+1。這樣,當在安裝9月補丁后再次打開PoC。由于前面的+1操作,就可以令ReDim指令無法得到正常執(zhí)行,我們來看一下具體的邏輯。

?

這里再引述一下上面提到的P-Code,可以看到ReDim arr(1, 1)這句語句對應的P-Code如下:?

筆者在調試器中跟了一遍OP_ArrNamReDim指令(0x0A) 的執(zhí)行邏輯,發(fā)現(xiàn)有如下幾個關鍵點:

有意思的是,調試前筆者以為這里的ReDim最終會調用oleaut32!SafeArrayRedim函數(shù),結果并沒有。

?

結合上述邏輯,當補丁中在操作Join傳入的數(shù)組前,SafeArrayLock令pSafeArr->cLocks從0變?yōu)?,從而在執(zhí)行ReDim arr(1, 1)對應的指令時,無法通過3.1.1這一步,新數(shù)組無法被創(chuàng)建,Join函數(shù)執(zhí)行完后本地變量棧中的數(shù)組指針不會得到更新,之前的UAF問題也就無從談起了。Filter函數(shù)的修復方案同上。

?

以下為上述過程中涉及到的函數(shù)調用及說明:

這個修復方案和CVE-2016-0189的修復方案思路一致。

?

利用編寫

@elli0tn0phacker在他的報告中已經(jīng)給出了這個漏洞的exploit編寫思路,但沒有公布完整代碼。作為概念驗證,筆者親手編寫了對應的exploit,以下對部分細節(jié)進行說明。

?

偽造超長數(shù)組

通過觸發(fā)漏洞,可以得到一塊大小為0x30的空閑內存。借助堆的特性,如果在Join函數(shù)執(zhí)行完后立即申請一些字符串長度為(0x30 - 4)的BSTR對象,就可以實現(xiàn)對被釋放內存的占位。減4是因為BSTR的字符串前面還有4字節(jié)的長度域,會一并申請。

實踐證明這里的操作還是比較簡單的,并不需要過多的堆風水技巧,下面是一個可以成功占位的代碼示例:

占位后,因為筆者已經(jīng)在字符串中構造了假的超長數(shù)組,當下次訪問arr時,成功占位的字符串會被解釋為SafeArray結構體,從而得到一個基地址為0,元素個數(shù)為0x7fffffff,元素大小為1的超長數(shù)組。

?

任意地址讀取

這部分,以及如何構造一塊可讀寫內存的步驟請參考@elli0tn0phacker的報告,相關步驟實現(xiàn)起來非常簡單,這里不再重復敘述。

?

Bypass ASLR

在前面的基礎上,就可以泄露一個指針對象以繞過ASLR,這里筆者采用的方法和和CVE-2019-0752一樣,泄露一個Scripting.Dictionary對象的虛表指針,具體操作如下:

?

虛函數(shù)劫持

若PoC要在windows 10上執(zhí)行,必須要繞過CFG。筆者最終采用了@elli0tn0phacker在他報告中提到的方法,即對CVE-2019-0752的利用方式稍作改動:

1.借助BSTR復制并偽造一個假的Dictionary虛表(fake_vtable),并改寫Dictionary.Exists函數(shù)指針為kernel32!WinExec,由于kernel32!WinExec是系統(tǒng)自帶函數(shù),因此可以繞過CFG檢測

2.借助BSTR復制并偽造一個假的Dictionary對象(fake_dict),將虛表替換為上述的假虛表,將WinExec的命令行參數(shù)寫入虛表指針后4字節(jié)開始的地址

3.將假的Dictionary對象所對應BSTR的type設為0x09,使之成為一個對象(VT_DISPATCH)

4.調用fake_dict.Exists,使控制流導向WinExec函數(shù),命令行參數(shù)在步驟2中已經(jīng)構造好

?

這個過程的示例代碼如下:

利用約束

這個漏洞利用在任意地址寫上有一些受限條件,@elli0tn0phacker已在他的報告中提到,這里也不再重復敘述。

?

這里提一個筆者編寫利用時遇到的問題,筆者一開始是在windows7 sp1 x86環(huán)境下寫的利用,代碼全部寫完后發(fā)現(xiàn)計算器無法彈出,一番調試后發(fā)現(xiàn),傳入WinExec函數(shù)的命令行參數(shù)無法得到正常解釋,原因也很簡單,來看一下某次win7調試時最終傳給WinExec的參數(shù):

出于利用構造的約束條件,命令行參數(shù)的前4個字符是由前面?zhèn)卧斓奶摫淼牡刂方忉尪鴣?,這種情況下很容易造成前4個字符里面有多余字符,因此WinExec也就不能按預期執(zhí)行后續(xù)的命令行。筆者一開始想到的將虛表偽造到0x20202020這個地址,這樣命令行參數(shù)的前4個字符可以被解釋為空格,不會影響整個命令行的解釋。但該漏洞中對指定地址的連續(xù)寫是受限的,筆者最終放棄了這個思路。

?

后來筆者將未加修改的exploit在win10環(huán)境試了一下,發(fā)現(xiàn)計算器可以成功彈出,以下為某次在win10下調試得到的參數(shù)及偽造的虛函數(shù)表:

筆者推測win10和win7下進程創(chuàng)建相關函數(shù)對命令行參數(shù)的處理存在一些差異,win10上的容錯性更高一點。

?

代碼執(zhí)行

最終,筆者成功在windows 10 1709 x86系統(tǒng)的2019年8月全補丁環(huán)境上彈出一個計算器:

?

參考資料

《Delving deep into VBScript》

《From BinDiff to Zero-Day: A Proof of Concept Exploiting CVE-2019-1208 in Internet Explorer》

《RCE WITHOUT NATIVE CODE: EXPLOITATION OF A WRITE-WHAT-WHERE IN INTERNET EXPLORER》

關閉

客服在線咨詢入口,期待與您交流

線上咨詢
聯(lián)系我們

咨詢電話:400-6059-110

產(chǎn)品試用

即刻預約免費試用,我們將在24小時內聯(lián)系您

微信咨詢
安恒信息聯(lián)系方式
中文字幕在线人妻视频-日本55丰满老熟妇厨房乱-日韩床上激情网站-日韩精品亚洲视频 | 在线日韩亚洲欧美-国产一区二区不卡视频在线观看-日本中文字幕观看地址-久久婷婷色视频 | 亚洲一区二区18禁-日韩人妻伦精品中文字幕-清纯唯美激情亚洲天堂-婷婷久久在线视频 | 欧美性高清一区二区三区视频-91人人妻人人澡人人澡-久久综合激情五月网-精品人妻中文字幕有码在线 | 99精品国产热久久91蜜凸-91人妻精品久久久久中文字幕-福利网站在线播放一区二区三区-久久6国产精品 | 日日碰狠狠添天天爽不卡欧美-99国产成人精品免费-17精品一区二区三区视频-欧美丰满少妇一区二区三区 | 中文字幕制服诱惑人妻熟女-91精品久久久久久久久久另类-亚洲欧美日韩在线高清直播-99热这里只有精品在线6 | 欧美日韩国产综合va视频在线-国产激情在线免费视频-精品婷婷久久久久-久久99老妇伦国产熟女 | 亚洲va国产va欧美va观看一-中文字幕av网站在线观看-久久99国产中文字幕-91精品国产91久久久久久久久久 | 久久久久成人国产-密臀久久精品久久久久酒店-久久国产999精品-九九视频在线免费视频一二区 | 日韩欧美亚洲国产高清-老熟妇一区二区-日本japanese少妇高清-亚洲综合久久五月天 | 亚洲国产精品97久久在线-欧美国产日韩一区二区三区在线观看-久久99中文字幕一区二区三区-久久青青精品视频 | 麻豆蜜桃91久久-久久av在线播放-人妻少妇一区二区三区四区-久久精品视频最新地址 | 日韩人妻av在线一区-国产又大又长又粗又硬-久久亚洲av精品-日韩中文字幕人妻制服丝袜欧美 | 成人91精品一区二区三区-色悠悠在线观看视频在线观看视频-91久久久久久久91-日韩av麻豆av蜜桃天美avav | 久久精品国产亚洲av忘忧草蜜臀-国内外av午夜在线-久久久久久综合久久久久久-欧美日韩亚洲精品内裤 | 色综合久久888-激情人妻系列视频-蜜桃视频一区二区精品-日韩亚洲三级在线 | 欧美日韩中文字幕视频-99欧美视频一区二区国产-999久久a精品合区久久久-91久久精品国产亚洲av麻 久久偷拍女人小便视频-国产欧美韩日在线观看-日韩美在线免费观看-日韩另类小视频 | 国产综合一区二区三区视频-91久久老司机视频-久久久久久久久人妻福利免费看-麻豆秘密入口av在线观看 | 大香蕉一本在线中文-日本熟妇人妻在线观看-日韩在线播放专区av-91精品久久久久久综合五月天 | 国产精品久久久久内射-久久久久久久久国产一级-日韩欧美免费成人-国产一区二区三区欧美一区 | 久久国产十八禁福利一区-日本中文字幕精品—区二区-欧美熟妇一区二区二区激情综合-天堂av在线中文版 | 国产成人精品亚洲av三亚-日本中文字幕高清在线视频-久久精品人人看人人爽-久久中文无字幕 | 国产一区二区三区免费在线-69精品久久久久久-999 在线精品视频-蜜桃臀久久久蜜桃臀久久久 | 国产免费高清av在线播放-精品人妻中文字幕区二区三区视频-91精品综合久久久久精-久久精品人妻一区二区三 | 久久狠狠综合激情五月天-成人国产av精品视频免费看-99精品久久久久久国产-天堂中文字幕色婷婷 | 12至18禁精品av在线播放-久久99精品久久久野外直播软件-激情综合网五月婷婷-97se婷婷久久久婷婷久久综合九色 | 中文字幕制服诱惑人妻熟女-91精品久久久久久久久久另类-亚洲欧美日韩在线高清直播-99热这里只有精品在线6 | 2018日本最新中文字幕视频-日韩人妻精品av中文字幕在线-午夜久久福利网-97超碰中文字幕一区二区 精品欧美熟妇高潮喷-成人国产九色最新91-久热青青精品视频在线观看-亚洲综合五月色婷婷 | 中文字幕制服诱惑人妻熟女-91精品久久久久久久久久另类-亚洲欧美日韩在线高清直播-99热这里只有精品在线6 | 日韩 亚洲 欧美 综合 图片-国产又大又黄又粗-日韩美女后入式插片-熟女人妻精品在线 | 999热国内精品在线免费视频-日韩久久精品日日骚成人av-久久久久一区三区四区-国产不卡一区二区三区视频 | 婷婷六月激情综合一区-亚洲麻豆一级片-色午夜高清在线观看-欧美韩国亚洲日本一区 | 久久久久视频在线观看-日本在线影视中文字幕-中文字幕一区二区三区四区谷希原-麻豆一级看片免费现在观看 | 亚洲欧美国产另类一区二区-欧美日韩情色片-一区二区三区中文字幕在线观看-中文字幕一区二区人妻丝袜 | 99麻豆久久久国产精品免费-国产色噜噜噜在线精品-日韩美在线免费视频-日韩人妻熟女中文字幕乱码 中文字幕av久久爽三区-超碰在线夜色www-av日韩字幕在线-日本黄页网站免费大全在线观看 | 精品视频一卡二卡三卡-欧美最猛黑人xxxx黑人-国产又粗又黄又爽又硬的视频-亚洲精品少妇中文字幕 五月婷婷亚洲综合网-久久精品一区二区三区蜜臀-久久精品丝袜美腿诱惑-粉嫩av一区二区三 | 精品熟女人妻一区=区-国产一区二区三区免费av在线-国产精品一线二线三线精华液-久久影视****高清 | 亚洲精品乱码久久久久久韩国-久操人妻在线视频免费观看-久久久久亚洲av毛片大全软件-麻豆文化传媒精品一区观看 | 国产成人精品国内自产拍-亚洲欧美日韩国产片-久久久久婷婷婷婷婷婷-日韩中文字幕综合资源网 | 人妻久久一区二区三区蜜桃-久久播午夜av-国产欧美日韩综合专区-午夜老司机在线视频 |