自动评估堆溢出的崩溃
文献链接:http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=8115640&isnumber=8115603
一.背景介绍
基于堆的缓冲区溢出是最近安全事件中被广泛利用的漏洞之一。攻击者可以利用高风险堆溢出错误来执行任意代码或者泄露敏感信息(例如密码和加密秘钥),而低风险的溢出可能只会导致拒绝服务攻击(dos),鉴于每年报告的的堆溢出错误数量很大,因此高效地评估其严重性,以便将资源分配给高风险的资源,及时的分析和修补,严重性体现在可利用性(可以利用堆溢出错误来启动攻击执行任意代码)。
演示漏洞可利用性的最终方法就是生成working exploits。以前的工作文献[1],[2],[3],[4]研究自动生成exploits的实际可行性。一种机制是象征性地执行整个程序并将整个约束捕获为谓词,然后通过解决约束来生成working exploits。aeg[1]和mayhem[2]是此类别中的代表。尽管使用漏洞利用生成作为评估方法是准确的,但是由于程序分析技术的限制,它们无法为所有潜在的漏洞生成exploits。
另一种方法评估方法是分析崩溃点(导致程序崩溃的指令)后的执行代码,例如microsoft开发的!exploitable工具检查与崩溃点相同的基本块中的所有指令,来查找漏洞利用点——可利用的特殊用途指令,如控制流转指令(call,jmp)或者影响条件的指令(cmp后跟jnz)。crax[3]采用这两种技术的混合方法:从崩溃点开始,它象征性地执行程序以便找到漏洞利用点。这类解决方案的弱点在于结果的正确性。这种崩溃通常会影响原来程序的行为,阻止了这些技术继续找到其他任何可利用的点。此外,这些工具在发生崩溃的时停止工作,从而导致错过潜在的漏洞利用点。
这篇文献主要贡献是:提出了一组度量来量化堆溢出的可利用性,这是一种旨在自动评估堆溢出可利用性的方法。
基于两个指标:攻击指标和可行性指标。前者是为了测量堆溢出的潜在威胁,后者则是构建实际工作漏洞的具体困难。基于这些指标,作者提出了一个框架hcsifter,用于自动评估堆溢出崩溃。这个框架通过动态程序分析准确检测堆溢出错误。它跟踪所有堆对象并检查相关操作以检查出超出范围的堆内存访问。检测发生在崩溃点实际执行(导致堆溢出的指令)之前,为了提取溢出对程序执行的影响,hcsifter在损坏的内存区域中动态的执行数据恢复,以便程序能够继续正常执行分析,这是在堆溢出发生后继续执行的而不发生任何崩溃的关键步骤(也是与其他动态方法相比的不同之处),在动态后续执行期间,hcsifter会跟踪所有恢复内存区域,并根据漏洞利用模式检测漏洞。作者还确定了几种新的策略,使hcsifter能够检测其他技术遗漏的漏洞点。
在这篇文献中,作者的目标是评估给定崩溃的单一路径。如果存在多个路径,他们的技术可以分别应用于每个路径。使用模糊测试工具,或者符号执行工具,可以找到崩溃的其他执行路径。
二.最终成果
1.作者提出了一套新的度量标准来量化堆溢出的严重性。他们的指标衡量了将崩溃转化为漏洞的难度级别,包括潜在的攻击方面和可行性方面。
2.作者设计并实现了一个原型工具hcsifter,它根据作者的指标自动评估给定堆溢出的可利用性。hcsifter引入了动态内存恢复和二阶溢出,以自动评估漏洞利用生成的难度。
3.作者使用真实易受攻击的程序评估了hcsifter。结果证明了它的有效性和效率性。
三.相关工作
这篇文献主要涉及两个方面:第一个是自动生成开发,第二个是检测软件溢出,特别是本文所关注的堆溢出。
自动开发生成:文献[20]提出了第一个基于补丁的自动利用软件漏洞。后来,通过整合预处理的符号执行和动态指令仪器,文献[1]实现了第一个用于全自动漏洞利用生成的端到端系统。实际上,程序源代码通常不可用。因此需要基于二进制代码的漏洞利用生成,文献[2]是一个实际对二进制程序自动生成利用的人。文献[21]进一步的目标是基于控制流劫持和重定向为给定的易受攻击的程序生成多个漏洞利用。文献[4]的目标是通过搜索加入程序数据流的方式自动生成面向数据的漏洞利用。
检测堆溢出:文献[22]建议在堆的头部或尾部附加额外的保护数据以检测缓冲区溢出。在缓冲区溢出期间,保护数据被破坏,然后就可以被检测到(类似security_cookie和cannary)。除了保护数据外,还可以分配不可访问的内存页来检测缓冲区溢出(文献[23]),low-fat指针[24]采用一种方法来检测运行时堆溢出,它对地址中的堆对象信息进行编码。传播信息,并检测缓冲区溢出。
与本文献最相关的工作是由文献[25]提出来的,这是基于二进制数据结构的逆转,该方法为不同的堆分配不同的颜色并监视每个堆访问。然而,这种方法严重依赖于二进制数据反转,这将导致不精确(即错误否定)。
参考文献链接:
1. t. avgerinos, s. k. cha, b. l. t. hao, d. brumley, "aeg: automatic exploit generation", proceedings of the 18th annual network and distributed system security symposium, 2011.
2. s. k. cha, t. avgerinos, a. rebert, d. brumley, "unleashing mayhem on binary code", proceedings of the 33rd ieee symposium on security and privacy, 2012.
3. s. k. huang, m. h. huang, p. y. huang, c. w. lai, "crax: software crash analysis for automatic exploit generation by modeling attacks as symbolic continuations", proceedings of the 6th international conference on software security and reliability, 2012.
4. h. hu, z. l. chua, s. adrian, p. saxena, z. liang, "automatic generation of data-oriented exploits", proceedings of the 24th usenix security symposium, 2015.
5. !exploitable crash analyzer, [online] available: http://msecdbg.codeplex.com/.
20. d. brumley, p. poosankam, d. song, j. zheng, "automatic patch-based exploit generation is possible: techniques and implications", proceedings of the 29st ieee symposium on security and privacy, 2008.
21. m. wang, p. su, q. li, l. ying, y. yang, d. feng, "automatic polymorphic exploit generation for software vulnerabilities", proceedings of the 9th international conference on security and privacy in communication networks, 2013.
22. w. robertson, c. kruegel, d. mutz, f. valeur, "run-time detection of heap-based overflows", proceedings of the 17th usenix conference on system administration, 2003.
23. s. sidiroglou, g. giovanidis, a. d. keromytis, "a dynamic mechanism for recovering from buffer overflow attacks", proceedings of the 8th international conference on information security, 2005.
24. g. j. duck, r. h. c. yap, "heap bounds protection with low fat pointers", proceedings of the 25th international conference on compiler construction, 2016.
25. a. slowinska, t. stancescu, h. bos, "body armor for binaries: preventing buffer overflows without recompilation", proceedings of the usenix technical conference, 2012.