APP下载

自动化漏洞利用研究进展

2019-11-30靳宪龙黄雅娟

现代计算机 2019年31期
关键词:污点漏洞样本

靳宪龙,黄雅娟

(1.四川大学计算机学院,成都 610065;2.国防科技大学国际关系学院,南京 210012)

0 引言

近年来网络空间攻防对抗态势不断升级,网络空间安全的地位与作用进一步凸显。软件作为网络空间的基础之一,承载着网络空间中的各项服务,同时也充当着网络空间与现实世界之间的桥梁。在频发的各类安全事件中,无论是基于利益驱动的网络犯罪还是具有政治背景的APT行动,软件漏洞始终是对抗双方博弈的核心。

传统的漏洞挖掘与利用主要通过人工来进行,安全专家依靠完善的专业知识及丰富的安全经验,对软件中潜在的缺陷进行挖掘,判断其可利用性并制定修复方案。但随着各种半自动、自动化漏洞挖掘技术的提出,使得漏洞挖掘的效率大幅提升,仅谷歌的OSSFuzz框架每月平均挖掘200个漏洞。相较自动化漏洞挖掘的效率,以人工的方式对漏洞的可利用性进行判定已无法满足现实需求。

网络攻防也对漏洞利用的自动化提出了迫切需求。2013年美国国防部高级研究计划局(DARPA)发起了 CGC(Cyber Grand Challenge)项目[1],旨在建立高性能的具备自动化攻击与防御能力的网络推理系统。获得CGC冠军的网络推理系统Mayhem,在2016年的DEFCON CTF[2]中与人类战队进行攻防对抗,虽最终落败,但已体现出自动化漏洞利用在网络攻防中的广阔前景。

1 自动化漏洞利用概述

自动化漏洞利用是指,在无人工干预的基础上,自动化挖掘软件内部缺陷,并利用该缺陷使软件实现非预期功能的能力。依据自动化漏洞利用的完整程度,可分为完整模式与受限模式。

完整模式,在自动化挖掘软件漏洞并生成利用样本的基础上,使得样本具备绕过现有安全机制的能力;受限模式,实现自动挖掘软件漏洞并生成漏洞利用样本,但不考虑安全机制绕过。完整模式的自动化漏洞利用难度较大,目前的研究主要集中在受限模式。

自动化漏洞利用主要包含以下环节[3]:

(1)漏洞挖掘。通过对软件源码或二进制代码进行分析,采用模糊测试、补丁比对等技术,挖掘软件内部潜在缺陷。

(2)漏洞分析。基于软件缺陷,通过污点分析、符号执行等技术,定位漏洞点、判明漏洞类型、澄清漏洞成因等关键信息。

(3)漏洞利用。在判明漏洞机理的前提下,利用该缺陷,使软件实现非预期的功能,通过恶意利用对安全造成直接危害。

(4)安全机制绕过。结合代码复用、信息泄露、堆风水等攻击技术,实现对DEP、ASLR、CFI等安全机制的绕过。

2 自动化漏洞利用相关技术介绍

随着软件分析技术的发展,提出了模糊测试、符号执行、污点分析等技术,这些技术已在现实工作中发挥了重要作用。

2.1 模糊测试

模糊测试是指向待测程序提供大量特殊构造的或是随机的数据作为输入,监视程序运行过程中的异常并记录导致异常的输入数据,基于导致异常的输入数据进一步定位软件中漏洞位置[4]。

依据测试用例的生成方法,模糊测试可以分为基于变异的模糊测试与基于生成的模糊测试。基于变异的模糊测试,通过对现有数据进行变异以生成新的测试用例。基于生成的模式测试通过对程序进行建模,从而生成新的测试用例。模糊测试已在漏洞挖掘领域发挥重要作用,但依然存在测试盲目性大、测试效率低、代码覆盖率不高等问题。

目前主流的模糊测试工具有 Peach[5]、Sulley[6]、AFL[7]等。

2.2 符号执行

符号执行是指采用抽象符号代替程序变量,依据程序语义遍历整个执行空间,程序的输出被表示为输入符号值的函数[8]。

符号执行可分为静态符号执行、动态符号执行与选择性符号执行。静态符号执行并不真正的执行程序,而是通过符号值模拟程序执行;动态符号执行是对具体执行与静态符号执行的整合,兼具了两种方法的优点;选择性符号执行可以对关键部分进行符号执行,其余部分采用真实执行。虽然符号执行技术具有较高的代码覆盖率,但面临着程序状态空间爆炸、复杂约束无法求解、资源消耗过大等问题。

目前,主流的符号执行工具有基于源码的EXE[9]、KLEE[10]、DART[11]、CUTE[12],基于二进制的 angr[13]、SAGE[14]、Bitblaze[15]等。

2.3 污点分析

