CN107526970A - 基于动态二进制平台检测运行时程序漏洞的方法 - Google Patents
基于动态二进制平台检测运行时程序漏洞的方法 Download PDFInfo
- Publication number
- CN107526970A CN107526970A CN201710737006.0A CN201710737006A CN107526970A CN 107526970 A CN107526970 A CN 107526970A CN 201710737006 A CN201710737006 A CN 201710737006A CN 107526970 A CN107526970 A CN 107526970A
- Authority
- CN
- China
- Prior art keywords
- instruction
- register
- binary
- stain
- platform
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 47
- 230000006870 function Effects 0.000 claims abstract description 56
- 238000001514 detection method Methods 0.000 claims abstract description 44
- 230000006399 behavior Effects 0.000 claims abstract description 21
- 238000004458 analytical method Methods 0.000 claims description 32
- 238000011109 contamination Methods 0.000 claims description 25
- 230000008569 process Effects 0.000 claims description 18
- 230000005540 biological transmission Effects 0.000 claims description 4
- 238000000605 extraction Methods 0.000 claims description 4
- 238000012545 processing Methods 0.000 claims description 4
- 230000000644 propagated effect Effects 0.000 claims description 4
- 230000001902 propagating effect Effects 0.000 claims description 3
- 238000000151 deposition Methods 0.000 claims 1
- 238000001914 filtration Methods 0.000 abstract description 2
- 230000008859 change Effects 0.000 description 3
- 238000010586 diagram Methods 0.000 description 3
- 238000005516 engineering process Methods 0.000 description 3
- 230000007246 mechanism Effects 0.000 description 3
- 238000012360 testing method Methods 0.000 description 3
- 229910002056 binary alloy Inorganic materials 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 238000007689 inspection Methods 0.000 description 2
- 230000009471 action Effects 0.000 description 1
- 238000003491 array Methods 0.000 description 1
- 230000001174 ascending effect Effects 0.000 description 1
- 230000008901 benefit Effects 0.000 description 1
- 239000012141 concentrate Substances 0.000 description 1
- 238000005314 correlation function Methods 0.000 description 1
- 238000012217 deletion Methods 0.000 description 1
- 230000037430 deletion Effects 0.000 description 1
- 238000009795 derivation Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 239000002360 explosive Substances 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 238000003780 insertion Methods 0.000 description 1
- 230000037431 insertion Effects 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 238000012544 monitoring process Methods 0.000 description 1
- 238000007781 pre-processing Methods 0.000 description 1
- 230000009467 reduction Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 238000010998 test method Methods 0.000 description 1
- 230000009466 transformation Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/57—Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
- G06F21/577—Assessing vulnerabilities and evaluating computer system security
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2221/00—Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F2221/03—Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
- G06F2221/033—Test or assess software
Landscapes
- Engineering & Computer Science (AREA)
- Computer Hardware Design (AREA)
- Computer Security & Cryptography (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Computing Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种基于动态二进制平台检测运行时程序漏洞的方法,属于虚拟机与程序分析技术领域,包括:基于二进制代码执行平台Pin,对主存和寄存器中来自外部渠道的输入进行识别并将其作为可疑污染源加以标记;通过中间指令层实现可疑污染源传播行为的跟踪,根据各指令操作数的污点状态对污染行为进行分析,其中污点状态包括被污染、未被污染和受控污染;建立内存模型和寄存器模型记录每个主存字节和寄存器字节的污点状态。本发明提出受约束的污染状态,提高了漏洞检测的覆盖率。提供全新的Hash链接表结构,该结构可以在不增加存取时间的情况下,减少污点信息的存储空间。通过将不相关的API函数过滤机制,大大降低了系统运行开销。
Description
技术领域
本发明涉及虚拟机与程序分析技术领域,特别涉及一种基于动态二进制平台检测运行时程序漏洞的方法。
背景技术
近年来,随着计算机技术的蓬勃发展,软件应用的爆炸式增长以及计算机系统规模与复杂性的增加都使得计算机系统与软件的安全越来越受到重视。软件从开发到发布都不可避免的存在安全漏洞,这些漏洞造成的后果小到系统崩溃,大到攻击者获取相应应用程序的完全控制权。因此需要在程序应用前对程序存在的漏洞进行检测。
以漏洞检测为测试目标的软件行为分析方法通常可分为两个主要部分,一部分是具体的测试方法,另一部分是测试用例的生成。在开源操作系统、开源软件以及GPL的推动下,面向源代码的漏洞检测方法取得了很好的发展。但是出于商业利益的考虑,大部分软件厂商不公开其源代码,而是直接发布编译好的执行程序。因此需要在运行执行程序前,对执行程序存在的漏洞进行检测。
目前,对于没有源代码的二进制程序,使用二进制插装技术来进行漏洞检测,通过对二进制文件的汇编指令进行插装来获得调用信息,执行回调函数进行相关操作。对汇编指令的插装方式包括两种:静态二进制插装和动态二进制插装。由于对程序进行插装的目的是在程序运行到插装部分时,可以执行插装函数进而获得信息,因此对于二进制程序一般采用动态二进制插装。在动态二进制插装中一般采用的技术手段是运用动态二进制检测框架。
基于动态二进制检测框架对二进制程序漏检进行检测的原理是:二进制检测框架并不是真正的插装,而是采用一种虚拟机的技术,将一个目标程序运行在一个特制的虚拟机系统中,该虚拟机系统支持对应的机器指令架构,当程序运行在虚拟机中,由于虚拟机底层是自己书写和改造,所以当执行某些汇编指令时,可以进行有效的监控并进行一定的处理。也有的检测框架是在虚拟系统中将汇编指令完全转换成一个中间表示的指令,以便于在虚拟机中进行分析。当程序运行时,理论上是能够在编译时对每条指令进行观察、检测和操作的。在理论上可以在运行状态下对它进行程序分析、检测、流程跟踪和指令搜集等一系列操作。
但是,这种基于动态二进制检测框架对二进制程序漏检进行检测存在的弊端在于:一是,目前流行的污染分析工具主要检测被污染状态以及未被污染状态,存在检测盲点,可能遗漏某些软件漏洞类型。二是,动态二进制分析系统在运行时,系统内耗较大。三是,在漏洞检测过程中,污点所占用的存储空间较大。
发明内容
本发明的目的在于提供一种基于动态二进制平台检测运行时程序漏洞的方法,以全面检测程序存在的漏洞。
为实现以上目的,本发明采用的技术方案为:提供一种基于动态二进制平台检测运行时程序漏洞的方法,包括:
S1、基于二进制代码执行平台Pin,对主存和寄存器中来自外部渠道的输入进行识别并将其作为可疑污染源加以标记;
S2、通过中间指令层实现可疑污染源传播行为的跟踪,根据各指令操作数的污点状态对污点行为进行分析,其中污点状态包括被污染、未被污染和受控污染;
S3、建立内存模型和寄存器模型记录每个主存字节和寄存器字节的污点状态。
其中,所述的步骤S2,具体包括:
将待检测二进制程序中的所有指令进行分类,包括算数/逻辑指令、存储器访问指令、控制传输指令、可传播污染点行为的指令、不帮助传播污点行为的指令以及执行后可以清理受污染和/或受控污染数据的指令;
将分析代码放置在基本块的末尾,以对分类后的指令执行之前获取寄存器值;
在获取寄存器值后,利用每个指令的操作数来调用相应的指令处理过程来执行指令分析任务。
其中,所述的内存模型具体用于:使用两比特来识别所述主存字节的污染状态,并在字节被污染或受控污染时,将该字节添加在链接哈希表中;
所述的寄存器模型具体用于:对所述寄存器进行分类,对每个类别的寄存器采用对应的数组记录其污点状态。
其中,所述的将分析代码防止在基本块的末尾,以对分类后的指令执行之前获取寄存器值,具体包括:
将存储在所述二进制代码执行平台Pin中的基本块所有指令时复制到软件保留指令缓存中;
利用INS_InsertCall()获取存储在itrace.out中的寄存器值,并将获取的寄存器值存储在同一个数组中;
在执行当前的基本块之后,在数组中顺序的获取所有指令以及所有寄存器值。
其中,所述的链接哈希表的组织过程包括:
将PA的第31~20位作为索引每个链接列表的键,并通过PA的第31位描述该PA的内存字节是系统空间还是内存空间;
如果链接列表的键相同,则将所述主存字节的污点信息放置在相同的链表中;
所述主存字节中的节点结构包括标签域、污点信息域以及下一个域,其中标签域用于标示链接列表中的每个节点,污点信息域用于存储由标签指定的16个连续内存字节的污点信息,下一个域用于指向下一个节点。
其中,所述的将字节添加在链接哈希表的标准为:
当16个连续的内存字节中至少一个被污染或受控污染时,将该字节添加在链接哈希表中。
其中,该方法还包括:
基于基本块和API对二进制程序漏洞的检测过程进行优化。
其中,所述的基于基本块对二进制程序漏洞的检测过程进行优化,具体包括:
将相同的基本块的指令存储到所述软件保留指令缓存中;
在执行当前的基本块之后,将所述相同基本块的指令同时进行处理。
其中,所述的基于API对二进制程序漏洞的检测过程进行优化,具体包括:
提取二进制代码的公共部分作为普通签名,并基于普通签名对API函数进行识别;
对识别出的API函数的的污染传播行为进行检查,并将检查出的污染传播信息存储在数据库中;
根据设定的过滤准则,对不传播污染数据的API函数进行过滤。
与现有技术相比,本发明存在以下技术效果:本发明基于动态程序分析平台Pin,设计了一个具有3种状态的动态污点分析框架,框架作用于X86二进制可执行文件,无需任何特殊硬件支持,实现了在程序运行时精确检测软件的漏洞。所提出三种状态分别为被污染状态、未被污染状态以及受控污染状态,而目前流行的污染分析工具主要检测被污染状态以及未被污染状态,而本发明提出了受控污染状态——受约束的污染状态,来检测所有处于受控污染状态的值,这将检测出更多的软件漏洞类型,较好的解决了检测盲点问题,提高了漏洞检测覆盖率。而且本框架也提出了新的Hash链接表结构,可以在不增加存取时间的情况下,减少污点信息的存储空间。
附图说明
下面结合附图,对本发明的具体实施方式进行详细描述:
图1是本发明中一种基于动态二进制平台检测运行时程序漏洞的方法的流程示意图;
图2是本发明中一种基于动态二进制平台检测运行时程序漏洞的方法进行污点分析的总体框架结构示意图;
图3是本发明中的Pin插接平台的基本结构示意图;
图4是本发明中提出的链接哈希表的组织结构示意图;
图5是本发明中寄存器模型的结构示意图。
具体实施方式
为了更进一步说明本发明的特征,请参阅以下有关本发明的详细说明与附图。所附图仅供参考与说明之用,并非用来对本发明的保护范围加以限制。
如图1至图3所示,本实施例公开了一种基于动态二进制平台检测运行时程序漏洞的方法,包括如下步骤S1至S3:
S1、基于二进制代码执行平台Pin,对主存和寄存器中来自外部渠道的输入进行识别并将其作为可疑污染源加以标记;
需要说明的是,在进行动态污点分析开始时,首先在主存或者寄存器中的定位污染源,这些主存器或寄存器最有可能被来自某些不安全渠道通道比如输入文件或网络的输入数据所污染。因此,在污点分析前,在主存和/或寄存器中定位污染源。
S2、通过中间指令层实现可疑污染源传播行为的跟踪,根据各指令操作数的污点状态对污点行为进行分析,其中污点状态包括被污染、未被污染和受控污染;
需要说明的是,对可疑污染源进行识别的方法包括手动方式和系统默认方式。在手动方式中,终端用户可以指定一些执行点,比如主存的一块或者某些寄存器,他们可能作为污染源的生成点,然后跟踪它们的污染传播行为。系统默认方式中,框架将自动识别来自外部渠道的输入,然后将它们作为可疑的污染源。在实际应用中,在一般的Windows程序中,实用三个系统调用,即CreateFile(),CreateFileMapPing()和MapViewOfFile(),来加载外部文件。通过跟踪这些文件的加载过程和目标地址,即可识别污染源。
在实际应用中,中间指令层实现信息流的跟踪,并且将来源于污染数据的任意数据标记为受污染状态。同时,我们只需要关注操作数的三种污染状态(污染,受控污染和未污染),而不是具体的数值。以mov指令(movr32,r32/m32/imm32)为例,源操作数(指令右侧)分为通用寄存器(r32),存储空间(m32)或立即值(imm 32)。源操作数中的任何污染/受控污染的通用寄存器,存储器字节或立即数将使目标操作数(在指令的左侧)受到污染/受控污染。否则,目标操作数被标记为未受污染。
另外,本实施例中识别出的污点状态与原有的污染分析工具相比,可以识别出第三种污染状态即受约束的污染状态,将检测出更多的软件漏洞类型,提高了二进制程序漏洞检测的覆盖率和准确率。
S3、建立内存模型和寄存器模型记录每个主存字节和寄存器字节的污点状态。
进一步地,步骤S2,具体包括如下步骤:
将待检测二进制程序中的所有指令进行分类,包括算数/逻辑指令、存储器访问指令、控制传输指令、可传播污染点行为的指令、不帮助传播污点行为的指令以及执行后可以清理受污染和/或受控污染数据的指令;
需要说明的是,算数/逻辑指令如add、sub、not和and,存储器访问指令如load、store,控制传输指令如jmp、branch和cmp。其中,可能传播污染/受控污染数据的指令主要集中在存储器访问指令和算数/逻辑指令上。
在实际应用中,由于框架的底层动态插装系统Pin被构建成一种流程虚拟机,因此无法跟踪驻留在内核空间中的指令,例如sse/mmx和Ring0指令,本实施例中将这些指令分为三组:a、可以传播污点行为的指令,如load,mov,push等。当处理这种类型的指令时,我们将从污染/受控污染数据得到的任意数据标记为污染/受控污染。b、不能帮助传播污点行为的指令,如nop,jmp,cmp等。这种类型的指令被认为不影响污染传播,我们可以直接跳过它们来减少代码分析的工作量。c、执行后可以清理污染/受控污染数据的指令。这些指令的行为应该在代码分析过程发生之前进行总结和确定。以xor指令(xoreax,eax)为例,目的操作数eax(本指令左侧)的值始终设置为0,不管寄存器的原始值是否被污染/受控污染。在这种情况下,执行指令后,eax被设置为干净(未污染)。比如用于初始化功能调用堆栈的二进制指令。所有堆栈初始化指令的功能非常相似,其行为是可预测的。
将分析代码放置在基本块的末尾,以对分类后的指令执行之前获取寄存器值;
在获取寄存器值后,利用每个指令的操作数来调用相应的指令处理过程来执行指令分析任务。
进一步地,所述的将分析代码放置在基本块的末尾,以对分类后的指令执行之前获取寄存器值,具体包括如下步骤:
将存储在所述二进制代码执行平台Pin中的基本块所有指令时复制到软件保留指令缓存中;
利用INS_InsertCall()获取存储在itrace.out中的寄存器值,并将获取的寄存器值存储在同一个数组中;
在执行当前的基本块之后,在数组中顺序的获取所有指令以及所有寄存器值。
需要说明的是,在执行指令时必须获得具体的寄存器值,但是在执行基本块之前,是无法获取这些值的。基于的底层动态插装系统Pin中将基本块作为基本处理单元,底层动态插装系统Pin通过重复执行循环:当前基本块的分析代码-当前基本块,下一个基本块的分析代码-下一个基本块...。如此循环进行工作的。因此,执行指令时,无法获取指令的寄存器值。
而本实施例中将分析代码放在基本块的末尾,与上述传统的底层动态插装系统Pin的工作模式不同:本实施例中由于执行指令的寄存器值都存储在itrace.out中,所以我们可以利用Pin提供的INS_InsertCall()来获取每个指令的寄存器值。也就是说,当基本块运行时,使用INS_InsertCall()来获取所有基本块的所有指令的寄存器值(itrace.out)。这些值存储在数组中,当执行该基本块的分析代码时,我们可以顺序获取寄存器值。
进一步地,步骤S3中的内存模型具体用于:使用两比特来识别所述主存字节的污染状态,并在字节被污染或受控污染时,将该字节添加在链接哈希表中;
需要说明的是,在动态污点分析过程中,系统必须建立内存和寄存器模型来记录每个存储器字节和寄存器的污点状态。在本框架所依托的底层插装平台Pin可以运行在32位和64位处理器上。本实施例中的内存模型用于记录用户虚拟空间的每个字节的污点信息(污染,受控污染和未污染)。由于在分析过程中,并非所有的内存字节都被污染,所以本实施例中只需要记录受污染源影响的内存字节的污染状态,而不是将它们全部存储。为了便于查询和维护(插入和删除)污点信息,建立了一个链接哈希表来记录内存字节的污染状态,链接哈希表的结构示意图如图4所示。
在框架中,假设底层系统的物理地址(如图4所示PA)的长度为32位,每个内存字节分配一个地址。在这种情况下,理论上可以对4G内存字节进行索引。由于主存储器的前2GB是系统程序的保留空间,所以只有第二个2GB用于用户程序的虚拟空间。PA被形式化为三个段,即一个节点中的键(Key),标签(Tag)和相对地址(RA)。
其中,所述的链接哈希表的组织过程包括:
Key:第一段(PA的第31~20位)是用于索引每个链接列表的键;PA的第31位描述该PA的内存字节是属于系统空间还是用户空间(0表示此字节属于系统空间,1表示属于用户空间)。通过这样做,我们可以为链接列表分配2K(2048)个键(表中分配的二进制数字从100000000000到111111111111)。如图4所示,每个键都有一个用于索引其链接列表的指针。表中最多有2K个链接列表。
链接列表:如果链接列表的键相同,则内存字节的污点信息将被放置在相同的链表中。根据标签(PA的中间16位,第19~第4位),链接列表中的节点按升序组织。根据标签中的位数,可知链表中最多有64K(216)个节点。
节点:如图4所示的节点结构,每个节点中有三个域,标签域(16位,用于标识链接列表中的每个节点),污点信息域(32位,用于存储由标签指定的16个连续内存字节的污点信息)和下一个域(32位,用于指向其下一个节点)。为了保留内存空间,连续的16个内存字节的污染信息存储在单个节点中。如果它们的标签相同,则内存字节的污点信息将被放置在相同的节点中。
在污点信息域中,本实施例使用两比特来识别每个内存字节的污染状态,00表示未污染状态,01表示受控污染状态,11表示污染状态。因此,污点信息域的32位可以存储16个内存字节的污染信息。在表中,当且仅当16个连续的内存字节中至少一个被污染/受控污染,则将节点添加进链表中。
在实际应用中,需要对链接哈希表进行维护,维护链接哈希表的主要任务是查询链接列表中的每个节点。如果一个内存字节的32位PA被获取,我们可以使用以下步骤来查找其污染信息:
使用下述哈希函数从PA获取键Key(PA的最高12位):
Key=PADIV 232-12=PADIV 220;
有了这个Key,可以找到该内存字节所属的相应链接列表。
使用下述哈希函数从PA获取标签Tag(PA的第19~第4位):
Tag=(PAMOD 220)DIV 220-16=(PAMOD 220)DIV 24;
在这个Tag可使用时,可以找到该内存字节所属的相应节点。
使用下述哈希函数从PA获取RA(PA的最后4位):
RA=PAMOD 232-28=PAMOD 24;
RA是一个4位二进制数;它可以表示一个节点的16个相对地址。从RA中可以识别用于存储该内存字节的污点信息的恰当的空间。
表中至多有211个链接列表,链接列表中最多216个节点,最多24个内存字节的污染信息可以存储在单个节点中,因此可以由链接哈希表存储的内存字节污点信息的总数量是2G,即:
211(表中最多211链表)×216(链表中最多216个节点)×24(一个节点中最多24个内存字节的污染信息)=231=2G
因此,本实施例公开的新的链接哈希表可以在不增加存取时间的情况下,减少污点信息的存储空间。
步骤S3中的寄存器模型具体用于:对所述寄存器进行分类,对每个类别的寄存器采用对应的数组记录其污点状态。
需要说明的是,寄存器模型用于记录分析过程中所有寄存器的污染状态,在该过程中通常使用两个比特位:00:未污染,01:受控污染,11:污染这种方式来表示一个寄存器的污染状态。
在实际应用中,寄存器之间有一种特殊的关系:一些寄存器是其他寄存器的一部分。以32位寄存器eax为例,ax是eax的低16位,ax由ah和al组成。在这种情况下,当寄存器的污点状态发生变化时,其相关的寄存器可能会受到影响。为了准确性,必须考虑到这种关系。如图5所示,本实施例中将寄存器分为四个类别,对应的用四个数组记录它们的污染状态,具体分类如下:
(1)Eax,ebx,ecx和edx:这些寄存器被分类为第一类。这些寄存器中的每一个都包含一个16位子寄存器,而这个子寄存器包含两个更短的8位寄存器。对于每一个这样的寄存器,使用8位元素记录其污染状态,如图5(a)所示。以eax为例,最高两位(第7和第6位)用于记录eax的污点状态;第5位和第4位用于表示ax的污点状态;第3位和第2位用于表示ah的污点状态;并且最后两位(第1和第0位)用于表示al的污点状态。在这种情况下,如果eax被污染/受控污染,那么它的子寄存器(ax,ah和al)都应该被设置为污染/受控污染。当且仅当eax的所有子寄存器未被污染时,它才是干净的。
(2)Esi,edi,ebp,esp和eip:这些寄存器被分类为第二类。这些寄存器中的每一个都包含一个16位子寄存器。对于这些寄存器,使用4位元素记录每个寄存器的污染状态,如图5(b)所示。以esi为例,最高两位(第3和第2位)用于记录esi的状态,较低的两位(第1位和第0位)表示si的污染状态。
(3)Cs,ds,ss,es,fs和gs:这些寄存器被分类为第三类。他们没有子寄存器。只需要两个比特位就可以记录它们的污点状态,图5(c)所示。
(4)Eflag:该寄存器被分类为第四类。该寄存器需要以位为单位进行访问,因此我们必须记录所有位的污染状态。每个标志需要两个比特位来记录其污点状态,本实施例中仅记录与用户程序相关的9个标志,如图5(d)显示。
进一步地,由于传统的动态二进制分析系统在运行时产生高开销,本实施例中基于基本块和API对二进制程序漏洞的检测过程进行优化,以对系统框架进行优化,其中,基于基本块BBH对二进制程序漏洞的检测过程进行优化,具体包括:
将相同的基本块的指令存储到所述软件保留指令缓存中;
在执行当前的基本块之后,将所述相同基本块的指令同时进行处理。
需要说明的是,在传统的底层动态二进制仪器系统中,需要执行目标代码和分析代码之间的上下文切换,这种上下文切换引入了高运行时开销,特别是在分析代码被插入与我们框架中的信息流跟踪一样多的位置的情况下,运行时间开销较大。
本实施例中为了减少这种运行时间开销,将来自于相同基本块的指令存储到软件保留指令缓存中,并在执行该基本块之后一起处理这些指令。本实施例中的执行目标代码和分析代码之间的上下文切换是发生在基本块的粒度上,而不是在指令的粒度上。因此,大大减少了运行的开销。
需要说明的是,在实际应用中,在执行基本块时,寄存器的值可能会改变,这种改变可能导致错误的分析结果,因此,在执行每个指令之前要记录寄存器值,记录过程会引起额外的运行开销,但是基本块BBH仍然可以工作,只需要保存寄存器值而不需要进行恢复。
进一步地,基于API对二进制程序漏洞的检测过程进行优化,具体包括:
提取二进制代码的公共部分作为普通签名,并基于普通签名对API函数进行识别;
需要说明的是,提取二进制代码的公共部分作为普通签名。API函数的签名模式可以定义如下:
Func_pattern=(Length,Maskcode,Func_info);
其中,“Length”参数表示指令数;“Maskcode”用于指定操作代码的可变/不可变部分;“Func_info”用于表示API函数的其他信息,如函数名,参数数等。
在实际应用中,生成签名之前,必须收集一些API函数的“样本”。也就是说必须收集一组可以接收不同参数的API函数的目标代码。签名被分成几个子序列,其中包括诸如“HHHH”和“&&”的符号。从不同参数产生的原始签名可能具有不同的长度,因此,像“00”这样的符号,将被插入到较短的符号中,其中,在较短的符号中连续字节中的差异被删除,并且它们的不同字节也被替换为“00”以提取原始签名的公共部分。生成的过程如下:
(1)包含所有相关函数的.cpp文件由编译器与选项一起编译,并生成一系列.obj文件;
(2)将分析每个.obj文件并使用函数的机器代码生成签名。
需要说明的是,基于普通签名对API函数进行识别如下:
根据派生签名样本P={P1,P2,......,Pn},使用模式匹配算法来识别API函数。当函数调用发生时,将该调用与签名进行比较,并将匹配结果视为已识别函数。通过将调用的机器代码与签名进行比较来识别函数调用。识别功能调用时,需要匹配所有签名。
对识别出的API函数的的污染传播行为进行检查,并将检查出的污染传播信息存储在数据库中;
根据设定的过滤准则,对不传播污染数据的API函数进行过滤。
需要说明的是,在识别出API函数后,即可对API函数进行过滤,过程如下:
对于一个特定的API函数,如果它的所有参数都没有被污染,同时它没有额外影响,就不需要对它进行信息流跟踪。例如,函数NtSingnakAndWaiting-ForSingleObject()发出一个对象并等待第二个对象。它不能引起污染传播,因此被归类为可以免于污染信息流跟踪的候选者之一。然而,一些函数不能简单地跳过,比如与本实施例中的漏洞分析规则密切相关的strcpy()。
但是,除了上述两种类型以外,由于缺乏信息,很难确定某些API函数是否可以跳过。这种API被归为未知。因为API函数的数量非常大,所以只有经常使用的API被检测。本实施例中事先收集API函数的污点信息,设计一些准则,用来为框架的API分析器提供决策,过滤准则具体为:
(1)如果一个函数在污染传播中没有任何作用,则程序的污点状态不会改变;
(2)如果一个函数可以消除污染/受控污染数据,则程序的污点状态将从污染/受控污染数据集中删除源参数;
(3)如果一个函数可以传播污染/受控污染数据,那么污染的目的地应该被标记为污染/受控污染,并进入系统监控。
需要说明的是,API调用占用程序的所有目标代码的很大一部分。由于可以确定系统库中大多数API函数的行为,而且不需要分析每个实例,因此我们可以检查这些API函数的代码,首先收集它们的污染传播信息。通过这种方法,当调用API函数时,框架可以直接跳过这些API函数,而不是分析程序的整个目标代码。在本文中,有两种不相关的API函数。第一类包含的API函数,不需要从调用它们的主机函数接收输入。由于这些API函数没有额外影响,本实施例中将它们作为安全的函数。第二类不相关的API函数是从主机函数接收输入的函数,但是它们的行为可以通过预处理过程来确定,可以通过测试它们不同的输入来确定污点行为。如果这些函数是安全的,我们可以将这些信息存储在数据库中,当主机函数被分析时,不需要处理它们。如此,对相关的API函数进行过滤,降低了二进制程序漏洞检测过程的运行消耗。
需要说明的是,本实施例公开的一种基于动态二进制平台检测运行时程序漏洞的方法具有如下有益效果:
(1)提出了程序漏洞检测的第三种状态——受约束的污染状态,这将检测出更多的软件漏洞类型,提高了漏洞检测的覆盖率。
(2)提供了全新的Hash链接表结构,该结构可以在不增加存取时间的情况下,减少污点信息的存储空间。
(3)引入了运行时优化的性能机制:将不相关的API过滤,该机制基于函数识别以及基本块处理机制,大大降低了系统运行消耗。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (9)
1.一种基于动态二进制平台检测运行时程序漏洞的方法,其特征在于,包括如下步骤:
S1、基于二进制代码执行平台Pin,对主存和寄存器中来自外部渠道的输入进行识别并将其作为可疑污染源加以标记;
S2、通过中间指令层实现可疑污染源传播行为的跟踪,根据各指令操作数的污点状态对污点行为进行分析,其中污点状态包括被污染、未被污染和受控污染;
S3、建立内存模型和寄存器模型记录每个主存字节和寄存器字节的污点状态。
2.如权利要求1所述的基于动态二进制平台检测运行时程序漏洞的方法,其特征在于,所述的步骤S2,具体包括:
将待检测二进制程序中的所有指令进行分类,包括算数/逻辑指令、存储器访问指令、控制传输指令、可传播污染点行为的指令、不帮助传播污点行为的指令以及执行后可以清理受污染和/或受控污染数据的指令;
将分析代码防止在基本块的末尾,以对分类后的指令执行之前获取寄存器值;
在获取寄存器值后,利用每个指令的操作数来调用相应的指令处理过程来执行指令分析任务。
3.如权利要求1所述的基于动态二进制平台检测运行时程序漏洞的方法,其特征在于,所述的内存模型具体用于:使用两比特来识别所述主存字节的污染状态,并在字节被污染或受控污染时,将该字节添加在链接哈希表中;
所述的寄存器模型具体用于:对所述寄存器进行分类,对每个类别的寄存器采用对应的数组记录其污点状态。
4.如权利要求2所述的基于动态二进制平台检测运行时程序漏洞的方法,其特征在于,所述的将分析代码放置在基本块的末尾,以对分类后的指令执行之前获取寄存器值,具体包括:
将存储在所述二进制代码执行平台Pin中的基本块所有指令时复制到软件保留指令缓存中;
利用INS_InsertCall()获取存储在itrace.out中的寄存器值,并将获取的寄存器值存储在同一个数组中;
在执行当前的基本块之后,在数组中顺序的获取所有指令以及所有寄存器值。
5.如权利要求3所述的基于动态二进制平台检测运行时程序漏洞的方法,其特征在于,所述的链接哈希表的组织过程包括:
将PA的第31~20位作为索引每个链接列表的键,并通过PA的第31位描述该PA的内存字节是系统空间还是内存空间;
如果链接列表的键相同,则将所述主存字节的污点信息放置在相同的链表中;
所述主存字节中的节点结构包括标签域、污点信息域以及下一个域,其中标签域用于标示链接列表中的每个节点,污点信息域用于存储由标签指定的16个连续内存字节的污点信息,下一个域用于指向下一个节点。
6.如权利要求3所述的基于动态二进制平台检测运行时程序漏洞的方法,其特征在于,所述的将字节添加在链接哈希表的标准为:
当16个连续的内存字节中至少一个被污染或受控污染时,将该字节添加在链接哈希表中。
7.如权利要求4所述的基于动态二进制平台检测运行时程序漏洞的方法,其特征在于,还包括:
基于基本块和API对二进制程序漏洞的检测过程进行优化。
8.如权利要求7所述的基于动态二进制平台检测运行时程序漏洞的方法,其特征在于,所述的基于基本块对二进制程序漏洞的检测过程进行优化,具体包括:
将相同的基本块的指令存储到所述软件保留指令缓存中;
在执行当前的基本块之后,将所述相同基本块的指令同时进行处理。
9.如权利要求7所述的基于动态二进制平台检测运行时程序漏洞的方法,其特征在于,所述的基于API对二进制程序漏洞的检测过程进行优化,具体包括:
提取二进制代码的公共部分作为普通签名,并基于普通签名对API函数进行识别;
对识别出的API函数的的污染传播行为进行检查,并将检查出的污染传播信息存储在数据库中;
根据设定的过滤准则,对不传播污染数据的API函数进行过滤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710737006.0A CN107526970B (zh) | 2017-08-24 | 2017-08-24 | 基于动态二进制平台检测运行时程序漏洞的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710737006.0A CN107526970B (zh) | 2017-08-24 | 2017-08-24 | 基于动态二进制平台检测运行时程序漏洞的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107526970A true CN107526970A (zh) | 2017-12-29 |
CN107526970B CN107526970B (zh) | 2020-05-19 |
Family
ID=60682158
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710737006.0A Expired - Fee Related CN107526970B (zh) | 2017-08-24 | 2017-08-24 | 基于动态二进制平台检测运行时程序漏洞的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107526970B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108664790A (zh) * | 2018-05-14 | 2018-10-16 | 西北工业大学 | 一种面向安全漏洞检测的多目标信息流跟踪方法 |
CN111444509A (zh) * | 2018-12-27 | 2020-07-24 | 北京奇虎科技有限公司 | 基于虚拟机实现的cpu漏洞检测方法及系统 |
CN111859375A (zh) * | 2020-07-20 | 2020-10-30 | 百度在线网络技术(北京)有限公司 | 漏洞检测方法、装置、电子设备及存储介质 |
CN113176990A (zh) * | 2021-03-25 | 2021-07-27 | 中国人民解放军战略支援部队信息工程大学 | 一种支持数据间关联分析的污点分析框架及方法 |
CN113778838A (zh) * | 2020-06-09 | 2021-12-10 | 中国电信股份有限公司 | 二进制程序动态污点分析方法及装置 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP2058747A2 (en) * | 2007-11-01 | 2009-05-13 | Electronics And Telecommunications Research Institute | Device and method for inspecting software for vulnerabilities |
CN102034045A (zh) * | 2010-12-15 | 2011-04-27 | 上海交通大学 | 低计算机系统资源开销的软件漏洞检测系统 |
CN102622558A (zh) * | 2012-03-01 | 2012-08-01 | 北京邮电大学 | 一种二进制程序漏洞的挖掘装置和方法 |
CN106709356A (zh) * | 2016-12-07 | 2017-05-24 | 西安电子科技大学 | 基于静态污点分析和符号执行的安卓应用漏洞挖掘方法 |
-
2017
- 2017-08-24 CN CN201710737006.0A patent/CN107526970B/zh not_active Expired - Fee Related
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP2058747A2 (en) * | 2007-11-01 | 2009-05-13 | Electronics And Telecommunications Research Institute | Device and method for inspecting software for vulnerabilities |
CN102034045A (zh) * | 2010-12-15 | 2011-04-27 | 上海交通大学 | 低计算机系统资源开销的软件漏洞检测系统 |
CN102622558A (zh) * | 2012-03-01 | 2012-08-01 | 北京邮电大学 | 一种二进制程序漏洞的挖掘装置和方法 |
CN106709356A (zh) * | 2016-12-07 | 2017-05-24 | 西安电子科技大学 | 基于静态污点分析和符号执行的安卓应用漏洞挖掘方法 |
Non-Patent Citations (1)
Title |
---|
王卓: ""基于符号执行的二进制代码动态污点分析"", 《中国优秀硕士学位论文全文数据库 信息科技辑》 * |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108664790A (zh) * | 2018-05-14 | 2018-10-16 | 西北工业大学 | 一种面向安全漏洞检测的多目标信息流跟踪方法 |
CN111444509A (zh) * | 2018-12-27 | 2020-07-24 | 北京奇虎科技有限公司 | 基于虚拟机实现的cpu漏洞检测方法及系统 |
CN111444509B (zh) * | 2018-12-27 | 2024-05-14 | 北京奇虎科技有限公司 | 基于虚拟机实现的cpu漏洞检测方法及系统 |
CN113778838A (zh) * | 2020-06-09 | 2021-12-10 | 中国电信股份有限公司 | 二进制程序动态污点分析方法及装置 |
CN113778838B (zh) * | 2020-06-09 | 2024-01-26 | 中国电信股份有限公司 | 二进制程序动态污点分析方法及装置 |
CN111859375A (zh) * | 2020-07-20 | 2020-10-30 | 百度在线网络技术(北京)有限公司 | 漏洞检测方法、装置、电子设备及存储介质 |
CN111859375B (zh) * | 2020-07-20 | 2023-08-29 | 百度在线网络技术(北京)有限公司 | 漏洞检测方法、装置、电子设备及存储介质 |
CN113176990A (zh) * | 2021-03-25 | 2021-07-27 | 中国人民解放军战略支援部队信息工程大学 | 一种支持数据间关联分析的污点分析框架及方法 |
Also Published As
Publication number | Publication date |
---|---|
CN107526970B (zh) | 2020-05-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107526970A (zh) | 基于动态二进制平台检测运行时程序漏洞的方法 | |
CN110287702B (zh) | 一种二进制漏洞克隆检测方法及装置 | |
EP3746921B1 (en) | Systems and methods for policy linking and/or loading for secure initialization | |
CN109583200B (zh) | 一种基于动态污点传播的程序异常分析方法 | |
CN101964036B (zh) | 漏洞检测方法及装置 | |
CN100440163C (zh) | 对计算机程序进行运行时分析的方法和系统 | |
CN104636256A (zh) | 一种内存访问异常的检测方法及装置 | |
US10599558B1 (en) | System and method for identifying inputs to trigger software bugs | |
Kirbas et al. | The relationship between evolutionary coupling and defects in large industrial software | |
CN104375941A (zh) | 可执行程序测试用例集二进制代码覆盖率自动化评估方法 | |
CN107315961A (zh) | 程序漏洞检测方法及装置、计算设备、存储介质 | |
US20200057856A1 (en) | High performance software vulnerabilities detection system and methods | |
CN112749389B (zh) | 一种检测智能合约破坏敏感数据漏洞的检测方法及装置 | |
CN101853200A (zh) | 一种高效动态软件漏洞挖掘方法 | |
WO2018016671A2 (ko) | 보안 취약점 점검을 위한 위험성 코드 검출 시스템 및 그 방법 | |
CN102708043A (zh) | 静态数据竞争检测和分析 | |
CN108469997B (zh) | 一种基于动态特征的自定义堆管理函数的自动识别方法 | |
CN115795489B (zh) | 一种基于硬件级进程跟踪的软件漏洞静态分析方法及装置 | |
KR102090229B1 (ko) | 바이너리에 대한 보안 취약점 및 그 원인 위치의 식별 방법 및 그 장치 | |
CN1188933A (zh) | 程序设计中内存操作错误的识别方法 | |
US20130152053A1 (en) | Computer memory access monitoring and error checking | |
CN113778838A (zh) | 二进制程序动态污点分析方法及装置 | |
CN102708054A (zh) | 二进制程序循环写内存安全漏洞的检测方法 | |
US20170192878A1 (en) | Separating Test Coverage In Software Processes Using Shared Memory | |
Zhu et al. | Dytaint: The implementation of a novel lightweight 3-state dynamic taint analysis framework for x86 binary programs |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20200519 Termination date: 20210824 |