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

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

首頁 > 關(guān)于我們 > 安恒動(dòng)態(tài) > 2020 > 正文

一個(gè)指針引發(fā)的“血案”

閱讀量:

腳本引擎開發(fā)者在設(shè)計(jì)GC(Garbage Collect,簡(jiǎn)稱GC)時(shí)追蹤指針不善導(dǎo)致的UAF(Use-After-Free),是一類常見的漏洞。本文通過一個(gè)例子來向讀者介紹這類漏洞的成因與分析思路。

漏洞描述

CVE-2018-8353是谷歌的Ivan Fratric發(fā)現(xiàn)的一個(gè)jscript漏洞,該漏洞在2018年8月被修復(fù)。這是一個(gè)UAF漏洞,Ivan Fratric在披露頁清晰地描述了該漏洞的成因:

通俗一點(diǎn)說就是RegExp類的lastIndex成員沒有被加入GC追蹤列表,如果給它賦值,在GC時(shí)會(huì)導(dǎo)致lastIndex處存儲(chǔ)的指針變?yōu)閼掖怪羔?。后續(xù)再訪問lastIndex時(shí),即造成一個(gè)典型的Use-After-Free場(chǎng)景。

jscript模塊目前已發(fā)現(xiàn)多個(gè)類似漏洞,例如CVE-2017-11793,CVE-2017-11903,CVE-2018-0866,CVE-2018-0935,CVE-2018-8353,CVE-2018-8653,CVE-2018-8389,CVE-2019-1429

本文試圖通過CVE-2018-8353一窺這類漏洞的成因,并在此基礎(chǔ)上分析谷歌PoC中的信息泄露利用代碼。讀者將會(huì)看到一個(gè)GC導(dǎo)致的UAF如何被轉(zhuǎn)化為高質(zhì)量的信息泄露漏洞。

?

PoC

以下為Ivan Fratric給出的PoC,下一小節(jié)將通過該P(yáng)oC分析漏洞成因。

UAF

@0Patch團(tuán)隊(duì)已通過補(bǔ)丁分析發(fā)現(xiàn),x86下lastIndex位于RegExpObj對(duì)象的+A8偏移處,如下:

現(xiàn)在RegExpObj::Create函數(shù)內(nèi)下斷點(diǎn),在RegExpObj對(duì)象創(chuàng)建完成后,對(duì)其偏移+A8處下一個(gè)硬件寫入斷點(diǎn),這個(gè)偏移處存儲(chǔ)一個(gè)VAR結(jié)構(gòu)體,此結(jié)構(gòu)體在x86下大小為0x10。重點(diǎn)觀察+B0處的數(shù)據(jù)變化。

為了更清晰地解釋成因,筆者并沒有開啟頁堆,但開啟了用戶模式下堆申請(qǐng)的?;厮?,以下為調(diào)試日志:

重占位

到這里已經(jīng)獲得了一個(gè)非常好的UAF,接下來的問題是:如何使用它?

從調(diào)試日志中可以看出,用來存儲(chǔ)VAR變量的內(nèi)存塊是從GcBlockFactory::PblkAlloc申請(qǐng)的,x86下其申請(qǐng)大小固定為0x648(《Garbage Collection Internals of JScript》這篇文章有解釋為什么x86下這個(gè)大小是0x648):

如果要重用被釋放的內(nèi)存,得在GC后迅速用大小為0x648的內(nèi)存申請(qǐng)去占用之。如何做到?

一個(gè)比較好的方法是借助NameList。jscript對(duì)象在創(chuàng)建成員變量時(shí),如果成員變量的名稱過長(谷歌的文章中說這個(gè)長度閾值為4),會(huì)在NameList::FCreateVval函數(shù)內(nèi)單獨(dú)申請(qǐng)內(nèi)存,以存儲(chǔ)對(duì)應(yīng)的成員變量,并且會(huì)以第一個(gè)成員名稱的長度去申請(qǐng)?zhí)囟ù笮〉膬?nèi)存,而相關(guān)計(jì)算公式是固定的。

通過逆向調(diào)試,可以得到x86下的計(jì)算公式:

現(xiàn)在,令alloc_size=0x648,解上述方程,可得到x=0x178(0n376)。于是可以通過下面的代碼重用被釋放的內(nèi)存:

在調(diào)試器中觀察驗(yàn)證重用:

從UAF到信息泄露

前一小節(jié)已經(jīng)在合適的時(shí)機(jī)控制了被Free的內(nèi)存,接下來要哦那個(gè)過這個(gè)UAF漏洞實(shí)現(xiàn)信息泄露,以得到被重用內(nèi)存的起始地址。

NameList::FCreateVval點(diǎn)