污点分析的核心思想是跟踪并分析污点数据在程序中的传播情况。污点分析可分为静态污点分析与动态污点分析。静态污点分析通过对源码或字节码中的语句进行分析,刻画语句或指令间的依赖关系并以此为依据,判断污点数据可能的全部传播路径。动态污点分析是在程序执行过程中,结合程序插桩跟踪污点数据的传播过程,相较于静态污点分析能够提供更精确的分析结果。虽然污点分析能够提供精确的分析结果,但其同样面临着隐式流问题、污点清除、性能开销过大等问题。

目前,主流的污点分析工具有TaintCheck[16]、Dytan[17]、libdft[18]等。

3 主流自动化漏洞利用系统

国内外研究团队已针对自动化漏洞利用技术做了大量工作[19],本节按时间顺序对十款主流自动化漏洞利用系统进行介绍。

3.1 APEG

2008年D.Brumley首次提出基于补丁比对的漏洞利用自动生成方法APEG[20]。该方法在实现过程中,首先通过补丁比对定位漏洞点;随后分析补丁代码,澄清漏洞机理并生成能够触发漏洞的异常输入;最后,结合污点分析技术生成漏洞利用样本。由于该方案可操作性强,因此得到了安全研究者的普遍认可。

APEG的不足主要体现在:首先,APEG同时需要原程序与补丁程序,该前提一定程度上限制了APEG的应用场景。其次,由于软件复杂度的提升,简单的指令比对已无法快速定位漏洞点,同时与漏洞无关的补丁也对澄清漏洞机理造成了干扰;再次,APEG所生成的漏洞利用样本以DoS为主,对漏洞的利用程度有限。

3.2 AXGEN

2009年Sean Heelan首次提出基于异常输入的自动化漏洞利用方案AXGEN[21]。该方法综合使用数据流分析、动态污点分析等技术,针对缓冲区溢出类漏洞,生成利用程序。

在实现过程中,AXGEN首先对系统调用、线程创建、信号量等关键点进行Hook;随后,采用污点分析对程序运行状态进行监控,分析指令寄存器EIP中污点数据情况,判断控制流是否被劫持;最后,生成约束条件,求解后得到漏洞利用样本。在测试过程中,AXGEN对多个存在漏洞的应用程序成功生成漏洞利用样本。

该方法的局限性主要表现在,首先,AXGEN不具备漏洞挖掘能力;其次,不适用于较为复杂的漏洞类型;最后,由于采用了污点分析技术,因此AXGEN存在污点分析所固有的不足。

3.3 AEG

2011年T.Avgerinos首次提出了基于源码的自动化漏洞利用方法AEG[22]。该方法针对栈溢出、格式化字符串漏洞自动生成漏洞利用样本,是首个完整实现从漏洞挖掘到漏洞利用样本生成全流程的自动化解决方案。在实现过程中,AEG首先对源码进行预处理,生成字节码与二进制程序;其次,通过前向符号执行挖掘程序中潜在的漏洞。根据挖掘到的漏洞信息构造路径约束并求解,生成能够触发漏洞的输入;再次,结合异常输入与动态分析,生成环境约束。最后,求解路径约束、环境约束,生成漏洞利用样本。在测试过程中,AEG针对14款应用成功生成16个漏洞利用样本,其中包含两个0 day。

该方法的局限性主要体现在:首先,依赖于程序源码,限制了AEG的应用场景;其次,所针对的漏洞限于简单的栈溢出与格式化字符串。

3.4 Mayhem

2012年S.K.Cha提出了基于二进制的自动化利用方案Mayhem[23],该方案可以看做AEG在二进制方向的拓展。在实现过程中,Mayhem运用在线符号执行、离线符号执行以及基于索引的内存建模技术,使用BAP[24]将汇编指令转换为中间语言并构造约束条件,通过对约束求解,最终生成漏洞利用样本。Mayhem在2016年举办的CGC决赛中取得冠军。

虽然在实际应用中Mayhem表现出色,但同样存在以下局限:首先,仅完成了针对部分系统调用及库函数的建模,因此无法处理复杂应用;其次,无法处理多线程应用;再次,由于使用了污点分析,因此具备污点分析所共有的不足。

3.5 CRAX

2012年Shih-Kun Huang等人提出了基于异常输入的自动化漏洞利用方法CRAX[25]。该方法采用回溯分析获取漏洞点的详细信息,在实现过程中,首先基于异常输入,在导致程序崩溃的路径上进行符号执行;同时监测指令寄存器EIP及内存中符号变量情况,并生成相应的约束条件;最后,求解约束条件并生成漏洞利用样本。在测试过程中,该方法针对16款小型应用、3款中型应用成功生成漏洞利用样本。

该方法的局限性主要体现在:首先,不具备漏洞挖掘能力,漏洞利用样本的生成依赖于异常输入的质量;其次,面临路径选择、符号求解等问题;最后,程序发生异常的位置往往滞后于真实错误的位置,虽然CRAX采用了回溯的方法,但部分信息的丢失将影响生成漏洞利用样本的成功率。

3.6 PolyAEG

