叶雁秋,王震宇,赵利军
(解放军信息工程大学,郑州450001)
ARM架构中控制流完整性验证技术研究
叶雁秋,王震宇,赵利军
(解放军信息工程大学,郑州450001)
通用平台目标二进制代码运行时控制流的提取主要依赖于处理器硬件特性,或其动态二进制插桩工具,该平台的控制流完整性验证方法无法直接移植到进阶精简指令集机器(ARM)架构中。为此,基于控制流完整性验证技术,设计一种用于ARM架构,利用缓冲溢出漏洞检测控制流劫持攻击的方法。该方法在程序加载时、执行前动态构建合法跳转地址白名单,在目标二进制代码动态执行过程中完成控制流完整性验证,从而检测非法控制流转移,并对非法跳转地址进行分析,实现漏洞的检测和诊断。在ARM-Linux系统的动态二进制分析平台上实施测试,结果表明,该方法能够检测出漏洞,并精确定位攻击矢量。
控制流完整性;进阶精简指令集机器架构;合法地址白名单;动态二进制分析;攻击矢量定位
当前多数恶意代码的攻击行为大都需劫持并修改系统或二进制代码的控制流[1]。控制流完整性(Control Flow Integrity,CFI)[2]验证技术在二进制代码运行时动态监控控制流,判断是否与源码设计时控制流属性一致,用于控制流劫持攻击的检测和防御[3]。
文献[4]通过从源码或者汇编码中提取静态控制流,在编译器中加入控制流完整性验证,实现了对恶意改变控制流的攻击的有效防御。Hypersafe利用控制流完整性验证方法有效确保了开源虚拟机管理器的可信性[5]。然而,在现实情况中,应用程序的源码大多都是不公开的或者根本无法获取的(比如遗留程序),这种情况下静态时控制流的获取需要依赖编译技术,而静态反编译技术不能很好地处理代码加壳、代码混淆等复杂情况。
CFIMon结合了静态分析和运行时训练的方法
来收集合法控制流转移,然后利用Intel处理器中的Branch Tracing Store(BTS)机制收集程序的实际执行流,最后对控制流完整性进行验证[6]。文献[7]基于控制流完整性验证构建的3种控制流劫持攻击防御工具在执行运行时控制流完整性监视时也都是利用了通用平台处理器的硬件特性。这些基于处理器硬件特性的控制流完整性验证技术由于其平台相关性,在目标处理器架构(如本文研究的进阶精简指令集机器(Advanced RISC Machine,ARM)架构不具备相应硬件特性时无法发挥其有效性。
Total-CFI是一款在软件仿真器上通过执行全系统的控制流完整性验证来检测漏洞利用的工具。Total-CFI通过构建合法目标跳转地址的white list作为合法控制流的跳转目标。Total-CFI在执行控制流完整性验证的过程同时结合了对目标程序动态执行过程中实际控制流跳转地址在white-list和对应线程堆栈中的检测。因此,Total-CFI不仅具有漏洞利用的检测能力,还能够对攻击技术类别、payload等信息进行精确定位,且带来性能负载不会超过64%[8]。
目前,针对嵌入式架构上控制流完整性验证方面的研究还比较少。文献[9]在现场可编程门阵列(Field Programmable Gate Array,FPGA)上实现了控制流完整性验证技术,但该方法直接将控制流完整性验证模块构建在芯片中,该方法的通用性和扩展性都有很大局限性。MoCFI将控制流验证技术应用在ARM架构中的二进制可执行程序中,但由于对合法控制流的跳转地址收集上的不完整,导致仍然有一些漏洞利用能够执行[10]。
本文在对ARM架构与X86架构进行对比研究后,设计并实现一种针对ARM架构的控制流完整性验证方法,从而对ARM架构中的控制流劫持攻击进行检测。通过动态二进制分析检测ARM系统中的异常控制流,检测攻击行为,此外,通过对攻击payload进行提取,为后续攻击行为分析提供基础。
ARM架构是基于RISC指令集的32位处理器架构,相比于基于CISC指令集的X86架构,ARM架构处理器在寄存器和指令集上有很大差异。相比于X86架构的4个可用数据寄存器和4个指针寄存器,ARM架构中共有37个寄存器,其中,31个为通用寄存器;6个为状态寄存器。ARM架构中的37个寄存器根据处理器运行模式的不同,能够使用的寄存器也不同,其中,用户模式和系统模式使用相同的寄存器[11]。根据ARM子函数调用规则(ARM Procedure Call Standard,AAPCS)[12],在用户模式和系统模式下,ARM架构中可用寄存器及其用法如表1所示。
表1 子过程调用时的寄存器作用
根据ARM子函数调用的参数传递规则:如果形参个数少于4或者等于4,则形参由R0,R1,R2,R3这4个寄存器进行过传递,若形参个数大于4,大于4之外的参数必须通过堆栈进行传递。
ARM架构中的跳转指令都被称之为branch指令,主要有6个,如表2所示。
表2 ARM架构中跳转指令功能描述
基于以上信息和对ARM指令集的研究,可以得到以下2个结论:
(1)在ARM架构中,在子过程调用出现时,首先执行跳转指令,进入子过程后,执行指令为对链接寄存器(LR寄存器)和栈桢寄存器(R11/FP寄存器)进行保存,其指令类型为PUSH{FP,LR,RX},其中,RX表示其他可能需要保存的通用寄存器,不是必选。非子过程调用的跳转指令执行后,则不会执行该指令。
(2)在列车动载作用下,管片会产生一定的拉应力和压应力增量。其中,最大拉应力增量集中在管片标准块拱腰中部内侧和拱底块端部外侧,这些位置在自重应力作用下表现为压应力;最大压应力增量集中在管片标准块拱腰中部外侧、拱底块端部内侧及拱顶封顶块内侧,这些位置在自重应力作用下表现为拉应力。因此,在列车动载作用下,隧道管片断面的拉应力和压应力水平均存在一定程度的降低。
(2)子过程调用返回时,首先要将进入子过程时保存的返回地址和调用者的栈桢地址恢复到LR寄存器和FP寄存器中,其指令类型为POP{FP,LR, RX},其中,RX表示其他可能需要恢复的寄存器。然后再执行跳转指令,其指令为BX LR,而非子过程调用的跳转指令返回时,则不会出现出栈操作。
本文设计的ARM架构中控制流完整性验证技术的整体框架如图1所示。其中,主要包含2个模块,即合法地址白名单、控制流完整性验证模块。
图1 CFI验证系统总体框架
在目标程序加载之后且运行之前,构建该程序的合法地址白名单,合法地址白名单中包含目标程序中所有控制流转移的合法目标地址。然后在程序开始执行后,对目标程序的指令序列进行跟踪解析,将程序中所有控制流转移指令都交由控制流完整性验证模块进行分析,分析结果以诊断报告的形式保存。
2个模块均运行于ARM-Linux系统全系统动态二进制分析平台上,该分析平台提供了对目标系统中事件(如程序加载、程序开始、模块加载、指令执行等事件)的插桩,并提供对这事件注册回调函数和提取目标系统内存、寄存器等信息的能力[13]。
4.1 合法地址白名单模块
4.1.1 合法地址白名单构成
合法地址白名单中的地址主要由二进制文件和共享目标文件(对应Windows系统中的动态链接库文件)中的可重定位表和符号表中的函数符号地址(类似Windows系统中的导出表)构成。出于兼容性的考虑,当前大多数二进制文件都会被编译为可重定位的,ARM-Linux系统中的二进制文件以及链接库文件都采用ELF格式,这些文件在编译时默认都会被设置为可重定位。当加载器无法将二进制文件加载到其默认的加载地址时,加载器就会执行重定位操作。加载器会根据重定位表修复重定位表中的所有条目的地址。类似的,符号表中的所有函数符号信息包含了一个给定模块中可用于被其他模块调用的函数。这些函数的地址都是在二进制文件运行时根据相应模块的实际加载地址来确定的。因此,重定位表和模块的符号表中的所有函数符号条目就构成了一个模块中的有效跳转地址。本文通过直接从二进制可执行文件和共享目标文件中提取合法跳转地址的方式,取代从源码中构建控制流图的传统方式,该方式可以有效解决现实中通常无法获得所有相关文件(包括可执行文件和共享目标文件)的源码的情况。
当应用程序被创建时,二进制文件加载会将进程对应的二进制文件加载到内存,开始构建目标进程的虚拟地址空间,这时直接从目标系统物理内存中读取重定位表和符号表,加入合法地址白名单。另外,ARM-Linux系统中每一个进程都由一个task_ struct数据结构维护,该数据结构中包含进程的虚拟地址划分。对于进程所有包含的模块,提取其加载的基地址,然后对该模块中的重定位表和符号表进行提取,将其与模块加载基地址合并后的地址信息加入合法地址白名单。直接从目标系统内存或者磁盘中提取数据并分析对目标系统的性能会由较大影响,为了降低这种性能影响,采取了一种优化策略:直接静态的将目标系统中所有共享目标文件和对应二进制可执行文件提取出来,在本地利用交叉编译环境提取器重定位表和符号表中函数符号信息,系统加载时,直接将这些信息保存到二进制分析平台的缓存中,这样在进程创建时,只需从其task_struct数据结构中提取模块基地址即可,不用再从内存或者磁盘读取该模块中的数据。通过这种减少内存和磁盘数据读取的操作可以有效降低控制流完整性验证执行的性能消耗。
4.2 控制流完整性验证模块
在ARM架构中执行控制流完整性验证,首先从目标系统提取进程执行指令流,对所有分支指令(除B imm类型指令外)的目标地址进行验证,以判断该地址是否属于合法跳转地址。
为了提高对攻击漏洞利用类型检测的准确性以及攻击payload的提取,基于第2节中提到的2个观察结果以及ARM架构中用于控制流转移的跳转指令分析结果,对于LR/FP寄存器进行操作的PUSH/ POP指令对单独进行控制流完整性验证。其具体实现如图2所示。
图2 控制流完整性的验证流程
实现硬件平台为Macbook Pro MD313笔记本,搭载Intel i5 2.4 GHz处理器、4 GB内存,主机操作系统为Ubuntu 13.10,在主机系统中运行前期研究构建的基于QMEU 1.0的动态二进制分析平台;仿真环境中,仿真硬件为搭载ARM-926T处理器的开发版,目标操作系统为debian-squeeze,其内核版本为2.6.32。
5.1 实验测试
为验证本文中提供的漏洞利用检测工具的有效性,在上述实验环境中重构了exploit-db中的2个POC(Proof of Concept)实例。下面分别对2个漏洞利用实例及本文中的检测工具的结果进行分析。2个漏洞程序的代码如下:
图3介绍对2个漏洞程序的利用过程,其中,实现表示程序正常执行时的控制流;虚线表示漏洞利用后程序执行时的控制流。
图3 2种漏洞程序执行流程
表3给出了漏洞利用检测插件的诊断报告中的部分信息。从表3中看可以看到,该方法成功的检测出了漏洞利用类型、漏洞所在函数、攻击矢量等的详细信息。
表3 诊断报告中提取的部分信息
5.2 性能评估
通过对加载了本文分析插件的情况和未加载分析插件2种情况,对目标系统中应用程序的启动速度进行了测试对比,如图4所示。从图中可以看出,分析插件对系统性能的负载在20%左右(虽然使用的分析平台具备对内核代码进行跟踪的能力,但本文实验中对跟踪的指令地址进行了限定,仅分析目标二进制代码代码段的指令,开启所有指令跟踪时,负载在1倍左右),相比于通用平台中,基于PIN, DynamoRIO等动态二进制插桩(Dynamic Binary Instrumentation,DBI)工具构建的分析工具的性能损耗通常都在2倍以上[14],该方法能够满足嵌入式ARM架构中对时效性的要求。
图4 应用程序启动时间对比
本文基于ARM-Linux系统动态二进制分析平台,设计并实现ARM架构中的控制流完整性验证技术。实例验证了该技术的有效性和精确性。由于构建插件的平台本身具有全系统分析能力,因此该技术对内核漏洞的检测同样有效。另外,通过对比插件加载前后应用程序的响应时间,可以看出,其对系统性能的影响在可接受范围内,负载问题不会成为瓶颈。然而,该技术虽然能够检测ROP攻击,但无法对ROP攻击的gadgets模块进行检测,今后将针对该问题做进一步优化。
[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]纪宇鹏.动态二进制程序漏洞挖掘的系统设计[D].北京:北京邮电大学,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架构中控制流完整性验证技术研究[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-),男,硕士研究生,主研方向:嵌入式系统,信息安全;王震宇,副教授;赵利军,硕士研究生。
2014-03-18
:2014-04-28E-mail:yyq19881203@hotmail.com