NameList::FCreateVval函數(shù)內(nèi)在申請(qǐng)成員變量名內(nèi)存時(shí),若成員名長度超過一定值,就會(huì)額外申請(qǐng)內(nèi)存去存儲(chǔ)這些名稱。第一個(gè)成員名可以用來控制申請(qǐng)的內(nèi)存大小,相關(guān)計(jì)算過程已經(jīng)在前面說明。后面的成員名稱只要長度合適,就可以在第一個(gè)成員名稱初始化時(shí)申請(qǐng)的內(nèi)存中使用剩余的部分,從而用來布控內(nèi)存。

在x86環(huán)境下,通過逆向NameList::FCreateVval函數(shù),發(fā)現(xiàn)每個(gè)成員名稱前面會(huì)額外留0x30大小的空間作為頭部,用于初始化各種數(shù)據(jù)。每次成員名稱進(jìn)行申請(qǐng)時(shí),還會(huì)按照下圖的計(jì)算公式按4字節(jié)對(duì)齊并保存與返回相關(guān)偏移:

整個(gè)計(jì)算公式比較復(fù)雜,但設(shè)計(jì)思路很簡(jiǎn)單,筆者在這里描述一遍,讀者大致了解即可:x86下,第一個(gè)成員名初始化時(shí),先申請(qǐng)(2x+0x32)*2+4的內(nèi)存大小,得到內(nèi)存后,最初的0x30作為頭部使用,用來初始化各種數(shù)據(jù),包括本次字符串長度,指向下一個(gè)成員名頭的指針(這個(gè)指針會(huì)后面的成員名初始化時(shí)被更新),然后因?yàn)槭堑谝粋€(gè)成員,按照公式直接加4字節(jié)進(jìn)行對(duì)齊,所以從前面的調(diào)試日志也可以看到,第一個(gè)成員名從+0x34開始被復(fù)制。只要第一次申請(qǐng)的內(nèi)存空間夠,第二個(gè)成員名按照base+offset+4的方式進(jìn)行內(nèi)存地址獲取,然后前0x30又是頭部,接著再開始復(fù)制,以此類推。

?

泄露被重用內(nèi)存首地址

接下來是泄露被重用內(nèi)存的首地址。

由于被重用的內(nèi)容之前存儲(chǔ)著lastIndex引用的VAR數(shù)據(jù),所以只要用長度及內(nèi)容合適的字符串設(shè)計(jì)類成員名稱,就可以控制指定地址處的VAR結(jié)構(gòu)。

從這里開始,使用Ivan Fratric在附件中給出的infoleak.html代碼,為便于展示,去除了部分注釋:

name1用來申請(qǐng)大小為0x648的內(nèi)存。name2可調(diào)節(jié),用來對(duì)齊。name3用來指定類型,以泄露特定偏移處的一個(gè)指針,這個(gè)后面再會(huì)提及。name4用來布控0x1337對(duì)應(yīng)的VAR,用于jscript代碼中的條件判斷。

上面的小節(jié)中只關(guān)心了name1,現(xiàn)在開始來具體設(shè)計(jì)name4,name3,name2。

  • 鎖定偏移值

首先得計(jì)算垂懸指針指向的VAR結(jié)構(gòu)在被重用內(nèi)存的偏移值。Ivan Fratric的適配的是x64的版本,原poc在筆者的環(huán)境中運(yùn)行后0x1337對(duì)應(yīng)的i為十進(jìn)制的115。

x64與x86的原理一致,以x86的版本進(jìn)行說明。既然x64環(huán)境中對(duì)應(yīng)的i為115。x32環(huán)境中,也以115為例進(jìn)行偏移計(jì)算。在上述代碼中在第115個(gè)RegExpObj對(duì)象創(chuàng)建時(shí)下斷點(diǎn),相關(guān)方法在前面UAF小結(jié)已經(jīng)描述,這個(gè)偏移很容易計(jì)算得到。

筆者的環(huán)境中這個(gè)偏移每次固定為0x3d8,如下:

  • 設(shè)計(jì)name

現(xiàn)在來設(shè)計(jì)name,在每個(gè)成員名稱初始化時(shí),都會(huì)有0x30的頭部,在這個(gè)頭部的+0x24處是一個(gè)指針(這個(gè)指針要到初始化下一個(gè)成員名時(shí)才會(huì)被初始化),指向下一個(gè)變量名的0x30頭部,下圖中字體為紅色的即為這些指針。如果能讀取其中一個(gè)指針,減去其相對(duì)內(nèi)存起始地址的偏移,就可以得到被重用內(nèi)存的首地址。

下圖中字體顏色為橙黃的是被拷貝的成員名稱,每個(gè)名稱最后會(huì)多拷貝兩個(gè)0x00。字體顏色為藍(lán)色的是每個(gè)成員名稱的實(shí)際長度(轉(zhuǎn)化為unicode后的長度)。字體顏色為紅色上面已經(jīng)進(jìn)行解釋。字體背景為灰色的一個(gè)個(gè)0x30內(nèi)存區(qū)域?yàn)閚ame2、name3、name4三個(gè)成員名的頭部。

