黄冬秋, 韩 毅, 杨佳庚, 田志宏
(1. 广州大学 网络空间先进技术研究院, 广东 广州 510006; 2. 鹏城实验室 网络空间安全研究中心, 广东 深圳 518055)
随着互联网技术的迅速发展,计算机信息技术已经渗透到人们生活的方方面面,计算机信息技术在带给人们便捷的同时,也带来了众多的安全隐患.例如,2019年2月,遗留19年之久的WinRAR高危代码执行漏洞,使5亿以上的用户陷入压缩危机;5月,堪比“永恒之蓝”的微软蠕虫级漏洞“BlueKeep”导致近100万台设备置于高危漏洞之下;7月,iOS系统的6个“无交互”安全漏洞,等等.据统计,2019年国家信息安全漏洞库(CNNVD)公布漏洞数量17 316个,美国国家漏洞库(NVD)公布漏洞数量17 314个,公共漏洞披露平台(CVE)公布漏洞数量16 778个.倘若这些漏洞被一些国家级黑客组织利用,无疑将会成为国与国博弈的重要“军火武器”.
计算机软件中的安全漏洞已成为信息系统安全的主要威胁,随着程序变得越来越复杂、庞大和难以处理,软件安全漏洞发掘分析技术成为安全界的研究热点.根据研究对象不同,软件安全漏洞挖掘技术可以划分为基于源码的漏洞挖掘和基于二进制文件的漏洞挖掘两大类.基于源码的漏洞挖掘首要条件是获取软件的源代码,安全人员可以通过分析开源项目的源代码发现项目中存在的安全漏洞.静态分析技术是基于源代码的漏洞挖掘的典型技术,通过词法分析、语法分析、语义分析等技术检测程序中潜在的安全问题.然而,并不是所有软件都是开放源代码,大多数商用软件的源代码很难获得,因此,安全人员引入基于目标代码的漏洞挖掘技术.基于二进制文件的漏洞挖掘技术首先将二进制文件进行反汇编,获取到二进制文件的汇编代码;然后对汇编代码进行切片[1];最后通过跟踪分析反汇编出来的代码,来判断是否存在漏洞.动态污点分析(DTA)技术作为有效而实用的信息流分析技术,被广泛应用于漏洞挖掘、未知漏洞检测、恶意软件检测和分析、漏洞利用等方面.
动态污点分析技术是将不受信任的来源的输入数据视为污染数据,然后监视程序的执行情况以跟踪污染数据传播(例如数据被污染操作),并检查污染数据何时被使用[2].例如,缓冲区溢出和格式化字符串之类的漏洞将受污染的数据用作跳转地址或格式化字符串.
动态污点分析技术主要包含三个阶段(图1):①污点标记,即将来自不受信任来源的数据标记为污点数据,并设置污点标签,污点标记存储在污点标记图中,亦称为影子内存;②污点传播,即在程序执行过程中,提取程序语义信息,识别程序操作,根据污点传播规则判别每条指令对应的目标操作数是否被污染,寄存器和内存内容是否被非法改动;③污点检测,是在程序运行过程中,检测某一寄存器或内存位置中的数据是否被污染,以及对应的污染数据.
图1 动态污点分析三个阶段(以一个污点字节为例)Fig.1 Three stages of dynamic taint analysis (Take a tainted byte as an example)
由于动态污点分析技术在网络空间安全中发挥着重要作用,越来越多的研究者开始关注动态污点分析技术,对动态污点分析技术进行研究、分析、改进和扩展,并制定符合目标需要的动态污点分析框架.本文从构建一个可用、可靠、高效的动态污点分析系统的角度出发,重点关注动态污点分析技术的研究现状、应用领域、存在的问题与挑战和未来发展方向等.
二进制程序漏洞挖掘是一个多种技术相互结合、共同使用和优势互补的过程,目前较为常见的二进制程序漏洞挖掘分析技术主要有手工测试技术、补丁比对技术、静态分析技术、动态分析技术、模糊测试技术和动态污点分析技术等.
手工测试技术[3]是测试工程师将手动准备好的包含有效输入和无效输入的测试用例,发送给客户端或服务器目标服务程序,根据目标程序的状态和对不同输入的反应,识别程序问题的漏洞检测技术.它是软件测试中最严格和最古老的方法.这种漏洞检测技术可由测试者独立完成,不需要额外的辅助工具,但是高度依赖测试者,需要测试人员对测试程序比较了解.手工测试是一项繁重的工作,需要测试人员具有一定的耐心、观察力、投机性、创新性和开放性等技巧.在大型软件应用程序或数据集覆盖率非常大的应用程序上,很难进行重复的手动测试[4].
二进制补丁比对技术[5]主要用于对“已知”漏洞的挖掘,即通过对同一程序两个连续或接近版本进行比较,识别新版本中修补的内容.由于程序安全补丁会携带有关脆弱点信息,因此,通过程序分析技术提取补丁中的关键漏洞信息,推断程序漏洞利用的攻击代码是黑客进行漏洞利用的常用手段.经验丰富的安全专家或黑客甚至能在很短的时间完成漏洞挖掘和利用的过程,但这种方法不适合文件修改较多的情况.
静态分析技术[6]是在没有数据输入且没有运行代码的情况下检查程序的源代码或者反汇编代码(这里指反汇编代码),通过词法分析、语法分析和语义分析等检测程序中潜在的安全问题.从汇编层面查找系统漏洞的方法是通用的,但这种方法却费时费力.另外,这种方法对分析人员技术水平要求较高,该方法的不足之处是无法检测到程序动态运行过程中产生的安全问题.
动态分析技术是在调试器中对无源码的二进制程序执行运行时的分析,通过对正在运行的程序进行属性(运行状态、内存使用状况、寄存器的值等)分析,进而发现程序潜在的漏洞.尽管动态分析不能证明程序满足特定的属性,但是它可以检测到违反属性的行为,并且可以向程序员提供有关程序行为的有用信息.尽管动态分析技术可以满足某些安全检测的需要,但是这种技术效率低,对分析人员的技术水平要求较高.另外,在大型软件应用程序或数据集覆盖率非常大的应用程序上,动态分析技术具有很大的限制.
模糊测试技术通过向待测试的闭源软件输入一组随机数据,监视程序运行、记录程序运行中的异常行为,最后通过记录的异常行为,输入定位软件的错误位置.模糊测试技术的显著优点是与被测试程序的关联性较小,且操作简单.但模糊测试技术本身也有不少局限性,因此,研究者们经常通过引入一些新技术来提升模糊测试的代码覆盖率、测试用例的有效性和模型的智能性.例如,机器学习、符号执行和动态污点分析等技术经常被引入模糊测试模型中.
动态污点分析技术能够从攻击者进行漏洞利用的本质出发,分析污点数据在程序运行过程中的流动路径和影响范围.从宏观层面分析,动态污点分析技术是基于动态二进制插桩技术,在不破坏程序原有逻辑的基础上插入一些信息收集代码,进而获得二进制程序运行过程中的相关信息;接着,增加一个污点标记来标识不安全数据或者被不安全数据污染的数据,污点信息存储在影子内存模块;根据程序的不同指令类型和指令操作数,设计相应的污点传播规则,传播程序执行过程中污点标记对寄存器和内存产生的影响;最后,通过分析程序的数据流特征,检测程序中潜藏的漏洞.
动态污点分析技术于2005年由Newsome等[2]在模型TaintCheck[2]中正式提出,动态污点分析中污点(Taint)的概念首先由脚本语言Perl引入.动态污点分析的提出主要基于以下现象:由于攻击者通常利用输入去替换程序执行过程中的某一受信任来源的值,进而非法更改程序的执行.例如,攻击者可能试图通过自己的数据去覆盖跳转地址或格式化字符串指向的值,达到成功利用的效果.
动态污点分析能够实现在程序执行时跟踪和分析程序标记的数据流,主要包含污点标记、污点传播及污点检测等三个阶段.当内存字节被标记为污点源时,污点字节的污点信息会相应地存储在影子内存中.例如污染字节与未污染的字节进行add运算时,被污染运算结果的污染信息也会相应地存储在影子内存中,安全人员可以访问影子内存信息,查询对应字节的污染状态.
动态污点分析将来自不受信任来源的数据标记为污点数据,并设置污点标签,污点标记存储在污点标记图中,亦称为影子内存.根据libdft[7]模型中的污点标记模型,可以得到如图2所示的污染标记图,示例中以一个bit位标识一个字节的污染状态,使用setb(addr)存储一个字节的污染状态,setw(addr)存储两个字节的污染状态.
图2 污染标记图Fig.2 Taint bitmap
污点标记方式很大程度影响着污点传播处理和污点信息存储的效率.污点标记粒度可以标记到内存块、单个字节、单个位等数据单元.污点标记粒度越小,所执行的动态污点分析会越细致,但需要更多的存储空间来存储标签.污点标签越大则通用性越强,需要更大的存储空间.
动态污点分析的目的是跟踪污点源和污点槽之间的信息流动.污点传播主要用于确定程序执行时污点如何精确流动[8].例如,当指令的源操作数被污染时,指令的目的操作数也会变成污点数据.
动态污点传播在程序执行过程中,提取程序语义信息,识别程序操作,根据污点传播规则判别每条指令对应的目标操作数是否被污染、寄存器和内存内容是否被非法改动.给定一个污点的传播规则,就可以通过动态污点分析语义定义的语义跟踪污点的传播.污点传播规则受污点标记粒度、指令类别等因素的影响.
二进制代码级的污点传播分析有两种粒度:一种是直接分析X86等指令集,另一种是分析二进制代码翻译后的中间语言(IR)[9].例如,Pin框架直接基于X86指令集分析,DECAF++基于QEMU模拟器将二进制代码翻译成中间语言级别.QEMU使用Tiny Code Generator(TCG)将目标代码翻译成主机代码.
由于二进制级别指令集较为复杂,并不是所有的指令都是污点信息传播指令,因此,在编写污点传播规则时要有选择地编写指令的传播规则.污染传播指令可划分为五类:数据移动指令(LOAD、STORE、MOVE、PUSH和POP等[10])、算数运算指令(ADD、SUB和XOR等)、条件跳转指令(JZ)、函数级间接污染指令(strncpy函数对应的call指令)和函数级敏感函数指令(scanf、sprintf和strcpy等对应的call指令).污点传播过程中,不恰当的污点传播规则经常会引起“过污染”和“欠污染”问题.如图3所示,若寄存器eax被污染而寄存器ebx没有被污染,则寄存器eax的污染将保持不变,但是当寄存器ebx的值为0且ebx未受污染,污染规则未清除寄存器eax的污染,则这条规则是不合理的,将会导致过污染.过污染和欠污染问题是污点分析引擎面临的主要技术挑战.
图3 过污染示意图Fig.3 Over-tainting example
污点检测是在程序运行过程中,检测某一寄存器或内存位置中的数据是否被污染,以及对应的污染数据有哪些.污点数据越权使用是污点检测过程的重点,合理制定检测规则对污点检测结果的正确性至关重要,常见的检测规则有:将污点数据作为跳转地址、将污点数据作为执行的代码和污点数据受控写入等.例如,基于动态污点分析的漏洞类型检测系统在污点检测模块,会基于一定的安全规则检测出程序的潜在漏洞类型,如缓冲区溢出、格式化字符串和堆溢出等;基于动态污点分析的恶意代码通信协议逆向分析系统,会基于污点检测模块将网络数据流作为分析对象,依据协议字段的取值变化频率和特征推断得到协议格式.
本节将梳理进程级动态污点分析和全系统级动态污点分析中涉及到的相关理论背景,包括进程级动态二进制插桩(动态二进制插桩)、虚拟化和虚拟机自省等技术的基本原理、相关定义和面临的问题与存在的挑战.
插桩技术是一种用于在应用程序中插入额外代码以观察其行为的技术[10].根据插桩的不同阶段和不同代码级别,通常划分为:基于源代码的插桩和基于中间代码的插桩、基于静态二进制的插桩和基于动态二进制的插桩.一般地,源代码插桩技术需要对源码进行修改和编译;基于中间代码的插桩需要有针对性地进行修改,实现难度较大,但通用性更强;静态二进制插桩技术在程序执行前插入额外的代码和数据并重组二进制程序;动态二进制插桩在程序运行时实时地插入额外代码和数据,进而观察程序的运行行为.
动态二进制插桩分析关注的是程序运行时的真实行为,直接在程序执行过程中监视进程并插入指令流,探测程序运行的重要数据信息,通过对重要数据信息分析,进行程序分析、漏洞检测等.例如,利用一个动态二进制插桩工具实现简单的基本块的统计功能,为了实现这一点,需要基于DBI引擎的API来检测每个基本块的最后一条指令,并回调一个递增计数器的函数[10].目前应用比较广泛的动态二进制插桩框架主要有Dyninst[11]、DynamoRIO[12]、Pin[13]、Valgrind[14]、Triton[15]和Frida[16]等.以PIN平台为例,动态二进制插桩框架如图4所示.
图4 PIN平台动态二进制插桩框架Fig.4 Dynamic binary instrumentation framework based on PIN
动态二进制插桩技术正在被广泛应用于软件工程、程序分析和计算机安全等问题.例如,软件工程师希望通过动态二进制插桩系统了解自己所开发软件或系统的性能和运行行为,硬件工程师使用动态二进制插桩系统测试不受当前硬件支持的新指令,软件测试工程师使用动态二进制插桩系统对特定程序或系统通过插桩测试进行缺陷检测等.
由于这种进程级别的二进制插桩框架分析程序和原始程序共享相同的地址空间,均可在CPU ring3应用程序层或者ring0操作系统内核层执行,分析代码具有与被检测进程相同的特权[17],这种插桩技术用于分析恶意软件时,分析程序可能被篡改.因此,以Pin为代表的进程级动态污点分析框架无法检测操作系统内核漏洞.在分析恶意软件时,一旦分析程序被恶意篡改,将会直接导致分析结果出错.
一般地,全系统污点分析工具的实现基于虚拟化技术,分析进程与被检测进程执行完全隔离,被检测进程在来宾虚拟机内部执行,分析进程在来宾虚拟机外部执行,具有更好的透明性和抗篡改性.
虚拟化是通过应用一种或多种概念或技术(例如硬件和软件分区、分时,部分或完整的机器仿真、模拟和服务质量等),将计算机资源划分为多个执行环境的框架或方法[18].虚拟化的起源可以追溯到六十年代和七十年代的大型机,虚拟化最初被认为是一种逻辑上划分大型机以允许多个应用程序同时运行的方法[19].维基百科对虚拟化这样定义:在计算中,虚拟化是指创建某物虚拟(而非实际)版本的行为,包括虚拟计算机硬件平台、存储设备和计算机网络资源等[20].现代计算机足够强大,可以使用虚拟化来呈现许多较小的虚拟机(VM)的错觉,每个虚拟机运行一个单独的操作系统实例[21].虚拟化的本质是给用户提供端到端的资源虚拟化服务,提高用户对资源的使用效率和管理能力.根据虚拟化的运行模式可划分为容器虚拟化、模拟器虚拟化和库虚拟化.
例如模拟器QEMU就属于模拟器虚拟化,它通过模拟器模拟出所有的硬件.QEMU是纯软件实现的虚拟化模拟器,可以在虚拟机中运行未修改的目标操作系统(例如Windows或Linux)及其所有应用程序,非常灵活、可移植.我们最熟悉的就是QEMU可以模拟出一台能够独立运行操作系统的虚拟机.QEMU基于Hypervisor(虚拟机监视器)创建、运行和管理各个虚拟机,它的具体工作原理如下:虚拟机监视器Hypervisor从磁盘映像加载二进制机器代码,使用TCG(微代码生成器)将其转换为本机机器代码,连接到虚拟或实际设备,并启动软件MMU(软件内存管理单元),然后开始在磁盘映像中模拟操作系统.
就当前来看,模拟器虚拟化持续扩张遇到的障碍主要集中在虚拟化的性能上.研究者们相继推出各种方法,进行提升模拟器虚拟化的性能.例如,开启KVM的QEMU[22]可以通过KVM模块提供的系统调用接口进行内核设置,为QEMU虚拟机提供一定的硬件虚拟化加速,从而提高虚拟机的性能.KVM是通过调用Linux本身内核功能,实现对CPU的底层虚拟化和内存虚拟化.
随着虚拟化技术在X86平台上突飞猛进的发展,虚拟化技术重新引起了虚拟化市场的广泛关注,导致了监控虚拟机行为的虚拟机自省技术及工作的迅速发展.虚拟机自省技术[23]由Garfinkel等在2003年提出.虚拟机自省技术根据从虚拟机外部检查和分析来宾虚拟机操作系统的内部状态信息,解决了“越来越多先进技术成功实现攻击或逃避入侵检测系统,进而防止入侵检测系统检测或报告出恶意活动”的问题,并在很大程度上增强了逃避和攻击的抵抗力.并避免了对抗对入侵检测系统攻击和躲避技术产生的两个相互矛盾的要求,即受监视系统状态的可见性和检测系统与攻击者之间的隔离度.
虚拟机自省技术面临的主要挑战就是语义鸿沟[24]问题.通常,在进行虚拟机自省时,获取到的来宾虚拟机操作系统的管理程序视图只有硬件寄存器和原始二进制数据,没有高层语义信息,这种差异被称为语义鸿沟.为了弥合语义鸿沟,提高虚拟机自省的准确性和高效性,研究者们分别从虚拟化原理、操作系统原理等不同角度进行探讨.例如Garfinkel等[23]在提出虚拟机自省概念时,给出的采用结合操作系统接口库和Linux内核崩溃转储分析工具检查内存和寄存器等设备信息的方式弥合语义鸿沟;VMwatcher[25]通过解析内核数据结构(如文件、目录和进程)进行重构语义视图,获得虚拟机寄存器、内存和磁盘等状态的全部信息;VIX[26]参照虚拟机内部文件信息将读取到的字节信息还原成高级语义信息,另外,VIX提供了监控来宾虚拟机内部进程、网络端口等的命令和接口.常见的虚拟机自省工具有VMwatcher[25]、VIX[26]、Virtuoso[27]和VMST[28]等.
动态污点分析在许多研究问题中具有举足轻重的作用,例如漏洞类型检测、恶意软件分析和协议逆向工程等.自2005年卡内基梅隆大学的Newsome等[2]基于开源模拟器Valgrind研发出的动态污点分析系统TaintCheck后,学术界相继推出多个动态污点分析模型.
动态污点分析技术的发展主要分为两个阶段:2005-2008年主要集中在动态污点分析技术本身的研究,这一时期出现了完善动态污点分析理论的TaintCheck[2]、LIFT[29]和Dytan[30]等工具;2008年后关注点集中在污点分析方法和其他技术的融合,并出现了基于QEMU模拟器的全系统级动态污点分析系统.下面从进程级动态污点分析和全系统级动态污点分析两个方面,对不同时期的动态污点分析技术进行比较分析.
进程级动态污点分析系统以动态二进制插桩平台为支撑,跟踪记录程序指令的执行.笔者在第3部分已对动态二进制插桩平台进行了详细介绍,这里不再重复解释.下面从发行时间、插桩平台、主要技术点、是否开源等方面对上述提到的几种常见进程级动态污点分析平台进行综合比较分析,见表1.
表1 常见进程级动态污点分析框架比较Table 1 Comparation of common process-level dynamic taint analysis frameworks
TaintCheck、LIFT和Dytan框架主要集中在动态污点分析技术本身的研究.TaintCheck利用插桩对商业软件漏洞进行自动检测、分析和漏洞特征生成,能够捕获到程序中覆盖返回地址、覆盖函数指针和格式化字符串漏洞等异常,但消耗的空间和时间代价较大.LIFT利用插桩检测破坏数据(返回地址、函数指针等)的各种类型安全攻击.Dytan基于插桩技术执行基于数据流和控制流的多污点标记和传播,对X86二进制程序进行污点分析.
Minemu[31]、DTAM[32]、FlowWalker[33]和StraightTaint[34]框架分别采用消除多余污点传播或离线的方式,降低系统的时间开销或内存开销.Minemu通过消除多余的指令来传播污点,在一定程度上提升了动态污点分析的性能.DTAM并行地为每个线程进行线程单元的污点分析,最后再离线聚合线程单元的结果,在一定程度上提高了并行多线程程序的分析效率.FlowWalker和StraightTaint通过离线的方法解决动态污点分析工具在性能上的瓶颈问题.
Libdft[7]平台引入了一个64位影子存储器,可以在未修改的二进制文件、常见操作系统和硬件上运行,并提供了可扩展的API接口.动态二进制分析框架Triton[15]以符号执行引擎而闻名,同时能够很好地支持轻量级动态污点分析.
全系统动态污点分析平台一般是基于模拟器实现,分析进程与被检测进程执行的完全隔离.系统的被检测进程在来宾虚拟机的内部执行,分析进程在来宾虚拟机的外部执行,具有更好的透明性和抗篡改性.全系统动态污点分析技术的实现依赖于虚拟监控器,虚拟机自省中面临的语义鸿沟问题是全系统动态污点分析平台面临的首要挑战,在第二部分的预备知识部分已经详细介绍,这里不再重复解释.
图5所展示的是基于模拟器QEMU的全系统动态污点分析实现.其中,虚拟机自省组件用于解决虚拟机监控器与上层操作系统之间存在的语义鸿沟问题.全系统动态污点分析技术会带来很大的性能开销,这是因为模拟器本身的运行会带来相当大的性能损失,而动态污点分析在污点传播阶段又会带来很大的时间和内存开销.因此,多数开发者们都会采取一定的改进措施,尽可能缩小系统或模拟器的性能开销.下面对上述提到的全系统动态污点分析框架进行简单介绍和分析,并从发行时间、插桩平台、主要技术点和是否开源等方面进行综合比较,见表2.
图5 基于QEMU的全系统动态污点分析框架Fig.5 Dynamic binary instrumentation framework based on QEMU
表2 常见全系统级动态污点分析框架比较Table 2 Comparation of common system-level dynamic taint analysis frameworks
BitBlaze[35]和DTA++[36]是主要集中在动态污点分析技术本身的研究.其中,BitBlaze框架中的TEMU组件能够基于模拟器QEMU提供整个系统视图,从系统的外部进行细粒度的二进制插桩,为全系统动态二进制插桩平台的提出提供宝贵经验.DTA++有效地解决了一些可能导致污染不足的隐式流问题.
DECAF[37]使用TCG指令级污点传播,面向于编写跨平台和系统广泛的分析工具.PANDA[38]增加了记录和重放执行的功能,深入分析整个系统,研究面向系统逆向工程.TAINTINDUCE[39]的研究面向污点传播规则的生成.该系统通过观察程序指令的寄存器状态和内存访问状态来学习污点规则,进而自动化地生成污点传播规则.成功地解决了使用演绎方法分析指令语义,手动总结规则来指定污点规则存在的污点传播规则不准确的问题.
DECAF++[9]从动态污点分析算法设计上尽可能少地执行污点分析,实现弹性全系统污点分析,进一步提高了动态污点分析系统的性能.OFFDTAN[40]采用离线动态污点分析二进制程序的方法,降低程序运行时的开销.
动态污点分析技术虽然刚刚被提出来十几年,但已经取得了丰硕的成果,特别是最近几年推出的相对成熟的动态污点分析框架.通过对谷歌学术2009-2020年近十年动态污点分析应用相关的前150篇论文进行统计分析,发现动态污点分析技术主要应用于程序分析、模糊测试、漏洞检测、信息泄露检测、逆向工程和恶意软件分析等领域,另外,动态污点分析技术还应用于程序取证、漏洞分析、漏洞利用、漏洞签名生成等方面.
进程级别的动态污点分析系统一般是针对单个用户模式的进程运行状态进行污点分析,分析程序与原始代码转换在相同的代码缓存中,一旦分析程序被恶意篡改,将会直接导致分析结果出错.因此,进程级动态污点分析未来研究的出发点就是在提高污点分析技术性能的基础上,主要将动态污点分析技术应用于程序分析[41-42]、模糊测试[43-45]、漏洞检测[46-49]、信息泄露检测[50-51]、逆向工程[52]、安卓恶意软件分析[53]和漏洞签名生成[54]等安全问题上.
例如,异常分析框架ExpTracer[41]对程序入口点到异常点之间的轨迹进行污点分析,并记录内存集和寄存器的污点信息,通过整合记录和后续指令分析,进行异常评估.TaintScope[43]基于细粒度的动态污点跟踪,识别输入中的哪些字节用于安全敏感的操作.这是第一个支持校验和的模糊测试工具,可以识别输入实例中的校验和字段,并进行准确定位.Patch-Gen[46]使用一种基于属性的污点分析方法(ATAM)找到攻击点和溢出点,为Windows X86二进制文件自动生成补丁.TaintEraser[50]使用语义感知的指令级污点,跟踪敏感用户数据在现成应用程序中的流动情况,防止不必要的信息泄露.AndroTaint[52]基于动态污点分析,通过模式匹配的方法进行Android恶意软件检测.文献[54]使用控制流依赖的动态污点分析方法,跟踪程序运行过程中的敏感信息,以支持漏洞分析.TASEVS[53]基于二进制插桩工具Pin和约束求解工具Z3实现漏洞签名生成,并对漏洞程序进行验证.
全系统动态污点分析研究的出发点是采用硬件支持、弹性动态污点分析、离线动态污点分析、分布式动态污点分析和引入新算法等技术,尽可能地降低动态污点分析带来的内存和时间开销,继而将动态污点分析应用于信息泄露检测[55-56]、逆向工程[57]、恶意软件分析[58-60]、程序取证[61]和漏洞利用[62]等安全问题.
例如,TaintDroid[55]使用动态污点分析在基于Android的移动设备上标识并跟踪隐私敏感信息,防止隐私数据泄露.FlowWalker[57]通过离线的方式将污点跟踪操作与执行分离,在虚拟执行回放期间处理污点路径,实现文件格式提取的需求.DroidScope[58]通过重构操作系统和Dalvik语义视图,基于动态污点分析技术进行Android恶意软件分析.文献[61]基于动态污点分析工具实现Android应用程序取证,避免了研究人员使用Cellkerite和Encase移动取证工具包进行手动分析导致的证据不完整问题.文献[62]将来自网络用户输入和配置文件的数据标记为污点,借助数据流分析,检测程序存在的漏洞,并根据漏洞利用原型系统实现简单的漏洞利用.
动态污点分析技术虽然已经取得了丰硕的研究成果,但不可忽视的是,动态污点分析也有很多问题没有得到完全解决.现在的动态污点分析框架存在准确度和性能两方面的问题,其中准确度问题主要表现在污点分析过程中存在的“过污染”和“欠污染”问题,性能问题是指动态污点分析系统存在运行时开销大、速度慢的问题.所谓“过污染”是将一个与污点输入无污点传播关系的数据标记为污点属性,产生了误报;“欠污染”是将一个与污点输入有污点传播关系的数据标记为无污染属性,即产生了漏报.
进程级动态污点分析往往针对特定的体系结构,目前的进程级动态污点分析框架不具有体系结构通用性,也不支持内核漏洞检测.另外,动态污点分析技术是一个略繁重的技术,当该技术应用于轻量级的系统时,就要求开发人员在准确性和速度之间进行一定的权衡.例如,将动态污点分析技术应用于模糊测试工具AFL.
全系统动态污点分析框架不仅模拟器本身会占用一部分的软硬件资源,动态污点传播和动态污点分析也会带来更加高昂的代价.全系统动态污点分析技术应该在将技术应用于信息泄露检测、逆向工程、恶意软件分析、程序取证、漏洞利用等安全问题的同时,采用已有的或创新技术提升系统的性能.由于污点分析数据越详细,动态污点分析系统效率下降就越严重,动态污点分析工具需要开发人员根据应用环境要求,在污染精度和污染效率之间进行权衡.
本文详细分析了基于二进制文件动态污点分析技术的国内外研究现状和最新研究成果,并分别从进程级动态污点分析和全系统级动态污点分析两个方向阐述了动态污点分析技术的发展方向和应用领域,介绍了基于进程级动态污点分析技术的动态二进制插桩技术和基于全系统动态污点分析技术的虚拟化技术、虚拟机自省技术和弥合语义鸿沟技术等,并对动态污点分析技术的原理进行了介绍.在此基础上,对动态污点分析技术所面临的问题和挑战进行了讨论,并对未来本体构建的研究方向进行了简要分析.