2013年M.H.Wang等人提出了自动化漏洞利用方案PolyAEG[26],侧重于生成高质量、多样性的漏洞利用样本。在实现过程中,PolyAEG首先动态监控程序执行状态,提取相关信息构建污点传播流图iTPG及全局污点状态记录GTSR;其次,分析潜在的控制流劫持点、可利用的指令、污点内存等,结合跳转指令链与污点内存构建不同的约束条件;最后,对约束求解,生成漏洞利用样本。测试过程中,该方案针对每个存在漏洞的应用程序均生成大量多样性漏洞利用样本,最高可达4724个。

该方法的局限性主要体现在污点分析所存在的误报、漏报及性能开销较大。

3.7 FlowStitch

2015年H.Hu首次提出了面向数据流的自动化漏洞利用方案FlowStitch[27]。该方案在不影响程序控制流的前提下,通过已知内存错误构造输入数据,完成对原有数据流中关键变量的篡改,实现权限提升、信息泄露等功能。在测试过程中,针对8个存在漏洞的应用,自动生成19个漏洞利用样本。所生成的漏洞利用样本均能绕过DEP、CFI,其中10个漏洞利用样本能够对抗ASLR。

该方案主要局限于FlowStitch需要程序中存在已知的内存错误,该前提限制了FlowStitch的应用场景。

3.8 Mechanical Phish

2016年来自加州大学圣芭芭拉分校的安全团队Shellphish提出自动化漏洞利用方案Mechanical Phish[28]。该系统在实现过程中,首先由基于AFL与动态符号执行的漏洞挖掘引擎Driller[29]进行自动化漏洞挖掘;其次,由基于angr的漏洞利用生成引擎Rex自动化生成漏洞利用样本;最后,由补丁生成引擎Patcherex生成补丁程序。该方案在DARPA举办的CGC决赛中,取得了第三名。

该方案的局限性主要体现在:首先,方案的设计以CGC为背景,所使用的操作系统DECREE、针对的漏洞类型均与真实环境差距较大,因此该方案在现实环境中的表现有待完善;其次,Mechanical Phish使用angr作为符号执行引擎,因此无法处理大部分真实应用。

3.9 FUZE

2018年Wei Wu首次提出了基于内核UAF漏洞的自动化方案FUZE[30]。该方案综合运用模糊测试、符号执行、动态追踪等技术,针对内核UAF漏洞自动生成漏洞利用样本。在实现过程中,首先结合KASAN[31]与动态追踪技术,获取生成利用程序所必须的信息,如释放对象的基址、大小等;其次,通过内核Fuzzing识别引用悬垂指针(dangling pointer)的系统调用;再次,结合符号执行对可利用性进行判断,并计算堆喷数据;最后,生成完整的漏洞利用程序。通过对15个内核UAF漏洞进行测试,FUZE成功生成漏洞利用并一定程度上绕过保护机制。

该方案的局限性主要体现在:首先,未考虑开启KASLR的情况;其次,在使用符号执行时,对前置约束条件的设置使得FUZE存在漏报的可能性。

3.10 Revery

2018年Yan Wang提出了针对堆漏洞的解决方案Revery[32]。该方案在实现过程中,首先分析漏洞位置和相关内存布局,建立异常对象内存布局图、内存布局贡献者图;其次,以异常对象的内存布局为导向,采用定向Fuzzing探索替代路径,并结合污点分析技术,在替代路径中探索可利用状态;最后,确定拼接点、拼接路径,组合生成漏洞利用路径。求解路径约束、漏洞利用数据约束等约束条件,生成漏洞利用。在测试过程中,Revery以CTF赛题为样本,成功生成多个针对堆漏洞的漏洞利用样本。

该方案的局限性主要体现在:首先,Revery基于angr开发,因此无法处理大部分真实应用;其次,无法自动进行堆的原子化操作,不能自动化构造内存布局。

4 结语

自2008年首次提出APEG后,自动化漏洞利用历经了十年的发展。所挖掘的软件形式从源码、字节码扩展至二进制代码,能够处理的漏洞类型也逐渐复杂。虽然相关研究取得了明显进展,但依然存在一些关键问题需要解决。如符号执行所面临的瓶颈问题,使得自动化漏洞利用仅适用于小型软件或代码片段;其次,无法处理基于堆的复杂漏洞、逻辑漏洞、结合多个漏洞的漏洞链等;再次,目前的研究主要集中于受限模式,所生成的漏洞利用样本无法绕过已有的安全机制。

从上述分析来看,自动化漏洞利用距离实用还存在一定距离,但现实中的迫切需求,已指明了今后的发展方向,并将进一步推动自动化漏洞利用的发展与完善。

猜你喜欢

污点漏洞样本
漏洞
莫让“污点”变“终点”
黑蚂蚁
污点
规划·样本
侦探推理游戏(二)
人大专题询问之“方城样本”
随机微分方程的样本Lyapunov二次型估计
漏洞在哪儿
“官员写作”的四个样本