字體背景為黃色高亮的區(qū)域,實(shí)驗(yàn)時(shí)發(fā)現(xiàn)會(huì)與name3的值相同(意思就是給3得3,給5得5)。后面需要借助這個(gè)值來讀取它后面偏移8字節(jié)的一個(gè)紅色指針。

  • 最后一個(gè)注意點(diǎn)

因?yàn)橐孤赌硞€(gè)紅色指針,所以x86下必須保證這個(gè)紅色指針之前8字節(jié)處的type為long型,這可以通過設(shè)計(jì)name3來實(shí)現(xiàn)?,F(xiàn)在的問題是:VAR與某個(gè)特定的lastIndex對(duì)應(yīng)起來?

幸運(yùn)的是,通過調(diào)試觀察發(fā)現(xiàn),當(dāng)連續(xù)申請(qǐng)VAR結(jié)構(gòu)時(shí),一個(gè)個(gè)大小為0x10的VAR似乎是從高內(nèi)存往低內(nèi)存次第排列。筆者用下圖來通俗地解釋一下VAR的分布(name2中b的數(shù)量被用來調(diào)節(jié)這里的對(duì)齊):

所以,在x86下,如果找到了0x1337對(duì)應(yīng)的regexps[i].lastIndex,就可以通過讀取regexps[i+5].lastIndex來泄露相關(guān)指針,減去固定偏移就得到被重用內(nèi)存的起始地址了。如下:

到這里已經(jīng)將這個(gè)UAF漏洞轉(zhuǎn)為了信息泄露,泄露出一塊(aaa...部分)完全可控的內(nèi)存的首地址。如果讀者之前看過筆者之前的一篇文章,就會(huì)明白這里已經(jīng)將CVE-2018-8353轉(zhuǎn)換為和CVE-2017-11906具有相同功能的信息泄露漏洞。

?

從信息泄露到RCE

此類信息泄露漏洞與其他堆溢出漏洞一起使用可以實(shí)現(xiàn)遠(yuǎn)程代碼執(zhí)行。筆者將這個(gè)漏洞的利用代碼稍加改動(dòng),并配合CVE-2017-11907一起使用,可以在未打補(bǔ)丁的機(jī)器上完成概念驗(yàn)證。

考慮到CVE-2018-8653或CVE-2019-1429這類在野0day的利用方式,應(yīng)該是用了更高級(jí)的利用手法,通過UAF直接實(shí)現(xiàn)了任意地址讀寫,通過單個(gè)UAF即可實(shí)現(xiàn)遠(yuǎn)程代碼執(zhí)行,并不需要其他漏洞進(jìn)行輔助。

此類UAF漏洞后面一定還會(huì)出現(xiàn),請(qǐng)大家做好防范工作。

?

參考文章

Issue 1587: Windows: use-after-free in JScript in RegExp.lastIndex

Garbage Collection Internals of JScript

關(guān)閉

客服在線咨詢?nèi)肟?,期待與您交流

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

咨詢電話:400-6059-110

產(chǎn)品試用

即刻預(yù)約免費(fèi)試用,我們將在24小時(shí)內(nèi)聯(lián)系您

