软件漏洞分析中的脆弱点定位方法*
2015-06-21蔡军邹鹏杨尚飞何骏装备学院复杂电子系统仿真实验室北京046海军装备研究院北京006
蔡军,邹鹏,杨尚飞,何骏(.装备学院复杂电子系统仿真实验室,北京046;.海军装备研究院,北京006)
软件漏洞分析中的脆弱点定位方法*
蔡军1,邹鹏1,杨尚飞2,何骏1
(1.装备学院复杂电子系统仿真实验室,北京101416;2.海军装备研究院,北京100161)
针对二进制程序漏洞成因复杂难以分析的问题,提出运用污点分析的软件脆弱点定位方法,并实现了一个工具原型SwordChecker。以动态污点追踪为基础,依据漏洞模式通过特征匹配来定位软件中的脆弱点,运用二分查找定位影响脆弱点的敏感字节。实验表明,使用SwordChecker能够精确快速识别定位软件中三种类型的脆弱点,已成功分析了多个已公开漏洞的成因,并已辅助挖掘出几个未公开漏洞。
污点分析;脆弱点定位;二分查找
当今时代是信息时代,社会信息化是当今世界发展的潮流,信息系统已经成为社会发展的重要战略资源,信息系统的安全性也越来越重要。软件安全是信息系统安全的重要组成部分,软件漏洞则是安全问题的根源之一,层出不穷的软件安全漏洞给国民经济和社会生活带来了负面的影响。软件漏洞检测、分析及利用成为信息安全领域的一个研究热点。
软件漏洞是软件生命周期中涉及安全的设计错误、编码缺陷和运行故障[1]。将对软件进行已公开漏洞的发现和未知漏洞的发掘的技术称为软件漏洞检测技术,将分析漏洞形成原因及利用价值的技术称为漏洞分析技术,将利用漏洞实施攻击的技术称为漏洞利用技术。当前研究较多的是自动化的软件漏洞检测技术,涌现出以各种模糊器[2-6]为代表的大量的自动化的漏洞检测工具,而对漏洞分析和漏洞利用的研究还处于起步阶段,仍以手工分析为主,缺乏良好的自动化工具,蔡军等的目标就是研究自动化的软件漏洞分析技术。
脆弱点定位是软件漏洞分析中的关键环节,所谓脆弱点是指直接导致软件漏洞产生的某条指令或某个函数。脆弱点受用户输入影响,一般情况下不影响软件正常运行,但在注入特定输入的情况下会导致软件产生异常,形成漏洞。脆弱点与漏洞类型相关,漏洞种类很多,每一种漏洞形成的具体原因都不同,其脆弱点类型也不同。蔡军等主要研究输入相关漏洞的脆弱点定位。
蔡军等提出一种基于污点分析的软件脆弱点定位方法,核心思想为:(1)以细粒度的动态在线污点追踪作为脆弱点定位的基础;(2)基于已公开漏洞总结漏洞模式,基于漏洞模式建立规则,查找定位脆弱点;(3)基于二分查找算法定位影响脆弱点的敏感输入字节。
1 相关工作
虽然软件开发人员尤其是通用软件制造商对软件安全越来越重视,也加大了软件发布前的安全性测试力度,但是软件漏洞依然或多或少地存在,几乎不可能完全避免。
以各种模糊器为代表的软件漏洞检测工具通常只能发现导致软件崩溃(或异常)的测试用例,但是崩溃的具体原因常常不得而知,需要进一步的分析。简而言之,发现软件崩溃只能算是找到了漏洞的半成品,只有分析清楚了崩溃的原因才算是真正发现了一个漏洞。目前的软件漏洞分析以借助于调试器手工分析为主,缺少自动化的分析工具。由于软件漏洞成因复杂,手工分析十分烦琐,且需要研究人员具备极强的专业知识和丰富的经验。因此,有必要研究自动化的软件漏洞分析技术来帮助研究人员分析漏洞成因。
对自动化的软件漏洞分析的研究还不多。徐欣民[7]提出了一种基于静态分析结合动态跟踪调试的缓冲区溢出漏洞定位技术,以一种基于函数调用的缓冲区溢出漏洞模型为基础,通过动态跟踪调试捕获溢出并与静态反汇编结果比对来定位导致溢出的函数调用。杨滨诚等[8]提出了一种基于数据流分析和边界检查的缓冲区溢出定位技术,通过数据流和别名分析识别可能受外部输入影响的指针和数组,通过边界检查定位溢出。史胜利[9]提出了一种基于代码插桩的缓冲区溢出漏洞定位技术,通过代码插桩捕获信息,根据系统提供的异常信息,分析产生异常的指令,获取破坏的内存点,进而查找漏洞所在点。杨羡环[10]提出了一种基于函数调用序列的漏洞定位技术,通过多次程序执行和面向方面编程框架获取函数调用序列,通过分析函数调用序列定位漏洞。以上几种方法均只有一个笼统的思路,难以实现精确定位,只能分析缓冲区溢出漏洞,且未能分析真实应用软件的漏洞,自动化程度不高。
2 污点分析概述
污点分析[11-15]是一种新兴的程序分析技术,其主要思想是将用户输入作为污点源,在程序执行过程中追踪污点源的传播,所有直接或间接受污点源影响的变量都是被污染的变量,称为污点数据。用污点分析来分析软件漏洞的原理是:任何用户可控的变量都是不安全的,当一个被污染的变量被用来执行危险操作时就可能产生安全漏洞。
污点分析从是否需要运行软件的角度可以分为两种类型:静态污点分析和动态污点分析。静态污点分析工作在源代码级,通过分析程序源代码来推衍污点的传播。动态污点分析则是在程序实际运行过程中追踪污点的传播。静态污点分析的最大缺陷是依赖于源代码,然而大多数时候源代码是不可得到的,且静态的污点分析由于缺乏运行时信息,误报也很多。因此,动态的污点分析更加实用,但是其实现比较复杂,SwordChecker使用的是动态污点分析。
动态污点分析的实现主要有两种方式,即通过硬件实现和通过软件实现。硬件实现方式虽然效率较高,但是需要对硬件进行扩展,实现难度很大且成本高,因而并不常用。软件实现方式一般通过动态二进制插桩来实现。动态二进制插桩是在程序执行过程中,在程序实际执行的某个基本执行单元(指令、基本块、函数等)前后插入分析代码来获取想要的运行时信息,通常借助于二进制插桩平台来实现。现有的二进制插桩平台主要有三个:DynamoRIO[16],Valgrind[17]和Pin[18]。SwordChecker使用Pin来实现。
3 运用污点分析的脆弱点定位
运用污点分析的脆弱点定位方法分为三个步骤:第一步是追踪用户输入即污点源在程序执行过程中的传播,第二步是定位程序中的脆弱点,第三步是定位输入中影响脆弱点的敏感字节。
3.1 Pin的二进制程序在线污点追踪
Pin是Intel公司研发的一个动态二进制插桩平台,它允许在可执行程序的任意位置插入任意代码,并且代码在程序运行时动态添加。可以把Pin比作一个超级即时编译器,这个超级编译器的输入不是字节码而是一个可执行程序。Pin拦截可执行程序要执行的第一条指令,并将以这条指令开始的一个直线代码序列编译成新的代码在Pin虚拟机里执行,新的代码和原始代码基本一致。遇到跳转指令时,Pin重新接管程序,再编译下一段要执行的代码。可执行程序要执行的所有代码都被编译成了新的代码在Pin虚拟机里执行,原始代码仅供参考,这样Pin就向用户提供了向目标程序注入它们自己代码的机会。
Pin的结构如图1所示[19],可以看到Pin由虚拟机、代码缓存器和插桩API三个部分构成。插桩API是Pin提供给用户的接口,用户可以利用它们来编写自己的插桩工具,称为“Pintool”;代码缓存器用来缓存由原始代码编译而来的新代码,这样可以避免重复编译,提高效率;虚拟机用来执行新代码。虚拟机又由即时编译器、仿真器和分派器构成,三者在Pin控制应用程序后通过互相协同来执行程序,即时编译器负责编译原始代码和插桩用户代码,分派器负责调度代码的执行,仿真器负责解释那些不能由虚拟机直接执行的指令,如系统调用。
图1 Pin结构图Fig.1 Architecture of Pin
基于Pin的在线污点追踪是借助Pin在程序运行过程插入分析代码来实现污点追踪逻辑。污点追踪主要包含污点引入和污点传播两个过程。3.1.1污点引入
由于程序大部分时候都在执行与输入无关的指令,如加载动态链接库、共享库等,需要决定在程序执行的什么地方来引入污点源,这就是污点引入。污点引入的时刻实际上是程序刚开始操作污点源的时刻。污点源的种类主要有三种,即文件、网络数据包和命令行参数(常见于Linux系统),如使用Microsoft Word打开一个.doc文件,这个.doc文件就可以作为污点源。
使用Pin来实现污点引入的方法是通过Pin提供的插桩API来劫持程序执行过程中的打开和读取污点源的系统调用,插入污点引入代码。如使用文件作为污点源,则需劫持open,read,readv等读文件相关系统调用,如使用网络数据包作为污点源,则需劫持socket,accept,recv等socket相关系统调用。SwordChecker当前主要支持文件作为污点源。
在使用文件作为污点源时,可以将整个文件设置为污点源,也可以将文件中的部分字节设置为污点源。SwordChecker允许用户通过一系列参数来定制污点源。对于文件污点源,使用三个参数:“-tf”,“-to”和“-ts”。“-tf”参数指示了需要被设置为污点的文件,“-to”参数指示了污点文件中第一个需要被设置为污点源的字节的偏移量,“-ts”参数指示了以偏移量为开始需要被设置为污点的字节数目。
3.1.2 污点传播
污点传播是在污点引入后,根据一定的传播策略追踪污点源被程序指令进行的复制和更改。污点数据被指派一个污点标签,污点标签根据指令的语义从原操作数传播到目的操作数。污点传播策略直接影响整个污点传播过程的正确性。
在污点传播时有两个基本问题。一个问题是污点传播粒度,指最小的污点传播单元。选择一个合适的污点传播粒度很重要。如果粒度选择太大,如大到一片连续的内存块,容易造成污点数据丢失或是不精确的污点传播。相反,粒度选择太小,如小到一个位(bit),则容易导致污点传播过度扩散,且污点传播的实现逻辑也会变得相当复杂。SwordChecker选取字节作为污点传播粒度,因为大部分指令都以字节为基本单位进行运算,且在大部分计算机体系结构中,最小的内存寻址单元也是字节。相对于传统的以四字节内存单元为最小污点传播单元的污点追踪,SwordChecker实施的是更细粒度的污点追踪。
另一个问题是污点标签大小。每一个污点传播单元都将被指派一个污点传播标签。最小的污点标签大小可以是一个位。如,位为1代表这个污点单元被污染了,位为0代表未被污染。大的标签虽然功能更多,因为它允许不同类型的数据被唯一标记,但是大的标签需要更加复杂的传播逻辑和更大的存储空间。这一方面会显著增加内存消耗,另一方面会大幅降低污点追踪速度。SwordChecker的目标是快速的在线污点追踪,在不影响污点传播精度的前提下越快越好,因此选择一个位大小的标签。
在二进制级别上,有两类对象可被污染:内存位置和寄存器。因此,SwordChecker在两类数据结构中存储污点标签。一个数据结构是“mem_taint_map”,它为每个可寻址的内存单元维持一个位作为标签。另一个数据结构是“reg_ taint_map”,它为每一个32位寄存器维持一个字节来存储标签,该字节的低四位存储了寄存器的四位污点标签。
关于污点传播策略,SwordChecker主要考虑三类指令的污点传播:(1)数据复制指令(如MOV,PUSH,POP等)。针对这类指令,复制源操作数的标签到目的操作数。(2)数据运算指令(如ADD,SUB,AND,SHL等)。针对这类指令,将源操作数和目的操作数的标签一起运算来更新目的操作数的标签。(3)特殊指令。一些特殊指令可能会导致操作数的污点标签被清除,如CPUID指令,它是intel IA32架构下获得CPU信息的汇编指令,可以得到CPU类型、型号、制造商信息、商标信息、序列号、缓存等一系列与CPU相关的东西。它使用eax作为输入参数,eax,ebx,ecx,edx作为输出参数,执行该指令后,这几个寄存器都将被立即数填充,而立即数不是污点数据。
3.2 漏洞模式的脆弱点定位
所谓漏洞模式是指不同类型漏洞的特征。漏洞类型不同,其脆弱点类型也不同。SwordChecker适用的漏洞类型主要为输入相关漏洞,所谓输入相关漏洞是指那些能够由特定的输入触发的漏洞,这个输入是由用户提供的,可以是文件、网络数据包,也可以是键盘输入。输入相关漏洞主要包括除0漏洞、整数溢出漏洞、缓冲区溢出漏洞等。SwordChecker根据漏洞模式建立规则,通过污点检查来实现脆弱点的定位,即检查是否有安全敏感操作操作了污点数据。
SwordChecker当前支持以下几种类型的脆弱点定位。
3.2.1 除法指令
除法指令是除0漏洞的脆弱点。除0漏洞是指在做除法运算时除数为0导致软件出现除0异常,这种漏洞经常发生在一个非预期的值被提供给程序,然后用这个值来计算物理维度,如大小、长度、宽度和高度时。图2是含有除0漏洞的一段简单代码,变量a和b的值从一个输入文件中读取,如果a>b且a-b=100,就会在代码段第2行产生除0异常,因此这段代码的第2行就是一个脆弱点(注意不是所有的除法操作都是脆弱点,只有受输入影响的除法操作才是)。
图2 含有除0漏洞的代码片段Fig.2 Code fragment including a division by zero
要定位这一类脆弱点,只需借助于Pin的API“INS_AddInstrumentFunction”来实施指令级插桩,插入分析代码,如果是div和idiv指令就检查它们的除数是否被污染。如果除数存放在内存中,则从mem_taint_map查找对应的污点标签看是否为1,如果除数存放在寄存器中,则检查reg_taint_map。
3.2.2 内存操作函数
内存操作函数(如malloc,calloc,memcpy等)是整数溢出漏洞的脆弱点。整数溢出是指算术运算的结果超出了整型变量能够表示的值的范围(或大于最大值,或小于最小值)。并不是所有的整数溢出都会产生安全问题,只有当溢出值被用来作为安全敏感函数的参数时,才会产生漏洞。例如,将一个溢出值用来作为内存分配函数malloc代表分配内存大小的参数时,就会导致所分配的内存小于实际所需的内存,最终可能导致缓冲区溢出。
图3是含有整数溢出漏洞的一段代码,整数变量a和b的值也是由用户输入决定,而整数变量e的值则由a和b决定。显然,如果没有溢出检查,变量e很可能会溢出。更进一步,如果一个溢出的e被用作内存分配函数“malloc”的参数(第3行),就很有可能导致一个漏洞,因此这段代码的第3行就是一个脆弱点。
图3 含有整数溢出漏洞的代码片段Fig.3 Code fragment including an integer overflow
要定位这一类脆弱点,只需借助于Pin的API“RTN_AddInstrumentFunction”来实施函数级插桩,插入分析代码,检查函数的有关参数是否为污点数据。以calloc函数为例,其原型为“void *calloc(size_t n,size_t size)”,其功能是在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。由于n过大和size过大都可导致溢出,所以在分析代码中需要检查n和size是否被污染。
3.2.3 字符串操作函数
字符串操作函数(如strcpy,strcat,sprintf,vsprintf,gets等)是缓冲区溢出漏洞的脆弱点。缓冲区溢出可能是最众所周知的一种漏洞。当一个程序试图将比给定内存块更大的数据放入这块内存时就会发生缓冲区溢出,溢出会导致在分配内存之外写数据,进而导致程序崩溃或执行恶意代码。虽然大部分软件开发人员都知道缓冲区溢出,但这种漏洞并不好检测。
造成缓冲区溢出的主要原因是不完整或不恰当的对用户输入的检查。图4是含有缓冲区溢出漏洞的一段代码,字符串str的值是输入文件的一行文本,在示例代码的第5行,函数strcpy直接复制“str”的内容到“buffer”,只要“str”的长度大于50,就会导致“buffer”溢出,因此这段代码的第5行就是一个脆弱点。
图4 含有缓冲区溢出漏洞的代码片段Fig.4 Code fragment including a buffer overflow
要定位这一类脆弱点,也是借助于Pin的API“RTN_Add InstrumentFunction”来实施函数级插桩,插入分析代码,检查函数的有关参数是否为污点数据。以strcpy函数为例,其原型为“extern char*strcpy(char*dest,const char*src)”,其功能是把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间。在插入的分析代码中需要检查dest和size的地址以及它们指向的内存地址是否被污染。
3.3 二分查找的敏感字节定位
上一步的目的是检查程序是否存在脆弱点,实际上是将整个输入文件都作为污点源来进行污点追踪,然后检查是否有安全敏感操作来操作污点数据。如果上一步检测出有脆弱点存在,则接下来进一步定位输入文件中影响脆弱点的敏感字节。例如,图2中变量a和b的值影响第2行代码中除法操作的除数值,则输入文件中影响a和b的值的字节就是要定位的敏感字节。
SwordChecker使用二分查找算法来定位敏感字节,算法通过shell脚本编程实现。算法流程如图5所示,具体步骤如下:
Step1:获取输入文件大小Size,初始化文件偏移量Low=0,High=Size,Low代表下限,High代表上限,最终定位的敏感字节位置在Low与High之间(一般为4个字节)。
图5 敏感字节的二分查找定位算法Fig.5 Binary search algorithm for sensitive bytes localization
Step2:检查是否满足终止条件Low>High-3,如果满足则输出Low,High。
Step3:计算Low,High之间的中间位置Mid= (Low+High)/2,检查敏感字节是在[Low,Mid]之间还是在[Mid,High]之间(分别将输入文件的这两个区间设为污点源,看是否有指定的脆弱点VName出现),如果敏感字节在[Low,Mid]之间,则High=Mid,如果敏感字节在[Mid,High]之间,则Low=Mid。
Step4:重复Step2,Step3。
4 实验分析
实验分为两类,一是用SwordChecker来分析定位已公开漏洞的脆弱点,主要从国际上知名的公开漏洞库中选取一些真实漏洞作为测试对象;二是用SwordChecker来辅助挖掘未公开漏洞(即0day漏洞),主要选取一些运行在Linux上的常用真实应用软件作为测试对象。所有实验均在Ubuntu 12.04 32位系统上进行。
4.1 已公开漏洞脆弱点定位
首先,从国际上著名的公开漏洞库Common Vulnerabilities and Exposures(CVE)[20],Open Source Vulnerability Database(OSVDB)[21],ExploitDatabase(EDB)[22]里选取了一些真实的软件漏洞来对SwordChecker进行测试,实验结果见表1。选取的每个漏洞都在EDB里有一个POC (Proof of Concept)文件可供下载,即选取的每个漏洞都可以由对应的POC文件触发。表1的第一列是漏洞在漏洞库中的编号,如CVE-2014-1684指CVE中编号为2014-1684的漏洞,OSVDB-ID-88610指OSVDB中编号为88610的漏洞,EDB-ID-7812指EBD中编号为7812的漏洞。
表1 公开漏洞脆弱点定位Tab.1 Vulnerable spots localization of several open vulnerabilities
以OSVDB-ID-88610漏洞为例进行分析。该漏洞是多媒体播放器Totem Movie Player(一套在类Unix操作系统上运行的多媒体播放器,也是Ubuntu系统的预设影片播放器)上的一个除0漏洞,软件版本号为3.4.3,漏洞现象如图6所示,用该软件(程序名为totem)打开POC文件poc1.avi时发生浮点数例外崩溃退出。
图6 OSVDB-ID-88610漏洞现象Fig.6 Phenomenon of OSVDB-ID-88610
用SwordChecker对该漏洞进行分析的结果如图7所示。该软件有两个脆弱点,一个是“div dword ptr[esp+0x1c]”指令(地址为0x952c8372),一个是“idiv ecx”指令(地址为0x8c594e12),这两条指令的操作数都是污点数据,直接导致漏洞产生的是idiv指令。SwordChecker进一步分析出影响这两个脆弱点的敏感字节分别为POC文件的第17~20字节和第4423~4424字节。
从表1可以看出,CVE-2014-1684的脆弱点为div指令,敏感字节为第123~126字节;CVE-2012-5470的脆弱点为memcpy和malloc函数,敏感字节分别为第1~4和第84~87字节;CVE-2007-4938的脆弱点为calloc,敏感字节为169~172,225~228;EDB-ID-7812的脆弱点为memcp,敏感字节为第13~16字节。另外,在实验中还发现一个规律,敏感字节只占输入文件的很小一部分(如CVE-2007-4938的POC文件大小为46 956 236B,但敏感字节只有8个),且一般位于文件的头部,大体在前1000个字节以内。可在文件的前1000个字节里运用二分查找算法定位。
图7 OSVDB-ID-88610漏洞的分析结果Fig.7 Analysis result of OSVDB-ID-88610
4.2 脆弱点定位辅助0day漏洞挖掘
通过脆弱点定位不但能帮助分析已公开漏洞的成因,还能辅助挖掘0day漏洞,已经用SwordChecker结合开源模糊测试工具zzuf[6]挖出了几个0day漏洞,以swftools-0.9.2 png2swf整数溢出漏洞为例进行分析。种子输入为一个正常的PNG文件input.png,其十六进制格式如图8所示。
图8 Input.png的十六进制格式Fig.8 Hexadecimal format of input.png
图9 用zzuf对png2swf进行模糊测试Fig.9 Using zzuf fuzzing png2swf
图10 New.png的十六进制格式Fig.10 Hexadecimal format of new.png
图11 Swftools-0.9.2 png2swf漏洞现象Fig.11 Phenomenon of swftools-0.9.2 png2swf vulnerability
首先用SwordChecker定位到input.png的第十二个字节“0x0d”影响内存分配函数malloc,接下来用zzuf通过集中对第十二个字节进行变异来实施模糊测试就发现了一个漏洞。如图9所示,zzuf有三个参数:s是随机数种子,s为0∶1000是指种子从0到1000变化;r是变异率,r为1表示百分之百的变异;b是变异范围,b为11表示第十二个字节(从0开始起算)。从图9可以看到当s=4,r=1时检测到了“memory exceeded”,用s= 4,r=1作为参数生成一个新的文件new.png(zzuf使用相同的参数生成的文件永远相同)。如图10所示,可以看到第十二个字节变成了“0x2d”。将new.png作为png2swf的输入就触发了漏洞,漏洞现象如图11所示,可以看到发生了段错误。进一步用SwordChecker分析原因,得到的分析结果如图12所示,可以确定该漏洞是由malloc参数过大(n=0x61676572,与new.png的第66~69个字节对应)引起的整数溢出漏洞。
图12 Swftools-0.9.2 png2swf漏洞分析结果Fig.12 Analysis result of swftools-0.9.2 png2swf vulnerability
5 结论
本文提出了一种基于污点分析的软件脆弱点定位方法,该方法以动态污点追踪为基础,基于漏洞模式建立检查规则,通过污点检查来定位脆弱点,通过二分查找来进一步定位输入文件中影响脆弱点的敏感字节。实现了一个相应的原型系统SwordChecker。实验表明,SwordChecker不但能快速精确定位除0漏洞、整数溢出漏洞和缓冲区溢出漏洞的脆弱点,还能精确定位输入文件中影响脆弱点的敏感字节;不但能帮助分析漏洞的成因,还能辅助0day漏洞挖掘,已经分析了多个公开漏洞的成因,并辅助挖掘了几个0day漏洞。
SwordChecker当前适用于Linux下的32位二进制程序,目前主要支持文件处理程序,下一步计划将其扩展到支持Windows系统和网络处理程序。
References)
[1]吴世忠,郭涛,董国伟,等.软件漏洞分析技术进展[J].清华大学学报(自然科学版),2012,52(10):1309-1319.WU Shizhong,GUO Tao,DONG Guowei,et al.Software vulnerability analyses:a road map[J].Journal of Tsinghua University(Science and Technology),2012,52(10):1309-1319.(in Chinese)
[2]Caca labs.Zzuf-Multi-purpose fuzzer[EB/OL].http:// caca.zoy.org/wiki/zzuf.
[3]A pure-python fully automated and unattended fuzzing framework[EB/OL].https://github.com/OpenRCE/sulley.
[4]Eddington M.Peach fuzzer[EB/OL].http://peachfuzzer.com/.
[5]Sogeti ESEC Lab.Fuzzgrind[EB/OL].http://eseclab.sogeti.com/pages/Fuzzgrind.
[6]FuzzBALL:Vine-based binary symbolic executi-on[EB/OL].https://github.com/bitblaze-fuzzball/fuzzball.
[7]徐欣民.一种缓冲区溢出漏洞自动挖掘及漏洞定位技术[D].武汉:华中科技大学,2008.XU Xinmin.An automatic mining and positioning technology for buffer overflow vulnerabilities[D].Wuhan:Huazhong University of Science and Technology,2008.(in Chinese)
[8]杨滨诚,茅兵.输入相关的缓冲区溢出检测和定位[C]// 2010(第三届)全国网络与信息安全学术会议,2010: 103-108.YANG Bincheng,MAOBing.Detection and location of inputrelated buffer overflows[C]//Proceedings of 2010(3rd) National Conference on Computer Networks and Information Security,2010:103-108.(in Chinese)
[9]史胜利.基于代码插装的缓冲区溢出漏洞定位技术[J].计算机工程,2012,38(9):138-140.SHIShengli.Buffer overflow vulnerability location technology based on code instrumentation[J].Computer Engineering,2012,38(9):138-140.(in Chinese)
[10]杨羡环.基于函数调用序列的漏洞定位方法研究[D].武汉:华中科技大学,2013.YANG Xianhuan.Research of software-defect localization based on function calling sequence mining[D].Wuhan: Huazhong University of Science and Technology,2013.(in Chinese)
[11]Newsome J,Song D.Dynamic taint analysis for automatic detection,analysis,and signature generation of exploits on commodity software[C]//Proceedings of the Network and Distributed System Security Symposium,2005.
[12]Clause J,LiW C,Orso A.Dytan:a generic dynamic taint analysis framework[C]//Proceedings of the 2007 international symposium on Software testing and analysis.ACM,2007: 196-206.
[13]Kang M G,McCamant S,Poosankam P,etal.DTA++:dynamic taint analysis with targeted control-flow propagation[C]// Proceedings of the 18th Network and Distributed System Security Symposium,2011.
[14]Bosman E,Slowinska A,Bos H.Minemu:the world’s fastest taint tracker[C]//Proceedings of Recent Advances in Intrusion Detection.Springer Berlin Heidelberg,2011,6961: 1-20.
[15]Kemerlis V P,Portokalidis G,Jee K,et al.libdft:practical dynamic data flow tracking for commodity systems[C]// Proceedings of ACM SIGPLAN Notices,2012,47(7): 121-132.
[16]DynamoRIO[EB/OL].http://www.dynamorio.org/.
[17]Valgrind[EB/OL].http://valgrind.org/.
[18]Intel.Pin-a dynamic binary instrumentation tool[EB/OL].https://software.intel.com/en-us/articles/pin-a-dynamicbinaryinstrumentation-tool.
[19]Hazelwood K,Klauser A.A dynamic binary instrumentation engine for the ARM architecture[C]//Proceedings of the International Conference on Compilers,Architecture and Synthesis for Embedded Systems,2006:261-270.
[20]Common vulnerabilities and exposures[EB/OL].https:// cve.mitre.org/.
[21]Wikipedia.Open source vulnerability database[EB/OL].http://en.wikipedia.org/wiki/Open_Source_Vulnerability_ Database.
[22]Offensive Security[EB/OL].The Exploit Database.http:// www.exploit-db.com/.
Vulnerable spots localization methods for software vulnerability analysis
CAIJun1,ZOU Peng1,YANGShangfei2,HE Jun1
(1.Science and Technology on Complex Electronic System Simulation Laboratory,Academy of Equipment,Beijing 101416,China;2.Naval Academy of Armament,Beijing 100161,China)
Aiming at the difficulty in analysis of binary program vulnerabilities,an approach for software vulnerable spots localization based on taint analysis was proposed,and a corresponding tool named SwordChecker was implemented.This method is based on dynamic taint tracing.Software vulnerable spotswere localized by charactermatching according to vulnerability patterns,and sensitive byteswhich affected the vulnerable spots were localized by binary-search.Experiment results show that SwordChecker can accurately identify and localize three types of software vulnerable spots fast,has successfully analyzed the causes of multiple open vulnerabilities,and has assisted mining several undisclosed vulnerabilities.
taint analysis;vulnerable spots localization;binary-search
TP309
A
1001-2486(2015)05-141-08
10.11887/j.cn.201505022
http://journal.nudt.edu.cn
2014-12-31
国家863计划资助项目(2012AA012902);“核高基”国家科技重大专项基金资助项目(2013ZX01045-004)
蔡军(1982—),男,湖北天门人,博士研究生,E-mail:cjgfkd@163.com;邹鹏(通信作者),男,教授,硕士,博士生导师,E-mail:zpeng@nudt.edu.cn