黃 寧,黃曙光,潘祖烈,常 超
(國(guó)防科技大學(xué) 電子對(duì)抗學(xué)院, 安徽 合肥 230037)
隨著信息技術(shù)的發(fā)展,軟件漏洞的挖掘與利用成了一個(gè)熱點(diǎn)問題。針對(duì)不同類型的漏洞利用技術(shù),各種保護(hù)機(jī)制也層出不窮。但是,多年的漏洞利用實(shí)踐證明,由于各方面條件的限制,依然存在許多可繞過這些保護(hù)機(jī)制,成功實(shí)施漏洞利用的技術(shù)手段[1]。
一般情況下,通過劫持程序控制流,跳轉(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)致攻擊者無法準(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ā)展,近年來,出現(xiàn)多種針對(duì)二進(jìn)制程序漏洞自動(dòng)化分析與測(cè)試用例生成技術(shù)。早期的漏洞自動(dòng)利用技術(shù)多依賴于對(duì)程序漏洞補(bǔ)丁的分析[6-8]。近年來出現(xiàn)了多種針對(duì)特殊類型漏洞利用及保護(hù)機(jī)制繞過的技術(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。該方案在不改變程序控制流的前提下,利用已知漏洞,通過構(gòu)造特殊數(shù)據(jù),實(shí)現(xiàn)利用代碼自動(dòng)生成。但是,由于ASLR機(jī)制對(duì)內(nèi)存模塊布局的隨機(jī)化處理,導(dǎo)致數(shù)據(jù)流分析無法應(yīng)用于ASLR脆弱性分析過程。
文獻(xiàn)[13]提出了首個(gè)針對(duì)Android系統(tǒng)的進(jìn)行符號(hào)執(zhí)行,實(shí)現(xiàn)漏洞自動(dòng)利用的方案Centaur。該方案著重分析程序控制流狀態(tài)變化過程,同時(shí)構(gòu)造漏洞觸發(fā)點(diǎn)可達(dá)的路徑約束。該方案的局限性在于,未考慮漏洞觸發(fā)與控制流劫持狀態(tài)間的程序狀態(tà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繞過過程的狀態(tà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ù)常見的內(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)行過程,設(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)變遷依賴的輸入事件,每次狀態(tài)變遷依賴的Event屬于Σ中的一個(gè)子集;Constraint表示監(jiān)護(hù)條件或事件Event的參數(shù)等約束條件;Action表示狀態(tài)變遷過程中的執(zhí)行動(dòng)作。Action對(duì)于狀態(tài)變遷過程不是必需的,當(dāng)條件滿足時(shí),也可以在不執(zhí)行任何動(dòng)作的情況下實(shí)現(xiàn)程序狀態(tài)變遷。
狀態(tài)集合U′中各狀態(tài)的狀態(tài)變遷過程所依賴的事件輸入σ、約束條件c和執(zhí)行動(dòng)作a如下:
1)StateInput狀態(tà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í)行過程可能不止一次地觸發(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)變遷過程中的執(zhí)行動(dòng)作ainput:程序通過輸入功能,將輸入數(shù)據(jù)寫入內(nèi)存地址。
2)StateMem是從程序滿足內(nèi)存泄漏條件的時(shí)刻到目標(biāo)內(nèi)存信息泄漏時(shí)刻間的程序狀態(tài)。本文總結(jié)了四種典型內(nèi)存泄漏場(chǎng)景的StateMem狀態(tà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:通過格式化字符串函數(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可通過污點(diǎn)數(shù)據(jù)覆蓋函數(shù)返回地址。 執(zhí)行動(dòng)作aMem:覆蓋返回地址的低地址部分。 3)StateHijack表示了程序控制流被劫持時(shí)刻的程序狀態(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í)行動(dòng)作aHijack:將目標(biāo)內(nèi)存地址寫入IP寄存器。 后置狀態(tài):StateShell狀態(tài)。 4)任意代碼執(zhí)行狀態(tài)StateShell。該狀態(tà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)所依賴的事件輸入σ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)行過程中的污點(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)通過符號(hào)執(zhí)行組件對(duì)動(dòng)態(tài)運(yùn)行的目標(biāo)程序狀態(tài)進(jìn)行監(jiān)視與分析,構(gòu)造滿足地址隨機(jī)化機(jī)制繞過的程序狀態(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ù)。通過該種子文件,引導(dǎo)程序在動(dòng)態(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對(duì)控制流劫持攻擊的影響。本文將所有由外部傳入目標(biāo)程序的污點(diǎn)數(shù)據(jù)標(biāo)記為符號(hào)化數(shù)據(jù)。目標(biāo)程序在動(dòng)態(tài)運(yùn)行過程中,所有被污點(diǎn)數(shù)據(jù)污染的內(nèi)存空間或寄存器會(huì)被標(biāo)記為符號(hào)化內(nèi)存或寄存器。通過檢查某一內(nèi)存地址或寄存器的符號(hào)化屬性,可判斷內(nèi)存地址或寄存器的可控性。 針對(duì)目標(biāo)程序進(jìn)行分析時(shí),分別通過內(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í)間開銷,符號(hào)執(zhí)行組件采用了經(jīng)過路徑選擇算法優(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是通過種子輸入引導(dǎo)符號(hào)執(zhí)行觸發(fā)相應(yīng)程序狀態(tài)的過程。 符號(hào)執(zhí)行組件用于監(jiān)視程序動(dòng)態(tài)運(yùn)行狀態(tài),并分析程序狀態(tài)變遷過程是否滿足基于內(nèi)存泄漏的地址隨機(jī)化繞過的依賴條件。在此過程中,符號(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)分析的過程,是一種面向過程模式的FSM結(jié)構(gòu)實(shí)現(xiàn)過程。當(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)作過程如算法1所示。 (a) 控制流劫持種子驅(qū)動(dòng)程序運(yùn)行過程(a) Control-flow hijack seed input direct the running path of program (b) 內(nèi)存泄漏種子驅(qū)動(dòng)程序運(yùn)行過程(b) Memory leakage seed input direct the running path of program圖3 種子輸入引導(dǎo)符號(hào)執(zhí)行觸發(fā)程序狀態(tài)的過程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))退出過程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的符號(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 硬盤的計(jì)算機(jī)上。 算法2 程序狀態(tài)變遷過程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 本文選取了近年來影響較大的控制流劫持攻擊漏洞,對(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)境表示樣本程序的依賴系統(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)境稱為部分隨機(jī)化環(huán)境。在Windows 7以后的系統(tǒng)中,ASLR機(jī)制基本實(shí)現(xiàn)了針對(duì)全部?jī)?nèi)存空間的隨機(jī)化效果,本文將實(shí)現(xiàn)這一效果的隨機(jī)化環(huán)境稱為整體隨機(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)的匯編指令;控制流劫持攻擊類型表示樣本程序在控制流劫持種子文件驅(qū)動(dòng)下執(zhí)行的攻擊類型。 表4列舉了各樣本程序從初始狀態(tài)到控制流劫持狀態(tài)變遷過程中,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的控制流劫持種子可通過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è)置了針對(duì)堆棧等部分內(nèi)存區(qū)域的地址隨機(jī)化。CVE-2010-3333實(shí)驗(yàn)中,控制流劫持種子將Shellcode布局于棧內(nèi)存中。但由于堆棧隨機(jī)化影響,需要通過跳板指令jmp esp確定棧內(nèi)存的位置(即定位??臻g地址的前四位)。Office 2003中,存在不受隨機(jī)化影響的地址0x7d1f5fb7固定為jmp esp指令。當(dāng)程序處于控制流劫持狀態(tài)時(shí),將返回地址覆蓋為0x7d1f5fb7,執(zhí)行跳板指令后,可定位??臻g前四位地址,驅(qū)動(dòng)樣本程序開始執(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ù)組長(zhǎng)度,導(dǎo)致任意內(nèi)存讀寫。上述樣本程序中,基于容錯(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)。控制流劫持種子文件通過將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)樣本均至少擁有一條程序路徑,同時(shí)滿足內(nèi)存泄漏和控制流劫持的條件。在此路徑下,ASLR機(jī)制可被繞過。 上述實(shí)驗(yàn)表明, ARVA原型系統(tǒng)可有效識(shí)別部分地址定位、容錯(cuò)攻擊、任意地址讀寫等內(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案例來對(duì)ARVA的檢測(cè)過程與效果進(jìn)行詳細(xì)闡述。此漏洞利用任意地址讀寫實(shí)現(xiàn)ASLR繞過;通過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ù)溢出漏洞。該漏洞可通過篡改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對(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í),通過arr的索引值,可實(shí)現(xiàn)越界讀寫。 內(nèi)存泄漏種子文件觸發(fā)的程序狀態(tài)變遷過程為: 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語言的數(shù)據(jù)存儲(chǔ)時(shí),每個(gè)數(shù)據(jù)都占據(jù)16字節(jié),其中,前8個(gè)字節(jié)表示數(shù)據(jù)類型,后8個(gè)字節(jié)表述數(shù)據(jù)值。 StateInput狀態(tài):通過種子文件布局一個(gè)sub類型函數(shù)func,并將函數(shù)地址&func存儲(chǔ)于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個(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))。 檢查任意地址讀取類型依賴的約束條件,數(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ù)組越界讀寫泄漏&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)限下僅可通過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)時(shí)針對(duì)狀態(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時(shí),指定的代碼為VBScript腳本文件中任意功能調(diào)用代碼。由于DVE利用技術(shù)的特殊性,可認(rèn)為該案例中的控制流劫持狀態(tài)StateHijack與StateShell是同時(shí)觸發(fā)的。控制流劫持種子文件觸發(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中,測(cè)量時(shí)間t1定義為內(nèi)存泄漏種子輸入驅(qū)動(dòng)樣本程序開始運(yùn)行,至求得內(nèi)存泄漏約束所用時(shí)間;t2定義為控制流劫持種子輸入驅(qū)動(dòng)程序開始運(yùn)行,至求得控制流劫持約束所用時(shí)間。同時(shí),本文也在原生S2E系統(tǒng)中,以結(jié)合了ASLR繞過和控制流劫持功能的腳本文件為輸入,運(yùn)行同樣的樣本程序,并記錄樣本程序的運(yùn)行時(shí)間t′。具體數(shù)據(jù)如圖6所示。 圖6 ARVA與原生S2E運(yùn)行時(shí)間開銷對(duì)比Fig.6 Comparison of running time of ARVA and S2E 根據(jù)圖6數(shù)據(jù),MS-06-055不涉及地址隨機(jī)化繞過,ARVA針對(duì)其控制流劫持約束求解時(shí)間t2大于S2E的運(yùn)行時(shí)間。CVE-2010-3333的使用部分地址定位,內(nèi)存泄漏約束求解過程與控制流劫持約束求解過程基本一致,兩者的時(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í)間開銷基本呈現(xiàn)下述兩種特點(diǎn):t1>t′>t2;t1+t2≈2t′。 上述特點(diǎn)說明,ARVA針對(duì)樣本程序的地址隨機(jī)化脆弱性檢測(cè)的時(shí)間開銷主要集中于內(nèi)存泄漏約束的構(gòu)建與求解方面。 此外,由于ARVA的控制流劫持約束求解過程不考慮地址隨機(jī)化對(duì)樣本程序的影響,而原生S2E系統(tǒng)在運(yùn)行同一樣本程序時(shí),種子文件結(jié)合了地址隨機(jī)化繞過與控制流劫持兩方面功能,導(dǎo)致ARVA的控制流劫持約束求解時(shí)間t2小于S2E運(yùn)行時(shí)間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ǔ)上,針對(duì)四種常見的內(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í)施控制流劫持攻擊的條件。通過對(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í)間開銷分析
4 結(jié)論
國(guó)防科技大學(xué)學(xué)報(bào)2020年2期