葉雁秋,王震宇,趙利軍
(解放軍信息工程大學(xué),鄭州450001)
ARM架構(gòu)中控制流完整性驗證技術(shù)研究
葉雁秋,王震宇,趙利軍
(解放軍信息工程大學(xué),鄭州450001)
通用平臺目標(biāo)二進(jìn)制代碼運行時控制流的提取主要依賴于處理器硬件特性,或其動態(tài)二進(jìn)制插樁工具,該平臺的控制流完整性驗證方法無法直接移植到進(jìn)階精簡指令集機器(ARM)架構(gòu)中。為此,基于控制流完整性驗證技術(shù),設(shè)計一種用于ARM架構(gòu),利用緩沖溢出漏洞檢測控制流劫持攻擊的方法。該方法在程序加載時、執(zhí)行前動態(tài)構(gòu)建合法跳轉(zhuǎn)地址白名單,在目標(biāo)二進(jìn)制代碼動態(tài)執(zhí)行過程中完成控制流完整性驗證,從而檢測非法控制流轉(zhuǎn)移,并對非法跳轉(zhuǎn)地址進(jìn)行分析,實現(xiàn)漏洞的檢測和診斷。在ARM-Linux系統(tǒng)的動態(tài)二進(jìn)制分析平臺上實施測試,結(jié)果表明,該方法能夠檢測出漏洞,并精確定位攻擊矢量。
控制流完整性;進(jìn)階精簡指令集機器架構(gòu);合法地址白名單;動態(tài)二進(jìn)制分析;攻擊矢量定位
當(dāng)前多數(shù)惡意代碼的攻擊行為大都需劫持并修改系統(tǒng)或二進(jìn)制代碼的控制流[1]??刂屏魍暾?Control Flow Integrity,CFI)[2]驗證技術(shù)在二進(jìn)制代碼運行時動態(tài)監(jiān)控控制流,判斷是否與源碼設(shè)計時控制流屬性一致,用于控制流劫持攻擊的檢測和防御[3]。
文獻(xiàn)[4]通過從源碼或者匯編碼中提取靜態(tài)控制流,在編譯器中加入控制流完整性驗證,實現(xiàn)了對惡意改變控制流的攻擊的有效防御。Hypersafe利用控制流完整性驗證方法有效確保了開源虛擬機管理器的可信性[5]。然而,在現(xiàn)實情況中,應(yīng)用程序的源碼大多都是不公開的或者根本無法獲取的(比如遺留程序),這種情況下靜態(tài)時控制流的獲取需要依賴編譯技術(shù),而靜態(tài)反編譯技術(shù)不能很好地處理代碼加殼、代碼混淆等復(fù)雜情況。
CFIMon結(jié)合了靜態(tài)分析和運行時訓(xùn)練的方法
來收集合法控制流轉(zhuǎn)移,然后利用Intel處理器中的Branch Tracing Store(BTS)機制收集程序的實際執(zhí)行流,最后對控制流完整性進(jìn)行驗證[6]。文獻(xiàn)[7]基于控制流完整性驗證構(gòu)建的3種控制流劫持攻擊防御工具在執(zhí)行運行時控制流完整性監(jiān)視時也都是利用了通用平臺處理器的硬件特性。這些基于處理器硬件特性的控制流完整性驗證技術(shù)由于其平臺相關(guān)性,在目標(biāo)處理器架構(gòu)(如本文研究的進(jìn)階精簡指令集機器(Advanced RISC Machine,ARM)架構(gòu)不具備相應(yīng)硬件特性時無法發(fā)揮其有效性。
Total-CFI是一款在軟件仿真器上通過執(zhí)行全系統(tǒng)的控制流完整性驗證來檢測漏洞利用的工具。Total-CFI通過構(gòu)建合法目標(biāo)跳轉(zhuǎn)地址的white list作為合法控制流的跳轉(zhuǎn)目標(biāo)。Total-CFI在執(zhí)行控制流完整性驗證的過程同時結(jié)合了對目標(biāo)程序動態(tài)執(zhí)行過程中實際控制流跳轉(zhuǎn)地址在white-list和對應(yīng)線程堆棧中的檢測。因此,Total-CFI不僅具有漏洞利用的檢測能力,還能夠?qū)艏夹g(shù)類別、payload等信息進(jìn)行精確定位,且?guī)硇阅茇?fù)載不會超過64%[8]。
目前,針對嵌入式架構(gòu)上控制流完整性驗證方面的研究還比較少。文獻(xiàn)[9]在現(xiàn)場可編程門陣列(Field Programmable Gate Array,FPGA)上實現(xiàn)了控制流完整性驗證技術(shù),但該方法直接將控制流完整性驗證模塊構(gòu)建在芯片中,該方法的通用性和擴展性都有很大局限性。MoCFI將控制流驗證技術(shù)應(yīng)用在ARM架構(gòu)中的二進(jìn)制可執(zhí)行程序中,但由于對合法控制流的跳轉(zhuǎn)地址收集上的不完整,導(dǎo)致仍然有一些漏洞利用能夠執(zhí)行[10]。
本文在對ARM架構(gòu)與X86架構(gòu)進(jìn)行對比研究后,設(shè)計并實現(xiàn)一種針對ARM架構(gòu)的控制流完整性驗證方法,從而對ARM架構(gòu)中的控制流劫持攻擊進(jìn)行檢測。通過動態(tài)二進(jìn)制分析檢測ARM系統(tǒng)中的異常控制流,檢測攻擊行為,此外,通過對攻擊payload進(jìn)行提取,為后續(xù)攻擊行為分析提供基礎(chǔ)。
ARM架構(gòu)是基于RISC指令集的32位處理器架構(gòu),相比于基于CISC指令集的X86架構(gòu),ARM架構(gòu)處理器在寄存器和指令集上有很大差異。相比于X86架構(gòu)的4個可用數(shù)據(jù)寄存器和4個指針寄存器,ARM架構(gòu)中共有37個寄存器,其中,31個為通用寄存器;6個為狀態(tài)寄存器。ARM架構(gòu)中的37個寄存器根據(jù)處理器運行模式的不同,能夠使用的寄存器也不同,其中,用戶模式和系統(tǒng)模式使用相同的寄存器[11]。根據(jù)ARM子函數(shù)調(diào)用規(guī)則(ARM Procedure Call Standard,AAPCS)[12],在用戶模式和系統(tǒng)模式下,ARM架構(gòu)中可用寄存器及其用法如表1所示。
表1 子過程調(diào)用時的寄存器作用
根據(jù)ARM子函數(shù)調(diào)用的參數(shù)傳遞規(guī)則:如果形參個數(shù)少于4或者等于4,則形參由R0,R1,R2,R3這4個寄存器進(jìn)行過傳遞,若形參個數(shù)大于4,大于4之外的參數(shù)必須通過堆棧進(jìn)行傳遞。
ARM架構(gòu)中的跳轉(zhuǎn)指令都被稱之為branch指令,主要有6個,如表2所示。
表2 ARM架構(gòu)中跳轉(zhuǎn)指令功能描述
基于以上信息和對ARM指令集的研究,可以得到以下2個結(jié)論:
(1)在ARM架構(gòu)中,在子過程調(diào)用出現(xiàn)時,首先執(zhí)行跳轉(zhuǎn)指令,進(jìn)入子過程后,執(zhí)行指令為對鏈接寄存器(LR寄存器)和棧楨寄存器(R11/FP寄存器)進(jìn)行保存,其指令類型為PUSH{FP,LR,RX},其中,RX表示其他可能需要保存的通用寄存器,不是必選。非子過程調(diào)用的跳轉(zhuǎn)指令執(zhí)行后,則不會執(zhí)行該指令。
(2)在列車動載作用下,管片會產(chǎn)生一定的拉應(yīng)力和壓應(yīng)力增量。其中,最大拉應(yīng)力增量集中在管片標(biāo)準(zhǔn)塊拱腰中部內(nèi)側(cè)和拱底塊端部外側(cè),這些位置在自重應(yīng)力作用下表現(xiàn)為壓應(yīng)力;最大壓應(yīng)力增量集中在管片標(biāo)準(zhǔn)塊拱腰中部外側(cè)、拱底塊端部內(nèi)側(cè)及拱頂封頂塊內(nèi)側(cè),這些位置在自重應(yīng)力作用下表現(xiàn)為拉應(yīng)力。因此,在列車動載作用下,隧道管片斷面的拉應(yīng)力和壓應(yīng)力水平均存在一定程度的降低。
(2)子過程調(diào)用返回時,首先要將進(jìn)入子過程時保存的返回地址和調(diào)用者的棧楨地址恢復(fù)到LR寄存器和FP寄存器中,其指令類型為POP{FP,LR, RX},其中,RX表示其他可能需要恢復(fù)的寄存器。然后再執(zhí)行跳轉(zhuǎn)指令,其指令為BX LR,而非子過程調(diào)用的跳轉(zhuǎn)指令返回時,則不會出現(xiàn)出棧操作。
本文設(shè)計的ARM架構(gòu)中控制流完整性驗證技術(shù)的整體框架如圖1所示。其中,主要包含2個模塊,即合法地址白名單、控制流完整性驗證模塊。
圖1 CFI驗證系統(tǒng)總體框架
在目標(biāo)程序加載之后且運行之前,構(gòu)建該程序的合法地址白名單,合法地址白名單中包含目標(biāo)程序中所有控制流轉(zhuǎn)移的合法目標(biāo)地址。然后在程序開始執(zhí)行后,對目標(biāo)程序的指令序列進(jìn)行跟蹤解析,將程序中所有控制流轉(zhuǎn)移指令都交由控制流完整性驗證模塊進(jìn)行分析,分析結(jié)果以診斷報告的形式保存。
2個模塊均運行于ARM-Linux系統(tǒng)全系統(tǒng)動態(tài)二進(jìn)制分析平臺上,該分析平臺提供了對目標(biāo)系統(tǒng)中事件(如程序加載、程序開始、模塊加載、指令執(zhí)行等事件)的插樁,并提供對這事件注冊回調(diào)函數(shù)和提取目標(biāo)系統(tǒng)內(nèi)存、寄存器等信息的能力[13]。
4.1 合法地址白名單模塊
4.1.1 合法地址白名單構(gòu)成
合法地址白名單中的地址主要由二進(jìn)制文件和共享目標(biāo)文件(對應(yīng)Windows系統(tǒng)中的動態(tài)鏈接庫文件)中的可重定位表和符號表中的函數(shù)符號地址(類似Windows系統(tǒng)中的導(dǎo)出表)構(gòu)成。出于兼容性的考慮,當(dāng)前大多數(shù)二進(jìn)制文件都會被編譯為可重定位的,ARM-Linux系統(tǒng)中的二進(jìn)制文件以及鏈接庫文件都采用ELF格式,這些文件在編譯時默認(rèn)都會被設(shè)置為可重定位。當(dāng)加載器無法將二進(jìn)制文件加載到其默認(rèn)的加載地址時,加載器就會執(zhí)行重定位操作。加載器會根據(jù)重定位表修復(fù)重定位表中的所有條目的地址。類似的,符號表中的所有函數(shù)符號信息包含了一個給定模塊中可用于被其他模塊調(diào)用的函數(shù)。這些函數(shù)的地址都是在二進(jìn)制文件運行時根據(jù)相應(yīng)模塊的實際加載地址來確定的。因此,重定位表和模塊的符號表中的所有函數(shù)符號條目就構(gòu)成了一個模塊中的有效跳轉(zhuǎn)地址。本文通過直接從二進(jìn)制可執(zhí)行文件和共享目標(biāo)文件中提取合法跳轉(zhuǎn)地址的方式,取代從源碼中構(gòu)建控制流圖的傳統(tǒng)方式,該方式可以有效解決現(xiàn)實中通常無法獲得所有相關(guān)文件(包括可執(zhí)行文件和共享目標(biāo)文件)的源碼的情況。
當(dāng)應(yīng)用程序被創(chuàng)建時,二進(jìn)制文件加載會將進(jìn)程對應(yīng)的二進(jìn)制文件加載到內(nèi)存,開始構(gòu)建目標(biāo)進(jìn)程的虛擬地址空間,這時直接從目標(biāo)系統(tǒng)物理內(nèi)存中讀取重定位表和符號表,加入合法地址白名單。另外,ARM-Linux系統(tǒng)中每一個進(jìn)程都由一個task_ struct數(shù)據(jù)結(jié)構(gòu)維護,該數(shù)據(jù)結(jié)構(gòu)中包含進(jìn)程的虛擬地址劃分。對于進(jìn)程所有包含的模塊,提取其加載的基地址,然后對該模塊中的重定位表和符號表進(jìn)行提取,將其與模塊加載基地址合并后的地址信息加入合法地址白名單。直接從目標(biāo)系統(tǒng)內(nèi)存或者磁盤中提取數(shù)據(jù)并分析對目標(biāo)系統(tǒng)的性能會由較大影響,為了降低這種性能影響,采取了一種優(yōu)化策略:直接靜態(tài)的將目標(biāo)系統(tǒng)中所有共享目標(biāo)文件和對應(yīng)二進(jìn)制可執(zhí)行文件提取出來,在本地利用交叉編譯環(huán)境提取器重定位表和符號表中函數(shù)符號信息,系統(tǒng)加載時,直接將這些信息保存到二進(jìn)制分析平臺的緩存中,這樣在進(jìn)程創(chuàng)建時,只需從其task_struct數(shù)據(jù)結(jié)構(gòu)中提取模塊基地址即可,不用再從內(nèi)存或者磁盤讀取該模塊中的數(shù)據(jù)。通過這種減少內(nèi)存和磁盤數(shù)據(jù)讀取的操作可以有效降低控制流完整性驗證執(zhí)行的性能消耗。
4.2 控制流完整性驗證模塊
在ARM架構(gòu)中執(zhí)行控制流完整性驗證,首先從目標(biāo)系統(tǒng)提取進(jìn)程執(zhí)行指令流,對所有分支指令(除B imm類型指令外)的目標(biāo)地址進(jìn)行驗證,以判斷該地址是否屬于合法跳轉(zhuǎn)地址。
為了提高對攻擊漏洞利用類型檢測的準(zhǔn)確性以及攻擊payload的提取,基于第2節(jié)中提到的2個觀察結(jié)果以及ARM架構(gòu)中用于控制流轉(zhuǎn)移的跳轉(zhuǎn)指令分析結(jié)果,對于LR/FP寄存器進(jìn)行操作的PUSH/ POP指令對單獨進(jìn)行控制流完整性驗證。其具體實現(xiàn)如圖2所示。
圖2 控制流完整性的驗證流程
實現(xiàn)硬件平臺為Macbook Pro MD313筆記本,搭載Intel i5 2.4 GHz處理器、4 GB內(nèi)存,主機操作系統(tǒng)為Ubuntu 13.10,在主機系統(tǒng)中運行前期研究構(gòu)建的基于QMEU 1.0的動態(tài)二進(jìn)制分析平臺;仿真環(huán)境中,仿真硬件為搭載ARM-926T處理器的開發(fā)版,目標(biāo)操作系統(tǒng)為debian-squeeze,其內(nèi)核版本為2.6.32。
5.1 實驗測試
為驗證本文中提供的漏洞利用檢測工具的有效性,在上述實驗環(huán)境中重構(gòu)了exploit-db中的2個POC(Proof of Concept)實例。下面分別對2個漏洞利用實例及本文中的檢測工具的結(jié)果進(jìn)行分析。2個漏洞程序的代碼如下:
圖3介紹對2個漏洞程序的利用過程,其中,實現(xiàn)表示程序正常執(zhí)行時的控制流;虛線表示漏洞利用后程序執(zhí)行時的控制流。
圖3 2種漏洞程序執(zhí)行流程
表3給出了漏洞利用檢測插件的診斷報告中的部分信息。從表3中看可以看到,該方法成功的檢測出了漏洞利用類型、漏洞所在函數(shù)、攻擊矢量等的詳細(xì)信息。
表3 診斷報告中提取的部分信息
5.2 性能評估
通過對加載了本文分析插件的情況和未加載分析插件2種情況,對目標(biāo)系統(tǒng)中應(yīng)用程序的啟動速度進(jìn)行了測試對比,如圖4所示。從圖中可以看出,分析插件對系統(tǒng)性能的負(fù)載在20%左右(雖然使用的分析平臺具備對內(nèi)核代碼進(jìn)行跟蹤的能力,但本文實驗中對跟蹤的指令地址進(jìn)行了限定,僅分析目標(biāo)二進(jìn)制代碼代碼段的指令,開啟所有指令跟蹤時,負(fù)載在1倍左右),相比于通用平臺中,基于PIN, DynamoRIO等動態(tài)二進(jìn)制插樁(Dynamic Binary Instrumentation,DBI)工具構(gòu)建的分析工具的性能損耗通常都在2倍以上[14],該方法能夠滿足嵌入式ARM架構(gòu)中對時效性的要求。
圖4 應(yīng)用程序啟動時間對比
本文基于ARM-Linux系統(tǒng)動態(tài)二進(jìn)制分析平臺,設(shè)計并實現(xiàn)ARM架構(gòu)中的控制流完整性驗證技術(shù)。實例驗證了該技術(shù)的有效性和精確性。由于構(gòu)建插件的平臺本身具有全系統(tǒng)分析能力,因此該技術(shù)對內(nèi)核漏洞的檢測同樣有效。另外,通過對比插件加載前后應(yīng)用程序的響應(yīng)時間,可以看出,其對系統(tǒng)性能的影響在可接受范圍內(nèi),負(fù)載問題不會成為瓶頸。然而,該技術(shù)雖然能夠檢測ROP攻擊,但無法對ROP攻擊的gadgets模塊進(jìn)行檢測,今后將針對該問題做進(jìn)一步優(yōu)化。
[1]Oh N,Shirvani P P,McCluskey E J.Control-flow Checking by Software Signatures[J].IEEE Transactions on Reliability,2002,51(1):111-122.
[2]Abadi M,Budiu M,Erlingsson U,et al.Control-flow Integrity[C]//Proceedings of the 12th ACM Conference on Computer and Communications Security.[S.l.]: ACM Press,2005:340-353.
[3]Abadi M,Budiu M,Erlingsson U,et al.Control-flow IntegrityPrinciples,Implementations,andApplications[J].ACM Transactions on Information and System Security,2009,13(1):41-54.
[4]Diatchki I,Pike L,Erkok L.Practical Considerations in Control-flow Integrity Monitoring[C]//Proceedings of the 4th IEEE International Conference on Software Testing,VerificationandValidationWorkshops.[S.l.]:IEEE Press,2011:537-544.
[5]Wang Zhi,JiangXuxian.Hypersafe:ALightweight Approach to Provide Lifetime Hypervisor Control-flow Integrity[C]//Proceedings of IEEE Symposium on Security and Privacy.[S.l.]:IEEE Press,2010: 380-395.[6]Xia Yubin,Liu Yutao,Chen Haibo,et al.CFIMon: Detecting Violation of Control Flow Integrity Using Performance Counters[C]//Proceedings of the 42nd AnnualIEEE/IFIPInternationalConferenceon Dependable Systems and Networks.[S.l.]:IEEE Press,2012:1-12.
[7]Park Y J.Efficient Validation of Control Flow Integrity for Enhancing Computer System Security[D].Ames, USA:Iowa State University,2010.
[8]Zhang Chao,Wei Tao,Chen Zhaofeng,et al.Practical Control Flow Integrity and Randomization for Binary Executables[C]//Proceedings of IEEE Symposium on Security and Privacy.[S.l.]:IEEE Press,2013: 559-573.
[9]Abad F A T,Woude J V D,Lu Yi,et al.On-chip Control Flow Integrity Check for Real Time Embedded Systems[C]//Proceedingsofthe 1stInternational Conference on Cyber-physical Systems,Networks,and Applications.[S.l.]:IEEE Press,2013:26-31.
[10]Davi L,Dmitrienko A,Egele M,et al.MoCFI:A FrameworktoMitigateControl-flowAttackson Smartphones[C]//ProceedingsofSymposiumon Network and Distributed System Security.[S.l.]:IEEE Press,2012:544-554.
[11]ARM.ARM Architecture Reference Manual[EB/OL].(2010-07-21).http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0406c/index.html.
[12]AAPCS.ARM Procedure Call Standard for the ARM Architecture[EB/OL].(2010-11-21).http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_ aapcs.pdf.
[13]Wang Zhenyu,Ye Yanqiu,Wang Ruimin.An Out-ofthe-Box Dynamic Binary Analysis Tool for ARM-based Linux[C]//Proceedings of Cyberspace Safety and Security.[S.l.]:Springer,2013:450-457.
[14]紀(jì)宇鵬.動態(tài)二進(jìn)制程序漏洞挖掘的系統(tǒng)設(shè)計[D].北京:北京郵電大學(xué),2012.
編輯 劉 冰
Research on Control Flow Integrity Verification Technology in ARM Architecture
YE Yanqiu,WANG Zhenyu,ZHAO Lijun
(PLA Information Engineering University,Zhengzhou 450001,China)
On common platform,the extraction of run-time control-flow to target binary code relies on either processor’s mechanism or Dynamic Binary Instrumentation(DBI)tools.So,the implementation on common platform can not be transplanted to Advanced RISC Machine(ARM)directly.Based on Control Flow Integrity(CFI)enforcement,this paper designs a method to detect and diagnose control flow hijacking which is implemented by exploit a buffer overflow vulnerability on ARM.This method dynamically builds a white-list of legitimate branch target address before the target binary code execute,performs CFI enforcement to detect illegal control-flow transfer at run-time,analyzes the illegal branch target address to achieve exploit diagnosis.It implements the technique on a dynamic binary analysis platform for ARM-Linux systems.Results show that it can effectively detect the exploit and locates the attack vector.
Control Flow Integrity(CFI);Advanced RISC Machine(ARM)architecture;legitimate address white-list; dynamic binary analysis;attack vector location
葉雁秋,王震宇,趙利軍.ARM架構(gòu)中控制流完整性驗證技術(shù)研究[J].計算機工程, 2015,41(3):151-155,171.
英文引用格式:Ye Yanqiu,Wang Zhenyu,Zhao Lijun.Research on Control Flow Integrity Verification Technology in ARM Architecture[J].Computer Engineering,2015,41(3):151-155,171.
1000-3428(2015)03-0151-05
:A
:TP311
10.3969/j.issn.1000-3428.2015.03.029
葉雁秋(1988-),男,碩士研究生,主研方向:嵌入式系統(tǒng),信息安全;王震宇,副教授;趙利軍,碩士研究生。
2014-03-18
:2014-04-28E-mail:yyq19881203@hotmail.com