潘傳幸,張錚,馬博林,姚遠,季新生
(1.數(shù)學工程與先進計算國家重點實驗室,河南 鄭州 450001;2.國家數(shù)字交換系統(tǒng)工程技術(shù)研究中心,河南 鄭州 450002)
進程控制流劫持是一種常見的攻擊手段,其通常利用緩沖區(qū)溢出[1]等二進制漏洞篡改進程的控制流,從而進行程序正常功能之外的惡意操作[2]??刂屏鹘俪止舻奈:Ψ浅4?,控制流劫持的目的往往是獲取目標機器的控制權(quán),然后提取系統(tǒng)特權(quán)對目標機器實現(xiàn)全面控制。根據(jù) CWE Top25[3]的排名,內(nèi)存緩沖區(qū)溢出仍然是最危險的軟件錯誤。
控制流劫持攻擊可以分為代碼注入和代碼重用兩大類[2]。代碼注入類攻擊利用程序本身的輸入功能向進程的虛擬地址空間注入惡意代碼,然后通過緩沖區(qū)溢出等方式覆蓋返回地址,實現(xiàn)控制流劫持。代碼重用類攻擊不需要注入代碼,而是利用程序自身的代碼片段完成攻擊。為了防御進程控制流劫持,研究人員和工程技術(shù)人員提出了許多防御手段。早期,控制流劫持攻擊通過代碼注入實現(xiàn),為了防御代碼注入攻擊,研究人員提出了數(shù)據(jù)執(zhí)行保護(DEP,data execution prevention)、棧不可執(zhí)行[4]、棧監(jiān)控[5]、地址空間布局隨機化(ASLR,address space layout randomization)[6]等方法。然而,這些方法卻無法防御面向返回編程(ROP,return oriented programming)[7]等基于代碼重用的控制流劫持[8-11]??刂屏魍暾裕–FI,control-flow integrity)[12-13]是防御代碼重用較有效的方法,其通過對二進制可執(zhí)行程序進行靜態(tài)分析,建立可信的控制流圖,在執(zhí)行時限制控制流轉(zhuǎn)移。但是,對于信息泄露和面向數(shù)據(jù)編程(DOP,data oriented programming)[14]攻擊,即使細粒度的CFI 也難以起到防御作用。
擬態(tài)防御是我國科研團隊提出的針對未知漏洞后門的主動防御思想[15-16],核心是動態(tài)異構(gòu)冗余(DHR,dynamic heterogeneous redundancy)構(gòu)造[17],如圖1 所示。各個執(zhí)行體之間功能等價,但受到攻擊后的行為表現(xiàn)各異,表決器通過對比在線執(zhí)行體集中各執(zhí)行體之間的行為是否一致來判斷是否遭到攻擊。一旦表決器判定為遭到攻擊,則調(diào)用動態(tài)選擇算法從離線的異構(gòu)構(gòu)件集合中挑選合適的構(gòu)件對在線執(zhí)行體進行替換,這個過程稱為擬態(tài)變換。輸入代理與表決器中間的部分稱為擬態(tài)界。擬態(tài)界的DHR 構(gòu)造和表決機制是擬態(tài)防御系統(tǒng)內(nèi)生地具備安全能力的根源[15,18-19]。
為了防御基于二進制漏洞的進程控制流劫持攻擊,本文受擬態(tài)防御思想的啟發(fā),采用動態(tài)異構(gòu)冗余的方式執(zhí)行程序。在異構(gòu)冗余的基礎上,結(jié)合表決機制,能夠有效發(fā)現(xiàn)攻擊行為,然后阻斷攻擊。
本文的主要研究工作及貢獻如下。
1) 梳理了進程控制流劫持攻擊的過程,從漏洞利用過程的角度建立了二進制漏洞威脅模型,并依據(jù)此模型提出了針對關(guān)鍵利用環(huán)節(jié)的“要塞”防御。
2) 提出了進程的擬態(tài)執(zhí)行模型,為防御基于二進制漏洞的進程控制流劫持攻擊提供了一種主動防御式的解決方案。
圖1 擬態(tài)防御系統(tǒng)DHR 構(gòu)造
3) 實現(xiàn)了一個擬態(tài)執(zhí)行的原型系統(tǒng)——Mimic-Box,并進行了有效性驗證和性能測試。經(jīng)測試,MimicBox 能夠防御絕大多數(shù)已知的基于二進制漏洞的進程控制流劫持攻擊,并且導致的額外性能開銷不超過13%。
常見的控制流劫持技術(shù)往往是利用堆和棧開展攻擊。在利用棧的攻擊技術(shù)中[20],棧緩沖區(qū)溢出攻擊占了絕大部分。當棧緩沖區(qū)溢出,即程序接收的用戶輸入超過開發(fā)者所分配的緩沖區(qū)大小時,可能會破壞棧中所存儲的關(guān)鍵數(shù)據(jù),從而引發(fā)錯誤。由于棧中存放了函數(shù)的返回地址,因此在沒有保護的情況下,一旦攻擊者利用棧溢出,使用其他地址覆蓋了原來的函數(shù)返回地址,那么當函數(shù)執(zhí)行完成進行返回時,就會去執(zhí)行攻擊者所構(gòu)造的地址處的代碼,攻擊者就可以達到控制流劫持的目的。在針對堆的攻擊技術(shù)[21]中,攻擊者首先利用申請和釋放堆塊時涉及的堆分配機制進行堆布局,然后非正常地申請和釋放堆塊,獲得一個指向關(guān)鍵內(nèi)存位置處的指針,最后使用程序的輸入功能將其重寫為其他代碼段的地址,從而實現(xiàn)程序的控制流劫持。
本文分析了幾種常見的面向Linux 平臺的控制流劫持方式,并以此為基礎進行了二進制漏洞威脅建模,威脅模型如圖2 所示。模型遵循的前提與假設如下。
1) 目標機器裝有Linux 操作系統(tǒng)。
2) 攻擊者擁有目標程序的可執(zhí)行文件,能夠?qū)δ繕顺绦蜻M行靜態(tài)分析。
圖2 基于二進制漏洞的控制流劫持攻擊威脅模型
3) 目標程序是個應用軟件,并且包含可供控制流劫持使用的二進制漏洞。
4) 基于二進制漏洞的控制流劫持,目的在于獲取目標機器控制權(quán)和shell。
5) 將可以獲取 shell 的代碼片段統(tǒng)一記為one_gadget。
在對棧溢出漏洞進行利用時,攻擊者首先采取靜態(tài)分析的方式獲取ROP 所需的gadget 的地址信息,再以ROP 技術(shù)作為跳板,實現(xiàn)程序的信息泄露,獲取必要的內(nèi)存信息,然后以此為基礎,向棧中存放返回地址的內(nèi)存處寫入one_gadget 地址,從而獲取shell,在某些特殊情況下,攻擊者也可以使用字節(jié)爆破的方式在不獲得信息的情況下向棧內(nèi)注入惡意的地址。
在程序本身擁有可以實現(xiàn)控制流劫持的代碼片段(如system、execve 函數(shù))的情況下,當目標程序被編譯成地址無關(guān)可執(zhí)行(PIE,position-independent executable)程序時,攻擊者可以直接將這些代碼片段作為one_gadget,然后將棧中的返回地址覆蓋為這些代碼片段的地址,路徑1—2—22—29—36 表示一個完整的ret2text 利用流程;當目標程序不是PIE 程序時,攻擊者將首先通過一個信息泄露漏洞,如格式化字符串漏洞,獲取并計算出想要跳轉(zhuǎn)到的one_gadget 的地址,然后將棧中的返回地址覆蓋為one_gadget 的地址,路徑4—2—22—29—36 表示針對PIE 程序的ret2text 利用流程。
當程序本身并不擁有可以實現(xiàn)控制流劫持的代碼片段時,攻擊者往往將libc 系統(tǒng)共享庫中的system 函數(shù)作為one_gadget,使“/bin/sh”作為system函數(shù)的參數(shù)即可。攻擊者首先需要獲取gadget 地址信息,利用ROP 等代碼重用技術(shù)實現(xiàn)跳轉(zhuǎn)完成信息泄露,然后獲取libc 庫中某個函數(shù)的地址信息,通過偏移計算獲得one_gadget 的地址,最后再進行多次ROP,把got 表中的某項篡改為one_gadget 的地址,或者直接跳轉(zhuǎn)到libc 中的one_gadget。路徑1—3—5—23—30—36 表示一個完整的ret2libc 利用流程。
路徑1—2—25—32—36 表示一個完整的ret2syscall 攻擊過程,攻擊者使用ROP 技術(shù)并在棧內(nèi)注入syscall 指令地址,然后劫持控制流獲取shell。
路徑6—7—12—17—26—33—36 表示一個完整的釋放后使用(UAF,use—after—free)漏洞利用流程。攻擊者首先進行堆布局,對堆進行多次非正常申請與釋放,獲得一個指向got 表中某表項的指針;然后攻擊者利用程序自帶的修改功能(如記事本程序中的編輯功能),把got 表某項的指針指向的內(nèi)容修改為one_gadget 地址,從而完成程序的控制流劫持,獲得shell。
路徑6—8—13—17—27—34—36、6—9— 14—17—27—34—36、6—10—15—17—27—34—36、6—11—16—17—27—34—36 分別表示攻擊者根據(jù)glibc 管理堆的特性,采取不同的攻擊方式的堆利用流程。其本質(zhì)都是不斷地構(gòu)造特殊的堆并多次非正常地申請與釋放堆,獲得一個可以修改內(nèi)容的指針,再使用程序自帶的地址寫功能將關(guān)鍵內(nèi)存位置,如將got 表中的表項或malloc_hook 中的內(nèi)容覆蓋為one_gadget 地址,從而達到控制流劫持獲取shell 的目的。
無論哪條漏洞利用路徑,攻擊者都無法擺脫對虛擬內(nèi)存地址的依賴。在大部分情況下,攻擊者首先通過信息泄露獲取one_gadget 的地址信息,然后向程序傳入one_gadget 地址,在其他情況下,攻擊者可以跳過信息泄露這一步驟進行漏洞利用,但是仍然需要向程序注入正確的one_gadget 地址。
要想實現(xiàn)一次完整的攻擊過程,必須要知道one_gadget 的虛擬內(nèi)存地址。基于這一發(fā)現(xiàn),本文認為防御的關(guān)鍵在于兩點,一是不泄露one_gadget的地址,二是使泄露的one_gadget 地址失效。因此,為了防御控制流劫持,本文提出擬態(tài)執(zhí)行,將虛擬內(nèi)存地址空間作為擬態(tài)界,在擬態(tài)界內(nèi)部異構(gòu),當擬態(tài)界內(nèi)與擬態(tài)界外產(chǎn)生數(shù)據(jù)交換時,則對數(shù)據(jù)進行表決。擬態(tài)執(zhí)行模型如圖3 所示。
擬態(tài)執(zhí)行過程如下。首先對一個即將運行的程序進行無規(guī)律的內(nèi)存空間布局異構(gòu),異構(gòu)成n(n≥1)份,并使之冗余執(zhí)行。當有數(shù)據(jù)流出進程的虛擬內(nèi)存空間時對數(shù)據(jù)內(nèi)容進行表決,總共進行m?1(且n、m不能同時為1)次表決。當表決一致時,記錄各冗余運行程序的狀態(tài);當表決不一致時,說明遭到了攻擊,則阻斷攻擊并隨之進行擬態(tài)變換,也就是再次進行無規(guī)律的變化運行時的內(nèi)存空間布局。當n=1時,每次表決都觸發(fā)一次擬態(tài)變換。
因為會對程序進行異構(gòu)化處理,所以通過靜態(tài)分析獲得的one_gadget 地址在實施攻擊時是無效的。因此,針對擬態(tài)執(zhí)行的攻擊有2 種情況。
情況1爆破one_gadget 地址,逐一嘗試暴力枚舉的one_gadget 地址,直到成功。
情況2如圖4 所示,通過2 次漏洞利用完成,第一次上傳 payload 利用程序本身的漏洞獲取one_gadget 地址,然后根據(jù)one_gadget 再次構(gòu)造并上傳payload 實施后面的攻擊步驟,最終實現(xiàn)控制流劫持并獲取shell,獲取機器控制權(quán)。
下面,證明擬態(tài)執(zhí)行具備防御控制流劫持的效果。記在擬態(tài)執(zhí)行過程中觸發(fā)的擬態(tài)變換次數(shù)為t(m?1≥t≥0)。
情況1 的證明如下。當n=1時,設尋址位數(shù)為k,在擬態(tài)變換的干擾作用下,一次地址爆破成功的概率始終為,無論k取32 還是64,都有p≈ 0;當n> 1時,只可能按概率p爆破成功一路冗余執(zhí)行進程中的one_gadget 地址劫持控制流,然而,其他冗余進程仍按照原控制流執(zhí)行,那么一定會在接下來的表決中發(fā)現(xiàn)不一致的擬態(tài)界內(nèi)外數(shù)據(jù)交換,進而阻斷攻擊,然后進行擬態(tài)變換使one_gadget 地址失效。
圖3 擬態(tài)執(zhí)行模型
圖4 針對擬態(tài)執(zhí)行的抽象攻擊過程
情況2 的證明如下。當n=1時,每次數(shù)據(jù)流出擬態(tài)界時需進行表決,每次表決都會觸發(fā)一次擬態(tài)變換,那么攻擊者通過第一次上傳payload 獲取的one_gadget 地址在實施接下來的攻擊步驟時(第二次上傳payload)無效。當n> 1時,攻擊者通過第一次上傳payload 來泄露one_gaaget 地址意味著one_gadget 地址將作為數(shù)據(jù)流出擬態(tài)界,會觸發(fā)一次表決,不同冗余執(zhí)行程序中的one_gadget 地址是不同的,那么在表決時一定會發(fā)現(xiàn)one_gadget 地址泄露,從而阻斷信息泄露,此時攻擊端將無法進行接下來的攻擊步驟。
本文在Linux 操作系統(tǒng)上實現(xiàn)了擬態(tài)執(zhí)行的原型系統(tǒng)MimicBox。如圖5 所示,MimicBox 是一個n>1、t=0的擬態(tài)執(zhí)行系統(tǒng)。MimicBox 對經(jīng)異構(gòu)處理的冗余執(zhí)行的等價進程進行監(jiān)控,當程序執(zhí)行到表決點時進行表決,當表決判定為不一致時,MimicBox將對程序進行阻斷,從而保證one_gadget 地址不泄露。
1) 進程異構(gòu)化處理
圖5 MimixBox 原理框架
Linux 操作系統(tǒng)本身就提供了許多內(nèi)存空間布局異構(gòu)相關(guān)的技術(shù),如Canary 棧監(jiān)控、PIE、ASLR等。在編譯時,Canary 技術(shù)通過在返回地址之前插入一個隨機數(shù),能夠?qū)崿F(xiàn)對程序代碼本身的異構(gòu),PIE 程序在裝載時可以被裝載進隨機的虛擬內(nèi)存空間;在運行時,ASLR 會對執(zhí)行進程的堆段、棧段、共享庫的基地址進行隨機化。ASLR 技術(shù)和PIE 技術(shù)都能實現(xiàn)內(nèi)存空間布局的異構(gòu)。MimicBox 充分利用Linux 操作系統(tǒng)提供的上述技術(shù)對程序進行異構(gòu)化處理。
2) 表決點設置
因為擬態(tài)執(zhí)行要求在擬態(tài)界內(nèi)與擬態(tài)界外產(chǎn)生數(shù)據(jù)交換時進行表決,并且MimicBox 的擬態(tài)界就是虛擬內(nèi)存空間,所以當MimicBox 發(fā)現(xiàn)冗余執(zhí)行的進程有數(shù)據(jù)流出虛擬內(nèi)存空間時,主動進行表決。因為Linux 中一個進程的虛擬內(nèi)存中的數(shù)據(jù)必須通過系統(tǒng)調(diào)用才能流向別處,所以MimicBox 將表決點設置在所有輸出類的系統(tǒng)調(diào)用。
3) 表決點監(jiān)控
ptrace 系統(tǒng)調(diào)用是Linux 操作系統(tǒng)向用戶態(tài)提供的調(diào)試接口。當ptrace 系統(tǒng)被調(diào)用時,會產(chǎn)生一個中斷信號,ptrace 通過監(jiān)聽這個信號來判斷是否產(chǎn)生系統(tǒng)調(diào)用。使用ptrace 不僅能夠監(jiān)聽系統(tǒng)調(diào)用的產(chǎn)生,而且還能控制進程的運行狀態(tài)。MimicBox使用ptrace 系統(tǒng)調(diào)用實現(xiàn)系統(tǒng)調(diào)用的攔截、替換、表決內(nèi)容提取、返回值覆蓋等功能。
4) 冗余執(zhí)行體管理
MimicBox 使用編號對冗余執(zhí)行體進行管理,編號從0 開始,依次遞增1。
5) 冗余輸出合并
擬態(tài)界內(nèi)部執(zhí)行進程的冗余必將導致擬態(tài)界內(nèi)與擬態(tài)界外數(shù)據(jù)交換的冗余,為了不對擬態(tài)界外造成影響,除了對數(shù)據(jù)交換進行表決之外,還必須合并冗余的數(shù)據(jù)交換。Linux 中使用文件描述符或網(wǎng)絡套接字來標識具體的數(shù)據(jù)流向的目標,比如磁盤文件、socket 套接字等。MimicBox 使用目標點描述符來管理數(shù)據(jù)交換,目標點描述符的定義如圖6所示。當MimicBox 發(fā)現(xiàn)open 或openat 系統(tǒng)調(diào)用并且成功打開文件時,將創(chuàng)建一個目標點描述符。當MimicBox 發(fā)現(xiàn)等價的冗余進程進行寫操作時,就要檢查目標點描述符的desc 域,如果一致就進行合并。具體來說,使0 號執(zhí)行體中的進程正常執(zhí)行,通過getpid 系統(tǒng)調(diào)用替換其他等價進程中的系統(tǒng)調(diào)用,然后通過0 號執(zhí)行體中的進程系統(tǒng)調(diào)用的返回值覆蓋其他等價進程中系統(tǒng)調(diào)用的返回值。另外,對于網(wǎng)絡通信來說,除了要合并相關(guān)的輸出類系統(tǒng)調(diào)用之外,還要對connect、listen、accept、bind 等相關(guān)系統(tǒng)調(diào)用合并。合并方式與合并輸出類系統(tǒng)調(diào)用的方式類似,不同的是,網(wǎng)絡通信是在發(fā)現(xiàn)connect、accept 系統(tǒng)調(diào)用時創(chuàng)建目標點描述符。
圖6 目標點描述符的定義
6) 等價線/進程匹配
為了更好地支持多線/進程,在表決時要準確定位到相互功能等價的冗余線/進程,這要求等價線/進程在MimicBox 中要有相同的標識。在MimicBox中,對線/進程按照層次進行編號,使用一系列編號組成的序列標識線/進程。圖7 展示了冗余等價任務中其中一個任務的線/進程關(guān)系,進程pid=2 646 由進程pid=2 645 通過調(diào)用fork 函數(shù)得到,一個線程從0 開始給它的子線程編號,當再創(chuàng)建新線程時,編號依次遞增1。對于一個線程,沿著父線程方向回溯,直到進程的第一個線程,由所途經(jīng)線程的編號組成的序列即為這個線程的標識。以線程tid=2 660和線程tid=2 654 為例,它們在該執(zhí)行體中的唯一標識序列分別為(2,0,1)和(0,1,0)。在冗余等價任務中,具有相同標識的線程視為等價線程。
本文從防御有效性和性能2 個方面對MimicBox進行了實驗評估。實驗旨在回答如下2 個問題。
1) MimicBox 的防御邊界在哪里?能防御哪些類型的攻擊?
2) 任何安全措施必將導致效率的降低,MimicBox 是否會帶來不可接受的性能損耗?
為了驗證MimicBox 防御控制流劫持攻擊的有效性,設置了3 種測試環(huán)境,并在3 種不同的場景進行有效性驗證實驗或測試。
5.1.1 理想場景驗證實驗
理想環(huán)境下的驗證實驗使用CTF Pwn 奪旗賽中的題目作為實驗樣本。在CTF Pwn 奪旗賽中,通常會將編譯好的帶漏洞可執(zhí)行程序發(fā)放給選手,選手通過對二進制程序進行逆向分析和調(diào)試來找出漏洞,并編寫攻擊代碼,以遠程代碼執(zhí)行的方式拿到flag。
Pwn 程序中的漏洞覆蓋面廣泛,幾乎包含了絕大多數(shù)已知的二進制漏洞。一般來說,Pwn 程序中除了預先設置的漏洞之外不包含其他漏洞,能使實驗更有針對性。因此本文采用CTF wiki 上的題目作為實驗樣本,進行驗證實驗。
使用MimicBox 將CTF wiki 中的Pwn 題目對應的帶漏洞程序保護起來,然后用CTF wiki 中提供的expliot 腳本進行遠程攻擊。每次執(zhí)行exploit 腳本記錄下是否獲取目標機器的shell,獲取不到shell則意味著攻擊失敗,防御成功。攻擊實驗結(jié)果如表1 所示。對于棧攻擊、堆攻擊和I/O 文件攻擊,MimicBox 均能防御相關(guān)的漏洞利用。
5.1.2 真實攻防場景測試
為了測試在真實攻防場景下MimicBox 的有效防御能力,將MimicBox 放到了第三屆“強網(wǎng)”擬態(tài)防御國際精英挑戰(zhàn)賽[22],接受來自世界上40 支戰(zhàn)隊的挑戰(zhàn)。第三屆“強網(wǎng)”擬態(tài)防御國際精英挑戰(zhàn)賽在2020 年6 月19 日舉行,為期兩天。此次比賽按照“BMW”模式[23],采取線上白盒積分爭奪賽、線上擬態(tài)白盒挑戰(zhàn)賽、線上擬態(tài)黑盒挑戰(zhàn)賽的全新賽制。其中,白盒積分爭奪賽采取CTF Pwn比賽的形式與規(guī)則,MimicBox 出現(xiàn)在白盒積分爭奪賽上。
比賽共出了四道題目,其中兩道題目中的程序未被MimicBox 保護,作為基礎題;另外兩道題目中將同樣的帶漏洞程序采用MimicBox 保護,作為進階題。經(jīng)過48 h 的不間斷攻擊挑戰(zhàn),完成了對比測試。
題目easy-stack 中的目標程序包含一個格式化字符串漏洞和一個棧溢出漏洞;題目newpad 的對應程序中包含一個House of einherjar 類型的堆漏洞。經(jīng)過測試,大部分戰(zhàn)隊能解出基礎題目,然而卻沒有一支戰(zhàn)隊能解出進階題目,這意味著沒有任何戰(zhàn)隊能夠突破MimicBox 的防護,具體測試結(jié)果如表2 所示。
圖7 MimicBox 中的進/線程關(guān)系
表1 CTF Pwn 測試結(jié)果
5.1.3 真實漏洞利用場景驗證實驗
理想場景實驗和真實攻防場景測試表明,MimicBox 對一些基礎漏洞完全具備防御能力,為了驗證MimicBox 對信息泄露的防御能力,選取了2 個真實世界中的軟件漏洞(CVE-2014-0160 和CVE-2018-16890)進行漏洞防護實驗。
CVE-2014-0160 是OpenSSL 中的一個高危漏洞,源于OpenSSL 中的TSL 模塊和DTLS 模塊在調(diào)用memcpy函數(shù)之前沒有對長度參數(shù)進行邊界檢查,將導致過多的內(nèi)存信息復制到緩沖區(qū)以每次64 KB 的速度泄露,泄露信息可能包括服務器私鑰、用戶cookie 和密碼等。
MimicBox 能夠有效防御CVE-2014-0160。當內(nèi)存信息向外泄露時,將會觸發(fā)表決。由于對冗余執(zhí)行的等價進程做了異構(gòu)處理,各冗余進程泄露的內(nèi)存信息不一致,MimicBox 表決時將發(fā)現(xiàn)不一致,從而阻斷信息泄露。
CVE-2018-16890 是7.36.0 版本到7.64.0 版本的curl 中的一個整數(shù)溢出漏洞。curl 處理NTML type-2消息的函數(shù)ntlm_decode_type2_target沒有驗證數(shù)據(jù)是否正確,利用整數(shù)溢出,惡意代碼或者損壞的NTLM 服務器能夠使curl 接收到錯誤的數(shù)據(jù),將導致對一個堆緩沖區(qū)的越界讀取。利用此漏洞,攻擊者可以在服務器上遠程獲取客戶端內(nèi)存至多64 KB 的原始內(nèi)存信息。而且因為連接可以多次進行,服務器理論上可以多次重復地獲取客戶端內(nèi)存信息。
使用MimicBox 保護curl 客戶端,能夠有效防止信息泄露。防御原理與防御CVE-2018-16890 類似,MimicBox 將通過表決發(fā)現(xiàn)各冗余進程泄露的不一致信息從而進行阻斷,具體來說,其發(fā)現(xiàn)了sendto 系統(tǒng)調(diào)用向服務端發(fā)送的內(nèi)容不一致。當客戶端被MimicBox 保護后,在服務端接收不到客戶端泄露的內(nèi)存信息。
表2 挑戰(zhàn)賽測試結(jié)果
5.1.4 有效性評估
理想環(huán)境下的驗證實驗結(jié)果表明,MimicBox能夠防御大部分棧漏洞、堆漏洞和I/O 文件漏洞利用。另外,如表1 所示,在有效異構(gòu)的前提下,MimicBox 只需要使用雙余度即可保證有效性。
真實攻防環(huán)境下的測試表明,相對于單一的基于隨機的異構(gòu)結(jié)構(gòu),MimicBox 的異構(gòu)冗余結(jié)構(gòu)賦予了程序極強的內(nèi)生安全能力。
真實漏洞利用場景下的驗證實驗表明,對于以心臟滴血為代表的信息泄露類漏洞來說,擬態(tài)執(zhí)行中蘊含的異構(gòu)冗余特性使MimicBox 具備天然的防御能力。
總而言之,經(jīng)過3 種不同測試場景下的充分實驗,對于第一個問題,擬態(tài)執(zhí)行的原型系統(tǒng)MimicBox 能夠有效阻斷絕大部分已知的基于棧利用、堆利用、I/O 文件攻擊和信息泄露的進程控制流劫持。
針對MimicBox 的性能測試,則使用SPEC CPU2006 完成。具體實驗環(huán)境配置如表3 所示。首先對SPECint 2006 中的8 個樣本進行基準測試,然后用MimicBox 將這8 個樣本保護起來,測試多余度情況下的性能并計算額外性能開銷(overhead)。測試結(jié)果如圖8 所示,額外性能開銷結(jié)果如表4所示。
對比基準程序和MimicBox 多余度測試結(jié)果,MimicBox 所需的時間、額外性能開銷與冗余度呈正相關(guān)關(guān)系。橫向觀察表4,隨著冗余度的增加,額外性能開銷也隨之增加??v向觀察表4,當n=2時,所有樣本的額外性能損耗都不超過13%。對于CPU 密集型程序來說,MimicBox 導致的性能損耗是可以接受的。
表3 性能測試環(huán)境配置
在已知的面向進程控制流劫持的防御方法中,CFI 是較有效的一種。本節(jié)將對擬態(tài)執(zhí)行與CFI 進行一個簡單的對比。
CFI 認為只有符合控制流圖的控制流轉(zhuǎn)移才是合法的[24]。根據(jù)輸入程序類型的不同,控制流完整性實施方案可分為面向源代碼和面向二進制2 種[25];根據(jù)控制流轉(zhuǎn)移時檢查的精細程度,CFI 又分為粗粒度CFI 和細粒度CFI[12]。CFI 被認為是較有效的一種防御控制流劫持的方案,然而,CFI 仍然存在一些局限性。
圖8 測試結(jié)果
表4 MimicBox 多余度額外性能損耗
粗粒度的CFI 往往有效性較差,而細粒度的CFI 為了追求高有效性,往往導致不可接受的額外性能開銷。文獻[26]中的Picon 是一個面向源代碼的CFI 框架,導致程序的平均運行時間增加了900多倍;Bincon[27]是一個面向二進制的CFI 框架,導致程序的平均運行時間增加了20 多倍。為了同時追求高有效性和低開銷,一些研究者著手于硬件加速,以現(xiàn)有的硬件手段來降低CFI 的開銷[25-30]。使用硬件雖然能帶來一定的開銷下降,但是卻不可避免地帶來了一定的成本上升。
擬態(tài)執(zhí)行卻是一種輕量、高有效、低開銷、低成本的防御方案。擬態(tài)執(zhí)行不需要在程序執(zhí)行之前建立控制流圖,具備內(nèi)生安全能力,額外性能開銷較低,成本低廉。擬態(tài)執(zhí)行與面向源代碼的CFI 相比,對源代碼的依賴程度?。慌c面向二進制的CFI相比,不需要進行反編譯或插樁;與粗粒度的CFI相比,能夠防御的攻擊類型更廣泛;與細粒度的CFI相比,有效防御能力相當,但是擬態(tài)執(zhí)行的額外性能開銷遠遠小于CFI。
另外,CFI 無法抵御內(nèi)存信息泄露,而擬態(tài)執(zhí)行能夠有效防止內(nèi)存信息泄露。
總之,擬態(tài)執(zhí)行是相對于CFI 更實用的一種用來防御進程控制流劫持的方法。
即使MimicBox 是退化的軟件擬態(tài)執(zhí)行系統(tǒng)原型,但是經(jīng)過實驗驗證,其幾乎可以防御絕大部分已知類型的控制流劫持攻擊。然而,MimicBox 仍存在以下2 個方面的局限性。
1) 對于I/O 密集型程序,MimicBox 將可能導致較大的性能下降。性能下降的主要原因一方面是擬態(tài)系統(tǒng)的內(nèi)在特性,另一方面是過多的無意義的系統(tǒng)調(diào)用處理。擬態(tài)執(zhí)行強調(diào)在擬態(tài)界內(nèi)向擬態(tài)界外流出數(shù)據(jù)時進行表決,而MimicBox 使用ptrace攔截所有的系統(tǒng)調(diào)用,對其中的部分系統(tǒng)調(diào)用進行表決,這大大降低了ptrace 的有效使用率。另外,使用ptrace 提取系統(tǒng)調(diào)用參數(shù)、控制進程狀態(tài)等操作使整個系統(tǒng)中多出許多次額外的系統(tǒng)調(diào)用。
2) 存在表決假陽導致的誤報問題。導致表決假陽的主要原因是MimicBox 中冗余進程之間存在內(nèi)生的不一致屬性,比如進程號、隨機數(shù)、文件描述符等。當這些不一致屬性作為數(shù)據(jù)流出擬態(tài)界時,往往導致表決誤報。
為了防御進程控制流劫持攻擊,本文提出了擬態(tài)執(zhí)行方法。將擬態(tài)防御的DHR 構(gòu)造引入進程執(zhí)行過程中,在異構(gòu)冗余的基礎之上進行表決,能夠有效發(fā)現(xiàn)攻擊并采取防御措施。
擬態(tài)執(zhí)行的原型系統(tǒng)MimicBox 驗證了擬態(tài)執(zhí)行的可行性和防御有效性,同時說明擬態(tài)執(zhí)行具有良好的發(fā)展前景。擬態(tài)執(zhí)行是一種輕量的、對用戶透明的防御方式,應用領域可以涵蓋云安全、系統(tǒng)安全、物聯(lián)網(wǎng)設備安全等。
本文建立了進程控制流劫持攻擊的威脅模型,經(jīng)過對模型的分析,提出了進程的擬態(tài)執(zhí)行防御模型,并基于該模型,實現(xiàn)了原型系統(tǒng)。經(jīng)過對原型系統(tǒng)的安全性測試,驗證了擬態(tài)執(zhí)行的防御有效性。最后提出了擬態(tài)執(zhí)行的發(fā)展前景和推廣價值。