冶金自动化

漏洞自动化利用(AEG)研究进展

 

前言

自从DARPA在2016搞了一个CGC比赛之后,关于漏洞自动利用工作的研究也在随后几年多了起来。国内近几年也有类似的RHG比赛出现。此外,随着软件趋于复杂,模糊测试技术的成熟,漏洞数量也越来越多。要修补所有的漏洞不太现实,而人工去判断漏洞的危害性也是耗时耗力的过程。因此,这也就带动了漏洞自动利用生成(Automatic Exploit Generation)的发展。本文将基于近几年安全顶会上的研究,首先介绍漏洞自动化利用的研究进展,并给出一个漏洞自动利用的基本框架,最后讨论漏洞自动利用的未来研究方向。

1. 背景

近几年来,漏洞的CVE数量越来越多。一方面是因为模糊测试在漏洞挖掘领域取得了比较好的效果,另一方面是软件的越来越复杂,不可避免导致了很多安全漏洞。面对如此多数量的漏洞,对于一个安全团队是很难能够及时修复的。相关研究表明,漏洞修复的周期长达几周或几个月。因此,需要对漏洞修复的优先级进行排序。常用的策略是基于漏洞的可利用性来确定漏洞的优先级。然而,手工确定漏洞的可利用性也是耗时耗力的事情。这也就是漏洞自动化利用工具的意义所在,自动化地评估漏洞的可利用性,进而确定漏洞修复的优先级。

除了确定漏洞修复优先级以外,漏洞自动化利用也能对现有的防御机制进行评估,产生新的防御思路。此外,这类工具也能对CTF比赛或者渗透测试过程提供很大帮助。企业也能使用这类工具来对其系统安全风险预警。

总的来说,研究意义主要分为以下三点。

a. 确定漏洞可利用性

b. 自动化地去评估防御机制,促进防御的研究发展。

c. 辅助渗透测试,比如CTF等等。

2. 研究时间线

最早关于漏洞利用自动生成的研究是2008年的APEG[1]。这篇工作是基于一个打过补丁的程序,来自动生成没打过补丁的程序漏洞利用。应用到实际会有很多受限之处,但是开创了漏洞利用自动生成这个领域。随后,2009年,Heelan[2]的硕士论文是第一个提出给定一个程序的崩溃输入,然后自动生成这个漏洞的利用。后续的工作基本上也是按这个套路不断延申开来。2011年后,先前研究APEG的David团队先后发表了AEG[3],Mayhem[4]等工作。早期的漏洞自动化利用工作基本都是由这个团队做的。到2016年,DARPA开了一个CGC的比赛(自动攻防),Mayhem取得了第一名。之后几年内,相关工作如春笋一般涌出。2016年算是个奇妙的时间点,2016之前的工作大都是围绕栈溢出,格式化字符串漏洞来做。2016年之后大多工作都开始尝试去实现堆漏洞(堆溢出、UAF)的自动化利用。

总结一下,漏洞自动化利用的发展的研究趋势,目前应该还有一些重要的工作需要去做。近几年的工作大都是将符号执行和模糊测试相结合来实现的,仿佛成为了一种范式。自然辩证法里有提到过科学是在范式下解难题。现在看来确实蛮符合科学发展的规律。

3. 基本方法

这里简单介绍几篇论文里是如何实现AEG。并且大家可能会发现,思路都差不多,但研究的侧重点都不尽相同。

3.1 针对栈溢出的AEG

早期的工作主要是针对栈溢出漏洞进行自动化利用,这些研究有Heelan的硕士论文[2], AEG[3],Mayhem[4],CRAX[5]等等

Heelan的工作需要给定一个已知漏洞的崩溃输入和跳转的寄存器,基于动态符号执行来自动化地劫持程序控制流。

具体来说,他使用二进制插桩来做污点传播并收集运行时信息,并通过检查EIP寄存器是否被污点影响来生成exp,同时也考虑了间接影响EIP寄存器的指针损坏的情况。

AEG这篇论文写得很清晰。文章的总体框架如下图所示。首先用gcc和llvm对源码进行预处理,生成能用GCC运行的二进制Bgcc和LLVM分析的字节码Bllvm。基于字节码,AEG用条件符号执行去找漏洞函数,被溢出覆盖的对象,触发bug的路径。同时用动态二进制分析去Bgcc里提取运行时信息,最后生成payload。生成payload后再进行验证,最后输出exploit。(下图来自于论文。)

mayhem这篇文章就是上面AEG在二进制上的逻辑扩展。核心技术是混合符号执行和基于索引的内存模型。用混合符号执行主要是在运行速度和内存要求之间找平衡点。mayhem引入了具体执行来缓解符号执行带来的路径爆炸问题。具体来说,具体执行插桩,做动态污点分析,然后把污点指令流传给SES。SES编译这些指令为中间语言,并且符号化地去执行。简单来说就是具体执行缩小了符号执行需要执行的范围。而基于索引的内存模型主要是去解决产生exploit由于具体的约束条件而不可行,因此引入整个模型来避免索引的约束。(下图来自于论文。)