随着互联网的普及,各类App如雨后春笋般产生。受限于代码质量,App中或多或少的会存在各类漏洞。据统计,CVE(http://cve.mitre.org/)及CNNVD(http://www.cnnvd.org.cn/)能够涵盖的漏洞多达100000个,严重威胁着网络及用户安全。当前,二进制漏洞挖掘主要依靠专业人员的人工审计,从而能够提供准确的漏洞点、漏洞利用及修补方案。
然而,人工审计与挖掘存在以下缺陷:
1. 开发团队往往缺少专业的安全人员,不能及时发现漏洞;
2. 面对数量庞大的漏洞,安全人员疲于应对。而自动化漏洞挖掘能够为人工审计提供良好的补充,也更为经济。
那么要构建这样一个自动化漏洞挖掘的系统需要哪些技术呢?下面,我们介绍一些具有代表性的相关技术。
当我们拿到一个App以后,首要的工作是找到该App中的漏洞点。从被检测程序是否被运行的角度可知,自动化漏洞挖掘技术可分为静态分析、动态分析及混合分析。
1. 静态分析
静态分析,指在不执行程序的条件下对程序进行分析。基于图建模的静态分析是指将程序属性建模为图形,如控制流图,数据流图和程序依赖图等。例如Vine,它是BitBlaze的静态分析组件,它提供了一组用于漏洞挖掘的核心实用程序,利用了控制流图,数据流图和最弱前置条件计算等。基于数据建模的静态分析可通过对内存值等数据进行建模,通过数据的流动、差异性等发现漏洞。例如,Josselin Feist等人提出了一个名为GUEB的静态工具,它使用价值集分析(VSA)来推断赋值中的每个变量,并基于抽象内存模型释放指令,以搜索二进制程序中的释放后使用类型的漏洞。图1所示为典型的静态分析工具IDA。
静态分析工具IDA
2. 动态分析
动态分析通过动态监测程序在给定环境中运行时的行为,可以准确地发现异常的发生,从而找出目标程序的漏洞。
模糊测试和动态污点分析是两种典型的动态分析技术。模糊测试是一种黑盒测试的自动化技术,它是向程序发送无效数据的过程,希望触发错误条件或故障以确定是否存在潜在的安全漏洞。模糊测试不需要任何程序分析,因此速度快,可以同时生成多个测试用例,但覆盖范围较小。其中,较为广泛及有代表性的方法包括SAGE、AFL等。
动态污点分析(DTA)于2005年由James Newsome和Dawn Song正式提出。DTA是指在执行时跟踪和分析通过程序的标记信息流。DTA利用TaintCheck验证了可靠性,并被证明可以检测到大多数类型的漏洞。为了提高DTA的适用性和可扩展性,Dytan和TEMU等通用框架被研究人员开发。然而,Schwartz等人指出在实现精准的分析结果上DTA仍面临着两个最基本的挑战,即欠污染和过度污染问题。图2为一种典型的动态分析工具OllyDbg。
静态分析工具OllyDbg
3. 混合分析
混合分析几乎被CGC比赛中所有参赛团队使用到,这表明混合分析是一种强有力的方式。DART,CUTE,EXE,KLEE和SAGE都是这个领域的典型代表,Concolic执行则是目前被普遍认为是最先进的技术。它从一些给定或随机输入开始执行一个程序,这些输入作用于条件语句以收集执行中的符号约束,然后使用约束求解器推断出输入的变体,以便将程序的下一次执行转向另一个执行路径,最终可以求解到程序的执行路径。下表对自动化漏洞挖掘技术进行了总结与对比。
在进行补丁部署过程中,由于经济原因,实际部署的补丁数量有限,选择要修复的漏洞成为一项重大挑战。因此,软件安全中最重要的问题是找到关键的安全性漏洞并尽快修复它们,现有的自动化利用方法可以粗略地分为三类:基于补丁、基于劫持控制流和基于数据的漏洞利用技术。
1. 基于补丁漏洞利用
基于补丁的漏洞利用技术假设程序员可能会重用大量的代码,从而可使用安全补丁探索未被修复的重用代码并利用。越早地访问补丁可能会给攻击者带来好处,其中典型的方法是APEG。APEG由David Brumley等人提出,并且成功地为5个真实世界的漏洞生成了漏洞利用程序。但是从实际的角度来看,APEG只会导致原始程序崩溃,无法直接劫持控制流。
2. 基于劫持控制流量
基于劫持控制流的技术首先被Heelan提出,其中最为经典的方法是由Thanassis提出的AEG。AEG的核心原则主要分为四个步骤:首先,找出漏洞的位置;其次,获取程序的运行时信息,例如堆栈布局信息;第三,基于以上信息生成漏洞利用;最后,验证漏洞。AEG是第一个面向控制流的真正自动化的漏洞利用解决方案。但AEG仍存在一些局限性,例如依赖源代码,漏洞利用样本受编译器以及动态操作环境限制等。
3. 基于数据漏洞利用
基于数据的漏洞利用技术改变了数据流的路径,而不是改变程序的基本控制流。到目前为止,面向数据的攻击鲜为人所知,并且几乎没有相应的防御解决方案。因此,面向数据的漏洞利用技术具有更好的适用性和灵活性。Liang团队提出了一种新技术——数据流拼接,并由FlowStitch工具实现。FlowStitch是第一个用于自动数据导向攻击生成的方案,并且经过验证是可行的。但是它有一些限制,例如必须以至少有一个已知的内存错误作为前提条件。下表对自动化漏洞利用技术进行了总结与对比。
早期的自动化补丁技术用于防范蠕虫传播。随着技术的发展,自动化补丁技术慢慢渗透到计算机软件安全的各个方面。
1. 基于运行时状态
基于运行时状态的自动化漏洞修复技术通过比较正常执行流程或采取一些操作在不中断程序的基础上绕过漏洞。例如ClearView是通过自动监测x86系统寄存器和内存的正常执行来修补二进制文件的错误。当出现错误时,ClearView将其与正常运行时的日志进行比较来更正错误。此外,ClearView可以解决内存写入出界的问题和控制流漏洞。
2. 基于检测补丁
基于检测的补丁技术可使用遗传算法来生成补丁修补程序并通过约束求解对漏洞进行修补。例如,GenProg在不需要软件规范、程序注释和其他特殊编码的情况下,利用遗传算法修补漏洞。为了用最小的更改实现对漏洞的修复,其使用结构差分算法和Delta调试技术进一步减小了修补后程序与原有程序的差异。SemFix结合了符号执行、约束求解和程序组合等方法,利用给定的测试用例将需要修补的程序约束成求解式,通过语义分析和动态符号执行来生成补丁。
自动化补丁技术在解决计算机安全问题上已取得很多研究成果,但仍然无法修复所有类型的漏洞,而且对于0day漏洞也没有突破性的进展。如何更好理解程序中的高级语义是自动化补丁技术中的一大难题。下表对自动化漏洞修复技术进行了总结与对比。
经过对自动化漏洞相关技术的介绍,相信大家已经对自动化漏洞挖掘、利用与修复的原理有了一些了解。之后,我们将对这些技术进行展开介绍,具体分析各类技术在自动化漏洞相关工作的运行机制,有兴趣的读者可提前熟悉一些汇编语言、Python相关的知识及IDA、OBJDUMP、GDB、pwntools等工具。