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