微信咨詢
安恒信息聯(lián)系方式
久久久久久久国产熟女精品-久久精品国产亚洲av高清四虎-欧美麻豆一精品一av一免费-精品少妇床上一区二区三区 | 每日更新在线观看亚洲av-欧美丰满少妇高潮喷水-久久综合色一综合欧美88-日韩高清激情在线播放 | 第四色婷婷墓地五月天-亚洲熟女国产熟女二区三区-久久婷婷国产麻豆91天堂-91人妻人人澡人人爽人人精品蜜 | 超碰少妇激情v-超碰97中文字幕在线-久久久国产精品粉嫩av-精品一区二区三区四区视频区 | 国产又粗又猛又爽又黄的视频小说-精品人妻一区二区三区四区久久-精品久久久久久久久久久久久蜜桃-久久这里有精品久久99 | 嫩草亚洲小久久夂-国产av一区二区三区丝袜-欧美 日本 中文字幕-天堂一区二区久久久久av | 国产精品成人在线观看视频-91超碰在线免费-五月婷婷之欧美-久热这里只有精品视频 | 欧美va亚洲va天堂va-麻豆精品国产91久久久久久-久久人妻一区二区三区精品-久久久久av影视 | 五月婷日韩中文字幕-日本熟妇xxxx日本少妇-欧美日韩亚洲片子-国产一区二区三区综合网 | 久久久久久久国产熟女精品-久久精品国产亚洲av高清四虎-欧美麻豆一精品一av一免费-精品少妇床上一区二区三区 | 色哟哟网站国产精品-欧美久久久久亚洲精品-久久婷婷色一区二区三区asmr-人妻偷乱一区二区三区 | 久久综合 久久鬼色-久久99久久99精品免视看看-国产精品96久久久久久av网址-日韩av在线播放免费观看 | 午夜精品久久久久久久99热密-日韩一区二区三区无人区-国产91对白在线播-欧美,亚洲,日韩,国产 | 在线中文字幕在线中文-国产又大又硬又粗-在线免费观看中文字幕av-日韩精品久久久蜜桃 | 人妻熟女0930中文字幕-国产精品久久91蜜桃swag-中文字幕文字幕av-久久超碰色中文字幕超碰97 | 中文精品久久久久人妻不-久久精选视频在线观看-国产精品久久久久五月天综合网-91一区二区国产精华液的功能 | 久久久精品人妻少妇-中文字幕一区精品91-日本一道大香蕉在线-欧美日韩亚洲免费在线 | 丁香四月久久久久久-亚洲av在线一二三区-日本伊人久久综合网-天天射天天摸天天干 | 不卡一区二区三区在线视频免费-久久h在线视频每-久久aⅴ熟女人妻系列一区-国产麻豆精品入口视频 在线 制服 中文字幕 日韩-91精品国产综合久久男男-久久久久99精品久久久久久-久久婷婷狠狠操 | 日韩一区二区三区四区区区-91偷伦一区二区三区蜜臀-99亚洲综合精品成人网色播-五月婷婷一区二区 人人妻久久人人澡人人爽人人精品-av一区二区三区人妻少妇-久久精品国产亚洲av黄瓜-色婷婷在线观看视频免费观看视频观看 | 日日摸日日碰夜爽7777-天天操天天日天天干天天干天天干-4438x免费成人-国产又大又猛又粗又长又硬又刺激又黄 | 久久久久久久久久久欧美-超碰日韩人妻97-91精品久久久久久久99蜜臀-久久综合给合久久狠狠狠88 | 麻豆精品国产传媒21在线观看-日韩美女视频美妇视频-日韩欧美丝袜一区二区-欧美日韩乱码一区二区三区 | 国产av中文字幕精品-亚洲风情av亚洲在线-a天堂中文在线字幕-久久福利视频一区二区三区 | 99久久精品久久久久久清纯-超碰av综合导航-91福利资源在线观看-成人av网站在线观看免费 | 99精品在线免费在线观看-在线一区二区三区在线视频-东京热av精品人妻一区二区三区-日韩成人免费观看在线观看 | 日韩精品秘密成人在线-人妻少妇中文字幕一区二区三区-国产精品日韩在线播放-日韩a级三级一区二区三区 | 国精产品一区二区免费-麻豆国产av91-日韩高清免费播放在线观看网站-av日韩精品在线观看入口 | 91精品国产综合久久久夜…-日韩乱码中文字幕一区二区三区-麻豆网视频在线观看免费-91麻豆国产自产在线观看 | 久久精品久久久久久噜噜999-欧美成人中文字幕在线视频-欧美日韩一区二区三区直播视频-麻豆最新电影在线观看 | 日韩亚洲欧美人妻-99久久婷婷国产综合精品青草-国产婷婷色综合av蜜臀av-日韩精品人妻h视频免费观看 | 国产91精品看黄网站在线观看-中文字幕巨乳人妻在线-日韩精品有码字幕-日韩av偷拍中文字幕 | 丁香综合五月久久-久久av婷婷深爱午夜国产-欧美 日韩午夜激情-久久人妻视频下载 | 精品人妻一区二区三区久久久蜜桃网-91麻豆精品传媒国产影院-五月激情婷婷婷婷久久久久-久久久久婷婷亚洲 | 国产麻豆免费福利av在线观看-日韩一级黄色免费片-91精品国产综合久久久蜜臀酒店-国产成人精品亚洲午夜 | 国产成人啪精品视频站午夜-日韩黄色av电影-日韩熟女亚洲在线-激情久久在线免费观看视频 | 国产又粗又硬又长又大-99久久久久99极品-欧美人妻四射激情你懂的-日韩美女少妇精品视频 | 久久久久久久久久久欧美-超碰日韩人妻97-91精品久久久久久久99蜜臀-久久综合给合久久狠狠狠88 | 五月激情婷婷一区二区-国产91av精品在线-日韩中文字幕成人av-欧美国产日韩美女主播视频一区 | 97韩剧网在线观看完整版-国产伦一二区色哟哟-精品人妻少妇二区三区-狠狠久久久久人妻 | 亚洲精品 成人av-日韩av欲欲求不满人妻-免费成人免费视频-婷婷六月色综合激情 |