黃 寧,黃曙光,潘祖烈,常 超
(國(guó)防科技大學(xué) 電子對(duì)抗學(xué)院, 安徽 合肥 230037)
隨著信息技術(shù)的發(fā)展,軟件漏洞的挖掘與利用成了一個(gè)熱點(diǎn)問(wèn)題。針對(duì)不同類(lèi)型的漏洞利用技術(shù),各種保護(hù)機(jī)制也層出不窮。但是,多年的漏洞利用實(shí)踐證明,由于各方面條件的限制,依然存在許多可繞過(guò)這些保護(hù)機(jī)制,成功實(shí)施漏洞利用的技術(shù)手段[1]。
一般情況下,通過(guò)劫持程序控制流,跳轉(zhuǎn)至指定內(nèi)存地址,實(shí)現(xiàn)任意代碼執(zhí)行,需要在觸發(fā)程序控制流劫持狀態(tài)的同時(shí),注入目標(biāo)內(nèi)存地址。地址隨機(jī)化(Address Space Layout Randomization, ASLR)機(jī)制對(duì)加載于程序內(nèi)存空間中的各模塊進(jìn)行隨機(jī)化布局,導(dǎo)致攻擊者無(wú)法準(zhǔn)確定位目標(biāo)代碼的內(nèi)存地址,從而阻止控制流劫持攻擊[2-3]。但是,ASLR依然存在不少局限性[4-5]。受地址隨機(jī)化的影響,內(nèi)存中各模塊的加載地址隨機(jī)分布,但各模塊的內(nèi)部結(jié)構(gòu)依然相對(duì)固定,是導(dǎo)致內(nèi)存信息泄漏的重要原因。
隨著程序分析技術(shù)的發(fā)展,近年來(lái),出現(xiàn)多種針對(duì)二進(jìn)制程序漏洞自動(dòng)化分析與測(cè)試用例生成技術(shù)。早期的漏洞自動(dòng)利用技術(shù)多依賴(lài)于對(duì)程序漏洞補(bǔ)丁的分析[6-8]。近年來(lái)出現(xiàn)了多種針對(duì)特殊類(lèi)型漏洞利用及保護(hù)機(jī)制繞過(guò)的技術(shù)方案[9-10],但仍然缺少一款針對(duì)ASLR機(jī)制脆弱性進(jìn)行自動(dòng)化分析的方案。
文獻(xiàn)[11]提出了基于符號(hào)執(zhí)行的自動(dòng)化程序漏洞利用(CRash analysis of Automatic eXploit, CRAX)方法。該方法使用選擇性符號(hào)執(zhí)行技術(shù),引導(dǎo)程序運(yùn)行并觸發(fā)控制流劫持狀態(tài),生成控制流劫持點(diǎn)可達(dá)的輸入測(cè)試用例。該方案的局限性在于,缺少對(duì)ASLR影響的分析,導(dǎo)致測(cè)試用例難以應(yīng)用于ASLR環(huán)境下。
文獻(xiàn)[12]針對(duì)控制流處于有效防御的環(huán)境時(shí),提出了面向數(shù)據(jù)流的漏洞自動(dòng)分析與利用方案FlowStitch。該方案在不改變程序控制流的前提下,利用已知漏洞,通過(guò)構(gòu)造特殊數(shù)據(jù),實(shí)現(xiàn)利用代碼自動(dòng)生成。但是,由于ASLR機(jī)制對(duì)內(nèi)存模塊布局的隨機(jī)化處理,導(dǎo)致數(shù)據(jù)流分析無(wú)法應(yīng)用于ASLR脆弱性分析過(guò)程。
文獻(xiàn)[13]提出了首個(gè)針對(duì)Android系統(tǒng)的進(jìn)行符號(hào)執(zhí)行,實(shí)現(xiàn)漏洞自動(dòng)利用的方案Centaur。該方案著重分析程序控制流狀態(tài)變化過(guò)程,同時(shí)構(gòu)造漏洞觸發(fā)點(diǎn)可達(dá)的路徑約束。該方案的局限性在于,未考慮漏洞觸發(fā)與控制流劫持狀態(tài)間的程序狀態(tài)依賴(lài),導(dǎo)致生成的測(cè)試用例不能實(shí)現(xiàn)控制流劫持攻擊。
為了準(zhǔn)確分析漏洞程序能否在ASLR環(huán)境下實(shí)現(xiàn)控制流劫持攻擊,本文結(jié)合已有的漏洞自動(dòng)分析與利用技術(shù),針對(duì)四種內(nèi)存泄漏場(chǎng)景,提出了一種基于控制流狀態(tài)檢測(cè)的ASLR脆弱性自動(dòng)分析方法。
本文首先建立了有限狀態(tài)機(jī)模型,描述被測(cè)程序的動(dòng)態(tài)運(yùn)行狀態(tài)。然后,根據(jù)內(nèi)存泄漏技術(shù)特點(diǎn),篩選出ASLR繞過(guò)過(guò)程的狀態(tài)依賴(lài)。在程序有限狀態(tài)機(jī)模型的基礎(chǔ)上,使用符號(hào)執(zhí)行工具S2E[14-15]實(shí)現(xiàn)了地址隨機(jī)化脆弱性分析(Address Randomization Vulnerability Analysis, ARVA)系統(tǒng)。原型系統(tǒng)檢查內(nèi)存泄漏狀態(tài)的路徑約束與控制流劫持狀態(tài)的路徑約束是否兼容,判斷被測(cè)程序是否存在同時(shí)滿足上述兩種狀態(tài)的路徑。
根據(jù)常見(jiàn)的內(nèi)存泄漏技術(shù)特點(diǎn),結(jié)合污點(diǎn)數(shù)據(jù)傳播和程序動(dòng)態(tài)運(yùn)行狀態(tài)特征,本文提出了一種基于程序狀態(tài)變遷的地址隨機(jī)化脆弱性分析方法。該方法以上述各程序狀態(tài)為分析單元,結(jié)合污點(diǎn)數(shù)據(jù)傳播驅(qū)動(dòng)程序動(dòng)態(tài)運(yùn)行過(guò)程,設(shè)計(jì)了針對(duì)ASLR環(huán)境下程序運(yùn)行狀態(tài)的有限狀態(tài)機(jī)模型,如圖1所示。該有限狀態(tài)機(jī)(Finite States Machine, FSM)可用式(1)所示五元組進(jìn)行描述:
M=(U,Σ,T,δ,u0)
(1)
T={S_State,T_State,Event,Constraint,Action}
(2)
式中:S_State和T_State分別表示T的初始狀態(tài)和目標(biāo)狀態(tài);Event表示S_State和T_State狀態(tài)變遷依賴(lài)的輸入事件,每次狀態(tài)變遷依賴(lài)的Event屬于Σ中的一個(gè)子集;Constraint表示監(jiān)護(hù)條件或事件Event的參數(shù)等約束條件;Action表示狀態(tài)變遷過(guò)程中的執(zhí)行動(dòng)作。Action對(duì)于狀態(tài)變遷過(guò)程不是必需的,當(dāng)條件滿足時(shí),也可以在不執(zhí)行任何動(dòng)作的情況下實(shí)現(xiàn)程序狀態(tài)變遷。
狀態(tài)集合U′中各狀態(tài)的狀態(tài)變遷過(guò)程所依賴(lài)的事件輸入σ、約束條件c和執(zhí)行動(dòng)作a如下:
1)StateInput狀態(tài)表示程序從開(kāi)始接收外部數(shù)據(jù)(即污點(diǎn)源),到下一次任意污點(diǎn)數(shù)據(jù)傳播或約束改變時(shí)刻之間的程序狀態(tài)。外部輸入事件可視為一種特殊的針對(duì)污點(diǎn)數(shù)據(jù)的操作事件σInput。事件σInput與StateInput狀態(tài)轉(zhuǎn)換的映射關(guān)系可如式(3)所示:
UxσInput→T:T_State=StateInput
(3)
由于程序執(zhí)行過(guò)程可能不止一次地觸發(fā)事件σInput,且每次觸發(fā)事件σInput均會(huì)驅(qū)動(dòng)程序進(jìn)入StateInput狀態(tài),因此事件σInput和事件輸入集合Σ的關(guān)系為:{σInput0,…,σInputn}?Σ。
圖1 ASLR環(huán)境下程序有限狀態(tài)機(jī)模型Fig.1 Program finite state machine model in ASLR environment
前置狀態(tài)向輸入狀態(tài)變遷過(guò)程中的執(zhí)行動(dòng)作ainput:程序通過(guò)輸入功能,將輸入數(shù)據(jù)寫(xiě)入內(nèi)存地址。
2)StateMem是從程序滿足內(nèi)存泄漏條件的時(shí)刻到目標(biāo)內(nèi)存信息泄漏時(shí)刻間的程序狀態(tài)。本文總結(jié)了四種典型內(nèi)存泄漏場(chǎng)景的StateMem狀態(tài)依賴(lài)條件。
①容錯(cuò)攻擊[16-17]。
事件輸入σMem:循環(huán)執(zhí)行事件集合EventLoop;內(nèi)存讀取事件EventReadMem;異常處理操作EventExcept。
集合EventLoop中的元素為二元組(Pos,Event),其中Pos表示事件Event的執(zhí)行優(yōu)先度,Pos越小,優(yōu)先度越高。
約束條件cMem:{(Pos1,EventReadMem),(Pos2,EventExcept)}EventLoop∧(Pos1 執(zhí)行動(dòng)作aMem:EventLoop集合中的事件根據(jù)各自的執(zhí)行優(yōu)先級(jí)循環(huán)執(zhí)行,直至內(nèi)存讀取事件EventReadMem讀取目標(biāo)地址。 ②格式化字符串[18]。 事件輸入σMem:調(diào)用格式化字符串函數(shù)事件EventFormat。 約束條件cMem:格式化字符串函數(shù)的格式化控制符參數(shù)為污點(diǎn)數(shù)據(jù)。 執(zhí)行動(dòng)作aMem:通過(guò)格式化字符串函數(shù)輸出目標(biāo)地址。 ③任意地址讀取。 事件輸入σMem:內(nèi)存讀取事件EventReadMem。 約束條件cMem:事件EventReadMem的讀取對(duì)象為帶長(zhǎng)度信息的數(shù)據(jù)結(jié)構(gòu) ∧(待讀取數(shù)據(jù)結(jié)構(gòu)長(zhǎng)度信息為污點(diǎn)數(shù)據(jù) ∨ 待讀取數(shù)據(jù)結(jié)構(gòu)指針為污點(diǎn)數(shù)據(jù))。 執(zhí)行動(dòng)作aMem:事件EventReadMem讀取指定內(nèi)存信息。 ④部分地址定位。 事件輸入σMem:返回地址覆蓋事件EventRetCover。 約束條件cMem:事件EventRetCover可通過(guò)污點(diǎn)數(shù)據(jù)覆蓋函數(shù)返回地址。 執(zhí)行動(dòng)作aMem:覆蓋返回地址的低地址部分。 3)StateHijack表示了程序控制流被劫持時(shí)刻的程序狀態(tài)。程序處于控制流劫持狀態(tài),可實(shí)現(xiàn)任意地址跳轉(zhuǎn)。 狀態(tài)所依賴(lài)的事件輸入σHijack:指令指針(Instruction Pointer, IP)寄存器值為污點(diǎn)數(shù)據(jù)。 約束條件cHijack:目標(biāo)內(nèi)存地址已泄漏。 執(zhí)行動(dòng)作aHijack:將目標(biāo)內(nèi)存地址寫(xiě)入IP寄存器。 后置狀態(tài):StateShell狀態(tài)。 4)任意代碼執(zhí)行狀態(tài)StateShell。該狀態(tài)抽象描述了程序開(kāi)始非法執(zhí)行一段攻擊者指定的代碼到該段代碼執(zhí)行結(jié)束時(shí)刻間的程序狀態(tài)??刂屏鹘俪止舻慕Y(jié)果取決于跳轉(zhuǎn)目的地址的可執(zhí)行屬性,當(dāng)且僅當(dāng)目標(biāo)地址是可執(zhí)行的,程序轉(zhuǎn)入任意代碼執(zhí)行狀態(tài)StateShell,表示控制流劫持攻擊成功。 狀態(tài)所依賴(lài)的事件輸入σShell:IP寄存器值指向目標(biāo)內(nèi)存地址。 約束條件cShell:目標(biāo)地址內(nèi)存可執(zhí)行。 前置狀態(tài)S_StateShell:StateHijack狀態(tài)。 ASLR環(huán)境下,基于內(nèi)存泄漏的控制流劫持攻擊要求程序狀態(tài)集合U′是全體程序狀態(tài)集合U的子集。集合U′至少要包含以下幾種狀態(tài): {StateEntry,StateInput,StateMem,StateHijack,StateShell}?U′ 本文使用符號(hào)執(zhí)行技術(shù),實(shí)現(xiàn)目標(biāo)程序動(dòng)態(tài)運(yùn)行過(guò)程中的污點(diǎn)數(shù)據(jù)跟蹤、程序狀態(tài)監(jiān)測(cè)與地址隨機(jī)化脆弱性分析等工作。分析工作架構(gòu)如圖2所示。 圖2 ASLR脆弱性分析架構(gòu)Fig.2 Structure of ASLR vulnerability analysis system 分析架構(gòu)通過(guò)符號(hào)執(zhí)行組件對(duì)動(dòng)態(tài)運(yùn)行的目標(biāo)程序狀態(tài)進(jìn)行監(jiān)視與分析,構(gòu)造滿足地址隨機(jī)化機(jī)制繞過(guò)的程序狀態(tài)約束,并由約束求解器求解約束,生成測(cè)試用例。符號(hào)執(zhí)行組件需要三項(xiàng)輸入:可執(zhí)行文件格式的目標(biāo)程序,可觸發(fā)目標(biāo)程序內(nèi)存泄漏狀態(tài)的種子輸入以及可觸發(fā)控制流劫持狀態(tài)的種子輸入。 內(nèi)存泄漏種子文件為可觸發(fā)程序內(nèi)存泄漏狀態(tài)的輸入數(shù)據(jù)。通過(guò)該種子文件,引導(dǎo)程序在動(dòng)態(tài)運(yùn)行過(guò)程中觸發(fā)內(nèi)存泄漏,并收集從入口點(diǎn)到內(nèi)存泄漏狀態(tài)的約束條件,構(gòu)建目標(biāo)程序的內(nèi)存泄漏約束。 控制流劫持種子文件為可觸發(fā)目標(biāo)程序控制流劫持狀態(tài)的輸入數(shù)據(jù)。該過(guò)程不考慮ASLR對(duì)控制流劫持攻擊的影響。本文將所有由外部傳入目標(biāo)程序的污點(diǎn)數(shù)據(jù)標(biāo)記為符號(hào)化數(shù)據(jù)。目標(biāo)程序在動(dòng)態(tài)運(yùn)行過(guò)程中,所有被污點(diǎn)數(shù)據(jù)污染的內(nèi)存空間或寄存器會(huì)被標(biāo)記為符號(hào)化內(nèi)存或寄存器。通過(guò)檢查某一內(nèi)存地址或寄存器的符號(hào)化屬性,可判斷內(nèi)存地址或寄存器的可控性。 針對(duì)目標(biāo)程序進(jìn)行分析時(shí),分別通過(guò)內(nèi)存泄漏種子文件和控制流劫持種子文件驅(qū)動(dòng)目標(biāo)程序動(dòng)態(tài)運(yùn)行,生成內(nèi)存泄漏狀態(tài)約束ConstraintMem與控制流劫持狀態(tài)約束ConstraintHijack。約束求解器求解上述約束間的兼容性,判斷兩者是否具備在同一程序路徑觸發(fā)的可能性。當(dāng)且僅當(dāng)上述兩種約束滿足式(4)所示關(guān)系時(shí),表示兩者互相兼容。 ConstraintMem∧ConstraintHijack=True (4) 若兩種約束互相兼容,表明目標(biāo)程序存在至少一條路徑,可同時(shí)抵達(dá)內(nèi)存泄漏狀態(tài)和控制流劫持狀態(tài),即目標(biāo)程序滿足ASLR環(huán)境下的控制流劫持攻擊條件。 為了降低符號(hào)執(zhí)行對(duì)目標(biāo)程序控制流劫持點(diǎn)檢測(cè)的時(shí)間開(kāi)銷(xiāo),符號(hào)執(zhí)行組件采用了經(jīng)過(guò)路徑選擇算法優(yōu)化的導(dǎo)向式符號(hào)執(zhí)行技術(shù)。以種子輸入作為目標(biāo)程序的輸入文件,引導(dǎo)目標(biāo)程序沿著確定的程序路徑動(dòng)態(tài)運(yùn)行,直至觸發(fā)相應(yīng)的程序狀態(tài)。圖3是通過(guò)種子輸入引導(dǎo)符號(hào)執(zhí)行觸發(fā)相應(yīng)程序狀態(tài)的過(guò)程。 符號(hào)執(zhí)行組件用于監(jiān)視程序動(dòng)態(tài)運(yùn)行狀態(tài),并分析程序狀態(tài)變遷過(guò)程是否滿足基于內(nèi)存泄漏的地址隨機(jī)化繞過(guò)的依賴(lài)條件。在此過(guò)程中,符號(hào)執(zhí)行組件收集程序運(yùn)行的路徑約束,并根據(jù)程序狀態(tài),構(gòu)造滿足狀態(tài)變遷條件的數(shù)據(jù)約束。符號(hào)執(zhí)行組件的工作架構(gòu)如圖4所示。 符號(hào)執(zhí)行組件對(duì)程序狀態(tài)分析的過(guò)程,是一種面向過(guò)程模式的FSM結(jié)構(gòu)實(shí)現(xiàn)過(guò)程。當(dāng)程序狀態(tài)滿足變遷約束,并觸發(fā)狀態(tài)變遷操作時(shí),當(dāng)前狀態(tài)(源狀態(tài))執(zhí)行退出動(dòng)作。每個(gè)源狀態(tài)的退出動(dòng)作由兩部分組成:根據(jù)源狀態(tài)構(gòu)造數(shù)據(jù)約束;根據(jù)事件及事件約束選擇目標(biāo)狀態(tài)。源狀態(tài)退出動(dòng)作過(guò)程如算法1所示。 (a) 控制流劫持種子驅(qū)動(dòng)程序運(yùn)行過(guò)程(a) Control-flow hijack seed input direct the running path of program (b) 內(nèi)存泄漏種子驅(qū)動(dòng)程序運(yùn)行過(guò)程(b) Memory leakage seed input direct the running path of program圖3 種子輸入引導(dǎo)符號(hào)執(zhí)行觸發(fā)程序狀態(tài)的過(guò)程Fig.3 Seed input trigger the program states in symbolic execution 圖4 符號(hào)執(zhí)行組件工作架構(gòu)Fig.4 Structure of symbolic execution parts 算法1 當(dāng)前程序狀態(tài)(源狀態(tài))退出過(guò)程Alg.1 Exit process of current program state (source state) 算法1通過(guò)下述操作為程序狀態(tài)退出過(guò)程建立數(shù)據(jù)約束: Constraint=Eq(Value,Addr) 其中:Value為關(guān)鍵內(nèi)存地址在相應(yīng)的狀態(tài)退出過(guò)程中需要滿足的條件值;Addr表示約束構(gòu)建的目標(biāo)內(nèi)存地址或寄存器。 完成數(shù)據(jù)約束構(gòu)造后,通過(guò)事件輸入判斷程序狀態(tài),實(shí)現(xiàn)程序狀態(tài)變遷邏輯。該過(guò)程如算法2所示。 本文使用S2E作為原型系統(tǒng)ARVA的符號(hào)執(zhí)行引擎,針對(duì)快速模擬器(Quick EMUlator, QEMU)下運(yùn)行的目標(biāo)程序及其系統(tǒng)環(huán)境進(jìn)行全系統(tǒng)模擬的基礎(chǔ)上,實(shí)現(xiàn)程序狀態(tài)監(jiān)測(cè)與ASLR脆弱性分析。本文選取了8個(gè)實(shí)際的漏洞利用攻擊樣本對(duì)ARVA原型系統(tǒng)進(jìn)行評(píng)估。實(shí)驗(yàn)中,原型系統(tǒng)運(yùn)行在配備了3.40 GHz Intel Core i7-6700 CPU、8 GB 內(nèi)存、250 GB 硬盤(pán)的計(jì)算機(jī)上。 算法2 程序狀態(tài)變遷過(guò)程Alg.2 States conversion process 目標(biāo)程序與系統(tǒng)均運(yùn)行于QEMU虛擬機(jī)中,各樣本的漏洞編號(hào)、運(yùn)行環(huán)境與目標(biāo)程序如表1所示。 表1 實(shí)驗(yàn)樣本信息Tab.1 Information of experimental sample 本文選取了近年來(lái)影響較大的控制流劫持攻擊漏洞,對(duì)ARVA原型系統(tǒng)及其理論的有效性進(jìn)行驗(yàn)證評(píng)估。實(shí)驗(yàn)中,內(nèi)存泄漏種子文件觸發(fā)各樣本程序內(nèi)存泄漏狀態(tài)信息如表2所示。 表2中,ASLR環(huán)境表示樣本程序的依賴(lài)系統(tǒng)對(duì)程序內(nèi)存空間的隨機(jī)化效果。由于早期的Windows系統(tǒng)未設(shè)置ASLR機(jī)制,因此樣本程序不受地址隨機(jī)化的影響。Windows XP系統(tǒng)的ASLR機(jī)制只能實(shí)現(xiàn)堆棧等部分內(nèi)存空間的隨機(jī)化效果,本文將該環(huán)境稱(chēng)為部分隨機(jī)化環(huán)境。在Windows 7以后的系統(tǒng)中,ASLR機(jī)制基本實(shí)現(xiàn)了針對(duì)全部?jī)?nèi)存空間的隨機(jī)化效果,本文將實(shí)現(xiàn)這一效果的隨機(jī)化環(huán)境稱(chēng)為整體隨機(jī)化環(huán)境。最終泄漏目標(biāo)地址表示內(nèi)存泄漏種子文件引導(dǎo)樣本程序執(zhí)行至最后一次內(nèi)存泄漏狀態(tài)時(shí),泄漏的目標(biāo)地址。 由控制流劫持種子文件觸發(fā)各程序控制流劫持狀態(tài)信息如表3所示。 表3中,控制流劫持目標(biāo)地址表示樣本程序進(jìn)入控制流劫持狀態(tài)時(shí),下一指令的跳轉(zhuǎn)目的地址;目標(biāo)跳轉(zhuǎn)指令為該目的地址處對(duì)應(yīng)的匯編指令;控制流劫持攻擊類(lèi)型表示樣本程序在控制流劫持種子文件驅(qū)動(dòng)下執(zhí)行的攻擊類(lèi)型。 表4列舉了各樣本程序從初始狀態(tài)到控制流劫持狀態(tài)變遷過(guò)程中,StateMem狀態(tài)的觸發(fā)次數(shù)以及每次觸發(fā)該狀態(tài)時(shí)泄漏的內(nèi)存信息。 根據(jù)表2、表3與表4的信息,僅MS-06-055與CVE-2010-3333的控制流劫持攻擊選用了覆蓋返回地址的方式。原因如下: 1)Windows 2000未設(shè)置任何地址隨機(jī)化機(jī)制。MS-06-055的控制流劫持種子可通過(guò)JavaScript實(shí)現(xiàn)堆噴射布局shellcode以及固定值0×0c0c0c0c覆蓋返回地址,導(dǎo)致任意代碼執(zhí)行。這一過(guò)程不涉及內(nèi)存泄漏。 表2 樣本程序內(nèi)存泄漏狀態(tài)信息Tab.2 Information of memory leakage of experimental sample 表3 樣本程序控制流劫持狀態(tài)信息Tab.3 Information of control-flow hijack of experimental sample 表4 基于內(nèi)存泄漏的樣本程序狀態(tài)變遷過(guò)程Tab.4 States conversion of memory leakage of experimental sample 2)Windows XP SP3設(shè)置了針對(duì)堆棧等部分內(nèi)存區(qū)域的地址隨機(jī)化。CVE-2010-3333實(shí)驗(yàn)中,控制流劫持種子將Shellcode布局于棧內(nèi)存中。但由于堆棧隨機(jī)化影響,需要通過(guò)跳板指令jmp esp確定棧內(nèi)存的位置(即定位棧空間地址的前四位)。Office 2003中,存在不受隨機(jī)化影響的地址0x7d1f5fb7固定為jmp esp指令。當(dāng)程序處于控制流劫持狀態(tài)時(shí),將返回地址覆蓋為0x7d1f5fb7,執(zhí)行跳板指令后,可定位??臻g前四位地址,驅(qū)動(dòng)樣本程序開(kāi)始執(zhí)行棧內(nèi)存中的Shellcode,觸發(fā)任意代碼執(zhí)行狀態(tài)。 CVE-2014-0322、CVE-2015-3090、CVE-2015-5119與CVE-2015-5122實(shí)驗(yàn)分別驗(yàn)證了整體隨機(jī)化環(huán)境下的漏洞可利用性。上述漏洞均可通過(guò)Action Script腳本觸發(fā)IE的Flash插件漏洞并實(shí)現(xiàn)漏洞利用。本文分別選取Kernel32.dll與Flash32.dll模塊作為最終內(nèi)存泄漏目標(biāo)。內(nèi)存泄漏種子文件可覆蓋Flash Vector數(shù)組長(zhǎng)度,導(dǎo)致任意內(nèi)存讀寫(xiě)。上述樣本程序中,基于容錯(cuò)攻擊的CVE-2014-0322觸發(fā)了一次內(nèi)存泄漏狀態(tài);其余樣本至少觸發(fā)兩次以上內(nèi)存泄漏狀態(tài)。 與其他實(shí)驗(yàn)相比,CVE-2014-6332實(shí)驗(yàn)涉及特殊的IE瀏覽器沙盒機(jī)制。本文針對(duì)該機(jī)制構(gòu)造的控制流劫持種子文件在觸發(fā)樣本控制流劫持狀態(tài)后,不會(huì)轉(zhuǎn)入?yún)R編指令層面的任意代碼執(zhí)行狀態(tài)。控制流劫持種子文件通過(guò)將IE瀏覽器安全標(biāo)志置于位置0,使用VBScript腳本可調(diào)用系統(tǒng)的任意功能。該攻擊方法被稱(chēng)為數(shù)據(jù)虛擬執(zhí)行DVE。 根據(jù)表4的信息,除MS-06-055實(shí)驗(yàn)不涉及ASLR環(huán)境外,其余各實(shí)驗(yàn)的內(nèi)存泄漏約束與控制流劫持約束的判定結(jié)果均為互相兼容。該結(jié)果表明,這些實(shí)驗(yàn)樣本均至少擁有一條程序路徑,同時(shí)滿足內(nèi)存泄漏和控制流劫持的條件。在此路徑下,ASLR機(jī)制可被繞過(guò)。 上述實(shí)驗(yàn)表明, ARVA原型系統(tǒng)可有效識(shí)別部分地址定位、容錯(cuò)攻擊、任意地址讀寫(xiě)等內(nèi)存泄漏狀態(tài),以及覆蓋返回地址、ROP、ret-to-libc等控制流劫持類(lèi)型。另一方面,ARVA通過(guò)求解內(nèi)存泄漏狀態(tài)約束與控制流劫持狀態(tài)約束,可判斷兩者的約束是否兼容。實(shí)驗(yàn)結(jié)果表明,基于內(nèi)存泄漏的ASLR繞過(guò)過(guò)程中,可能需要觸發(fā)不止一次內(nèi)存泄漏狀態(tài),才能非法獲取目標(biāo)內(nèi)存信息。 本文挑選了CVE-2014-6332案例來(lái)對(duì)ARVA的檢測(cè)過(guò)程與效果進(jìn)行詳細(xì)闡述。此漏洞利用任意地址讀寫(xiě)實(shí)現(xiàn)ASLR繞過(guò);通過(guò)DVE,Heap Spray等攻擊技術(shù)實(shí)現(xiàn)控制流劫持。本文的系統(tǒng)能準(zhǔn)確識(shí)別樣本程序的內(nèi)存泄漏狀態(tài)與控制流劫持狀態(tài),構(gòu)造并判斷兩種狀態(tài)約束的兼容性。 案例CVE-2014-6332漏洞程序ASLR脆弱性分析。此漏洞是一個(gè)整數(shù)溢出漏洞。該漏洞可通過(guò)篡改IE瀏覽器的安全模式標(biāo)志位,繞過(guò)瀏覽器沙盒保護(hù),進(jìn)而導(dǎo)致腳本文件獲取任意功能執(zhí)行權(quán)限。 CVE-2014-6332實(shí)驗(yàn)的種子文件為VBScript腳本文件。其中,內(nèi)存泄漏種子輸入的目標(biāo)為:引導(dǎo)漏洞程序在ASLR環(huán)境下準(zhǔn)確定位IE安全模式標(biāo)志位的地址;控制流劫持種子文件的目標(biāo)為:引導(dǎo)漏洞程序執(zhí)行任意功能。 IE瀏覽器通過(guò)OLEAUT32.dll對(duì)VBScript中的數(shù)組進(jìn)行管理。假設(shè)有數(shù)組arr,其初始長(zhǎng)度為a0;后又將數(shù)組arr的長(zhǎng)度更改為a1=a0+0×80000000,OLEAUT32將根據(jù)a1-a0=0×80000000計(jì)算數(shù)組arr的新索引值。由于0×80000000被系統(tǒng)默認(rèn)為有符號(hào)整數(shù),換算成十進(jìn)制數(shù)為0,因此數(shù)組arr的實(shí)際大小仍為a0。此時(shí),通過(guò)arr的索引值,可實(shí)現(xiàn)越界讀寫(xiě)。 內(nèi)存泄漏種子文件觸發(fā)的程序狀態(tài)變遷過(guò)程為: StateInput狀態(tài):向進(jìn)程內(nèi)存中布置兩個(gè)錯(cuò)位分布的污點(diǎn)數(shù)據(jù)數(shù)組arrA與arrB。兩個(gè)數(shù)組在內(nèi)存中的布局如圖5所示。 圖5 數(shù)組arrA與arrB結(jié)構(gòu)分布Fig.5 Layout of arrA and arrB 構(gòu)建數(shù)據(jù)約束:Constraint1=Eq(arrA, &arrA)∧Eq(arrB, &arrB)。 VBScript語(yǔ)言的數(shù)據(jù)存儲(chǔ)時(shí),每個(gè)數(shù)據(jù)都占據(jù)16字節(jié),其中,前8個(gè)字節(jié)表示數(shù)據(jù)類(lèi)型,后8個(gè)字節(jié)表述數(shù)據(jù)值。 StateInput狀態(tài):通過(guò)種子文件布局一個(gè)sub類(lèi)型函數(shù)func,并將函數(shù)地址&func存儲(chǔ)于arrA(a1)。 構(gòu)建數(shù)據(jù)約束:Constraint2 =Eq(&func, &arrA(a1))。 StateInput狀態(tài):typeof(&func)= 0x1(NULL類(lèi)型)。構(gòu)建數(shù)據(jù)約束Constraint3=Eq(0x1, &arrA(a1-1))。 StateInput狀態(tài):arrB(2) =1.740 885 347 313 24E-310(arrB(2)數(shù)據(jù)值=arrA(a1+2)類(lèi)型值= 0×200C)。 構(gòu)建數(shù)據(jù)約束:Constraint4=Eq(1.740 885 347 313 24E-310, &arrB(2))。 StateInput狀態(tài):布局Safe Array型數(shù)組myArr起始地址為0×0,包含0×7ffffff0個(gè)元素,每個(gè)元素大小為1 Byte。 構(gòu)建數(shù)據(jù)約束:Constraint5=Eq(myArr, &myArr)。 StateInput狀態(tài):arrA(a1+2)=&myArr。 構(gòu)建數(shù)據(jù)約束:Constraint6=Eq(&myArr,arrA (a1+2))。 檢查任意地址讀取類(lèi)型依賴(lài)的約束條件,數(shù)組arrA滿足下述條件: 數(shù)組arrA帶長(zhǎng)度信息的數(shù)據(jù)結(jié)構(gòu)∧數(shù)組arrA長(zhǎng)度信息a1為污點(diǎn)數(shù)據(jù)。 因此,ARVA判斷數(shù)組arrA滿足任意地址讀取的觸發(fā)條件。 StateMem狀態(tài):利用arrA數(shù)組越界讀寫(xiě)泄漏&func+ 12處CScriptEntryPoint對(duì)象指針。 構(gòu)建數(shù)據(jù)約束:Constraint7=Eq(&CScriptEntryPoint, &func+ 12)。 StateMem狀態(tài):泄漏&CScriptEntryPoint+20處COleScript對(duì)象指針。 構(gòu)建數(shù)據(jù)約束:Constraint8=Eq(&COleScript, &CScriptEntryPoint+20)。 StateMem狀態(tài):泄漏&COleScript+0×174處的IE安全模式標(biāo)志位地址。 構(gòu)建數(shù)據(jù)約束:Constraint9=Eq(& SecurityBit, &COleScript+0×174)。該地址在正常權(quán)限下僅可通過(guò)Safe Array數(shù)組進(jìn)行寫(xiě)操作。 StateInput狀態(tài):myArr[&SecurityBit]=0。 構(gòu)建數(shù)據(jù)約束:Constraint10=Eq(0,myArr[&SecurityBit])。 內(nèi)存泄漏的路徑約束構(gòu)建過(guò)程中,共觸發(fā)6次StateInput狀態(tài),3次StateMem狀態(tài),并在觸發(fā)StateMem狀態(tài)時(shí)針對(duì)狀態(tài)依賴(lài)的事件輸入與約束條件進(jìn)行了1次檢查。 ARVA在該過(guò)程中建立的污點(diǎn)源數(shù)據(jù)約束如式(5)所示。 srcConstraint=Constraint1∧Constraint2∧ Constraint3∧Constraint4∧ Constraint5∧Constraint6∧ Constraint10 (5) ARVA建立的內(nèi)存泄漏數(shù)據(jù)約束如式(6)所示。 memConstraint=Constraint7∧Constraint8∧ Constraint9 (6) 當(dāng)該漏洞程序處于任意代碼執(zhí)行狀態(tài)StateShell時(shí),指定的代碼為VBScript腳本文件中任意功能調(diào)用代碼。由于DVE利用技術(shù)的特殊性,可認(rèn)為該案例中的控制流劫持狀態(tài)StateHijack與StateShell是同時(shí)觸發(fā)的。控制流劫持種子文件觸發(fā)的程序狀態(tài)變遷過(guò)程為: StateHijack狀態(tài):ShellExecute “cmd.exe”。 CVE-2014-6332的最終數(shù)據(jù)約束如式(7)所示: dataConstraint=ConstraintMem∧ConstraintHijack =srcConstraint∧memConstraint∧ConstraintHijack (7) 其中,ConstraintHijack因不涉及IP寄存器的污點(diǎn)傳播,其默認(rèn)值為T(mén)rue。求解約束dataConstarint值為T(mén)rue,表示內(nèi)存泄漏約束ConstraintMem與控制流劫持約束ConstraintHijack兼容,因此可得出結(jié)論,CVE-2014-6332可通過(guò)內(nèi)存泄漏繞過(guò)地址隨機(jī)化,實(shí)現(xiàn)控制流劫持攻擊。 在原型系統(tǒng)ARVA中,測(cè)量時(shí)間t1定義為內(nèi)存泄漏種子輸入驅(qū)動(dòng)樣本程序開(kāi)始運(yùn)行,至求得內(nèi)存泄漏約束所用時(shí)間;t2定義為控制流劫持種子輸入驅(qū)動(dòng)程序開(kāi)始運(yùn)行,至求得控制流劫持約束所用時(shí)間。同時(shí),本文也在原生S2E系統(tǒng)中,以結(jié)合了ASLR繞過(guò)和控制流劫持功能的腳本文件為輸入,運(yùn)行同樣的樣本程序,并記錄樣本程序的運(yùn)行時(shí)間t′。具體數(shù)據(jù)如圖6所示。 圖6 ARVA與原生S2E運(yùn)行時(shí)間開(kāi)銷(xiāo)對(duì)比Fig.6 Comparison of running time of ARVA and S2E 根據(jù)圖6數(shù)據(jù),MS-06-055不涉及地址隨機(jī)化繞過(guò),ARVA針對(duì)其控制流劫持約束求解時(shí)間t2大于S2E的運(yùn)行時(shí)間。CVE-2010-3333的使用部分地址定位,內(nèi)存泄漏約束求解過(guò)程與控制流劫持約束求解過(guò)程基本一致,兩者的時(shí)間t1與t2基本相等,與S2E的運(yùn)行時(shí)間t′也基本持平。 CVE-2012-1876、CVE-2014-0322、CVE-2014-6332、CVE-2015-3090、CVE-2015-5119與CVE-2015-5122等實(shí)驗(yàn)時(shí)間開(kāi)銷(xiāo)基本呈現(xiàn)下述兩種特點(diǎn):t1>t′>t2;t1+t2≈2t′。 上述特點(diǎn)說(shuō)明,ARVA針對(duì)樣本程序的地址隨機(jī)化脆弱性檢測(cè)的時(shí)間開(kāi)銷(xiāo)主要集中于內(nèi)存泄漏約束的構(gòu)建與求解方面。 此外,由于ARVA的控制流劫持約束求解過(guò)程不考慮地址隨機(jī)化對(duì)樣本程序的影響,而原生S2E系統(tǒng)在運(yùn)行同一樣本程序時(shí),種子文件結(jié)合了地址隨機(jī)化繞過(guò)與控制流劫持兩方面功能,導(dǎo)致ARVA的控制流劫持約束求解時(shí)間t2小于S2E運(yùn)行時(shí)間t′。 本文提出了一種基于有限狀態(tài)機(jī)的ASLR機(jī)制脆弱性分析方法。該方法能夠分析目標(biāo)程序是否可通過(guò)內(nèi)存泄漏技術(shù)繞過(guò)ASLR保護(hù),實(shí)現(xiàn)控制流劫持攻擊。本文使用有限狀態(tài)機(jī)模型描述程序狀態(tài)變遷過(guò)程,分析通過(guò)內(nèi)存泄漏導(dǎo)致ASLR繞過(guò)的程序狀態(tài)依賴(lài),在此基礎(chǔ)上,針對(duì)四種常見(jiàn)的內(nèi)存泄漏場(chǎng)景分別建立了內(nèi)存泄漏狀態(tài)的進(jìn)入與退出條件,使該模型更好地適用于不同的漏洞攻擊模式。根據(jù)上述理論與模型,本文實(shí)現(xiàn)了一套基于符號(hào)執(zhí)行工具S2E的ASLR脆弱性分析原型系統(tǒng)ARVA。該系統(tǒng)針對(duì)目標(biāo)程序的內(nèi)存泄漏狀態(tài)與控制流劫持狀態(tài)分別進(jìn)行約束構(gòu)建,并對(duì)二者的兼容性進(jìn)行求解,檢查目標(biāo)程序是否滿足地址隨機(jī)化環(huán)境下實(shí)施控制流劫持攻擊的條件。通過(guò)對(duì)若干實(shí)際漏洞程序的實(shí)驗(yàn)表明,本文方法能夠準(zhǔn)確檢測(cè)到被測(cè)程序的動(dòng)態(tài)運(yùn)行狀態(tài),求解相關(guān)程序狀態(tài)約束,并有效識(shí)別ASLR環(huán)境下漏洞程序的可利用性。2 原型系統(tǒng)實(shí)現(xiàn)
3 實(shí)驗(yàn)評(píng)估
3.1 ASLR脆弱性分析結(jié)果
3.2 案例分析
3.3 時(shí)間開(kāi)銷(xiāo)分析
4 結(jié)論