CN111488579B - 漏洞检测方法、装置、电子设备和计算机可读存储介质 - Google Patents

漏洞检测方法、装置、电子设备和计算机可读存储介质 Download PDF

Info

Publication number
CN111488579B
CN111488579B CN202010219712.8A CN202010219712A CN111488579B CN 111488579 B CN111488579 B CN 111488579B CN 202010219712 A CN202010219712 A CN 202010219712A CN 111488579 B CN111488579 B CN 111488579B
Authority
CN
China
Prior art keywords
function
target
parameter
objective function
initial
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.)
Active
Application number
CN202010219712.8A
Other languages
English (en)
Other versions
CN111488579A (zh
Inventor
刘穆清
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Tencent Technology Shenzhen Co Ltd
Original Assignee
Tencent Technology Shenzhen Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Tencent Technology Shenzhen Co Ltd filed Critical Tencent Technology Shenzhen Co Ltd
Priority to CN202010219712.8A priority Critical patent/CN111488579B/zh
Publication of CN111488579A publication Critical patent/CN111488579A/zh
Application granted granted Critical
Publication of CN111488579B publication Critical patent/CN111488579B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/57Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
    • G06F21/577Assessing vulnerabilities and evaluating computer system security
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

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)
  • Stored Programmes (AREA)

Abstract

本公开提供一种漏洞检测方法、装置以及电子设备和计算机可读存储介质,该方法包括:对目标二进制代码进行静态分析以获得分析结果,所述分析结果包括控制依赖图、函数调用图和控制流图;获取目标函数列表,所述目标函数列表包括初始目标函数;基于所述控制依赖图、所述函数调用图和所述控制流图,通过等价分析确定与所述初始目标函数等价的目标函数;将与所述初始目标函数等价的目标函数加入所述目标函数列表;对所述目标函数列表中的目标函数进行二进制漏洞检测。本公开实施例提供的技术方案针对大规模的代码能够准确的识别代码中的安全问题。

Description

漏洞检测方法、装置、电子设备和计算机可读存储介质
技术领域
本公开涉及计算机与互联网技术领域,尤其涉及一种漏洞检测方法、装置、电子设备和计算机可读存储介质。
背景技术
代码漏洞是在软件开发过程中对代码编辑时有意或无意产生的代码缺陷。代码漏洞的存在会威胁开发出的软件的安全。因此,需要对代码漏洞进行检测,以保证相应软件的稳定运行。
从漏洞挖掘对象来分,软件的漏洞挖掘可以分为两类:一类是针对源代码的漏洞挖掘;另一类是针对二进制代码的漏洞挖掘。源代码漏洞挖掘的特点是有丰富、完备的语义信息。所以,针对源代码的漏洞挖掘相对比较容易。
不过,源代码不是二进制代码,源代码层次的安全不代表二进制代码的安全,两者之间的对应性无从验证;比如,源代码中不存在编译、链接过程中引入的漏洞。另一方面,由于商业利益和软件产权保护等问题,很多时候安全检测工作中并不能拿到软件源代码,而只能针对二进制代码进行漏洞挖掘。所以,研究二进制代码的漏洞挖掘具有十分重要的意义。
因此,一种可以对二进制代码进行准确、高效的漏洞检测的方法对软件的漏洞挖掘来说至关重要。
需要说明的是,在上述背景技术部分公开的信息仅用于加强对本公开的背景的理解,因此可以包括不构成对本领域普通技术人员已知的现有技术的信息。
发明内容
本公开实施例提供一种漏洞检测方法、装置、电子设备和计算机可读存储介质,能够对目标二进制代码精准、高效地进行漏洞检测。
本公开的其他特性和优点将通过下面的详细描述变得显然,或部分地通过本公开的实践而习得。
本公开实施例提出一种漏洞检测方法,该方法包括:对目标二进制代码进行静态分析以获得分析结果,所述分析结果包括控制依赖图和函数调用图、控制流图;获取目标函数列表,所述目标函数列表包括初始目标函数;基于所述控制依赖图、所述函数调用图和所述控制流图,通过等价分析确定与所述初始目标函数等价的目标函数,将与所述初始目标函数等价的目标函数加入所述目标函数列表;对所述目标函数列表中的目标函数进行二进制漏洞检测。
本公开实施例提供了一种漏洞检测方法装置,所述装置包括:静态分析模块、初始目标函数获取模块、等价分析模块、目标函数加入模块以及漏洞检测模块。
其中,所述静态分析模块配置为对目标二进制代码进行静态分析以获得分析结果,所述分析结果包括控制依赖图、函数调用图和控制流图。所述初始目标函数获取模块配置为获取目标函数列表,所述目标函数列表包括初始目标函数。所述等价分析模块配置为基于所述控制依赖图、所述函数调用图和所述控制流图,通过等价分析确定与所述初始目标函数等价的目标函数。所述目标函数加入模块配置为将与所述初始目标函数等价的目标函数加入所述目标函数列表。所述漏洞检测模块配置为对所述目标函数列表中的目标函数进行二进制漏洞检测。
在一些实施例中,所述初始目标函数包括第一目标参数。其中,所述等价分析模块可以包括:调用子模块、等价分析子模块、候选等价函数确定子模块以及调用信息确定子单元。
其中,所述调用子模块配置为根据所述函数调用图确定调用所述初始目标函数的第一函数。所述等价分析子模块配置为根据所述控制流图对所述第一函数的形式参数与所述第一目标参数进行等价分析。所述候选等价函数确定子模块配置为若所述第一函数存在与所述第一目标参数等价的形式参数,则所述第一函数是所述初始目标函数的候选等价函数。所述调用信息确定子单元可以配置为根据所述候选等价函数中初始目标函数的调用信息确定所述目标函数。
在一些实施例中,所述候选等价函数确定子模块可以包括:形式参数确定单元和参数等价确定单元。
其中,所述形式参数确定单元配置为若所述第一函数存在与所述第一目标参数全等的形式参数,且所述形式参数后支配所述第一目标参数。所述参数等价确定单元配置为则所述形式参数与所述第一目标参数等价。
在一些实施例中,所述分析结果为静态单赋值中间语言下的分析结果。其中,所述形式参数确定单元可以包括:操作符确定子单元、操作数确定子单元以及全等判断子单元。
其中,所述操作符确定子单元配置为在所述静态单赋值中间语言下,若所述第一函数的形式参数对应的操作符与所述第一目标参数对应的操作符相同。所述操作数确定子单元配置为并且所述第一函数的形式参数对应的操作数与所述第一目标参数对应的操作数全等或者相同。所述全等判断子单元配置为则所述第一函数的形式参数与所述第一目标参数全等。
在一些实施例中,所述形式参数确定单元还可以包括:数据流分析子单元和后支配确定子单元。
其中,所述数据流分析子单元配置为对所述控制流图中的指令进行数据流分析。所述后支配确定子单元配置为若从所述第一函数的第一条指令到达所述第一目标参数对应指令的分支均经过所述形式参数对应指令,则所述形式参数后支配所述第一目标参数。
在一些实施例中,所述等价分析模块还可以包括:调用位置确定子模块、分支依赖集合确定子模块以及并集确定子模块。
其中,所述调用位置确定子模块配置为根据所述函数调用图确定所述候选等价函数中调用所述初始目标函数的位置。所述分支依赖集合配置为根据所述控制依赖图确定各个调用所述初始目标函数的位置的分支依赖集合。所述并集确定子模块配置为若所述分支依赖集合的并集为所述候选等价函数中各分支依赖集合的全集,则所述候选等价函数与所述初始目标函数等价。
在一些实施例中,所述初始目标函数为内存释放函数,所述内存释放函数释放第二目标参数。
在一些实施例中,所述漏洞检测模块可以包括:释放重引用漏洞检测子模块。
其中,所述释放重引用漏洞检测子模块配置为若所述内存释放函数释放所述第二目标参数的释放点后支配所述第二目标参数的调用点,则所述目标二进制代码存在释放重引用UAF漏洞。
在一些实施例中,所述初始目标函数为输入接受函数,所述输入接受函数接受第三目标参数。
在一些实施例中,所述漏洞检测模块可以包括:污点分析子模块和命令注入漏洞检测子模块。
其中,所述污点分析子模块配置为对所述第三目标参数进行污点分析。所述命令注入口袋检测子模块配置为若目标命令执行函数被所述第三目标参数污染,则所述目标二进制代码存在命令注入漏洞。
在一些实施例中,所述初始目标函数为内存分配函数。
在一些实施例中,所述漏洞检测模块可以包括:指针大小获取子模块、指针大小追踪子模块以及堆溢出漏洞检测子模块。
其中,所述指针大小获取子模块配置为获取所述内存分配函数返回的目标内存指针以及所述目标内存指针的大小。所述指针大小追踪子模块配置为根据所述控制流图对所述目标内存指针进行流分析,确定所述目标内存指针在各个指令中的内存大小。所述堆溢出漏洞检测子模块配置为若存在内存大小为负数的目标内存指针,则所述目标二进制代码存在堆溢出漏洞。
本公开实施例提出了一种电子设备,该电子设备包括:一个或多个处理器;存储装置,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现上述任一项所述的漏洞检测方法。
本公开实施例提出一种计算机可读存储介质,其上存储有计算机程序,所述程序被处理器执行时实现如上述任一项所述的漏洞检测方法。
本公开实施例提供的漏洞检测方法、装置及电子设备和计算机可读存储介质,通过等价分析从目标二进制代码中抽象出与初始目标函数等价的目标函数,并基于目标函数进行等价分析,提供了漏洞分析的效率,降低了漏洞分析的误报率。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性的,并不能限制本公开。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。下面描述的附图仅仅是本公开的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1示出了应用于本公开实施例的漏洞检测方法或漏洞检测装置的示例性系统架构的示意图。
图2是根据一示例性实施例示出的一种应用于漏洞检测装置的计算机系统的结构示意图。
图3是根据一示例性实施例示出的一种漏洞检测方法的流程图。
图4是图3中步骤S3在一示例性实施例中的流程图。
图5是图4中步骤S33在一示例性实施例中的流程图。
图6是图5中步骤S331在一示例性实施例中的流程图。
图7是图5中步骤S331在另一示例性实施例中的流程图。
图8是根据一示例性实施例示出的一种形式参数后支配第一目标参数的示意图。
图9是根据一示例性实施例示出的一种形式参数后支配第一目标参数的示意图。
图10是图3中步骤S3在一示例性实施例中的流程图。
图11是根据一示例性实施例示出的一种程序中分支依赖关系的示意图。
图12是根据一示例性实施例示出的一种漏洞检测方法的流程图。
图13是根据一示例性实施例示出的一种漏洞检测方法的流程图。
图14是根据一示例性实施例示出的一种漏洞检测方法的流程图。
图15是根据一示例性实施例示出的一种漏洞检测系统。
图16是根据一示例性实施例示出的一种漏洞检测装置的框图。
具体实施方式
现在将参考附图更全面地描述示例实施例。然而,示例实施例能够以多种形式实施,且不应被理解为限于在此阐述的实施例;相反,提供这些实施例使得本公开将全面和完整,并将示例实施例的构思全面地传达给本领域的技术人员。在图中相同的附图标记表示相同或类似的部分,因而将省略对它们的重复描述。
本公开所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多实施方式中。在下面的描述中,提供许多具体细节从而给出对本公开的实施方式的充分理解。然而,本领域技术人员将意识到,可以实践本公开的技术方案而省略特定细节中的一个或更多,或者可以采用其它的方法、组元、装置、步骤等。在其它情况下,不详细示出或描述公知方法、装置、实现或者操作以避免模糊本公开的各方面。
附图仅为本公开的示意性图解,图中相同的附图标记表示相同或类似的部分,因而将省略对它们的重复描述。附图中所示的一些方框图不一定必须与物理或逻辑上独立的实体相对应。可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。
附图中所示的流程图仅是示例性说明,不是必须包括所有的内容和步骤,也不是必须按所描述的顺序执行。例如,有的步骤还可以分解,而有的步骤可以合并或部分合并,因此实际执行的顺序有可能根据实际情况改变。
本说明书中,用语“一个”、“一”、“该”、“所述”和“至少一个”用以表示存在一个或多个要素/组成部分/等;用语“包含”、“包括”和“具有”用以表示开放式的包括在内的意思并且是指除了列出的要素/组成部分/等之外还可存在另外的要素/组成部分/等;用语“第一”、“第二”和“第三”等仅作为标记使用,不是对其对象的数量限制。
下面结合附图对本公开示例实施方式进行详细说明。
图1示出了可以应用于本公开实施例的漏洞检测方法或漏洞检测装置的示例性系统架构的示意图。
如图1所示,系统架构100可以包括设备101、102、103,网络104和服务器105。网络104用以在设备101、102、103和服务器105之间提供通信链路的介质。网络104可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。
用户可以使用设备101、102、103通过网络104与服务器105交互,以接收或发送消息等。其中,设备101、102、103可以是具有显示屏并且支持网页浏览的各种电子设备,包括但不限于智能手机、平板电脑、膝上型便携计算机、台式计算机、可穿戴设备、虚拟现实设备、智能家居等等。
服务器105可以是提供各种服务的服务器,例如对用户利用设备101、102、103所进行操作的装置提供支持的后台管理服务器。后台管理服务器可以对接收到的请求等数据进行分析等处理,并将处理结果反馈给设备。
服务器105可例如对目标二进制代码进行静态分析以获得分析结果,所述分析结果包括控制依赖图、函数调用图和控制流图;服务器105可例如获取目标函数列表,所述目标函数列表包括初始目标函数;服务器105可例如基于所述控制依赖图、所述函数调用图和所述控制流图,通过等价分析确定与所述初始目标函数等价的目标函数,将与所述初始目标函数等价的目标函数加入所述目标函数列表;服务器105可例如对所述目标函数列表中的目标函数进行二进制漏洞检测。
应该理解,图1中的设备、网络和服务器的数目仅仅是示意性的,服务器105可以是一个实体的服务器,还可以为多个服务器组成,根据实际需要,可以具有任意数目的设备、网络和服务器。
在一些实施例中,本公开实施例还可以由单个具有计算功能的设备完成,例如可以通过智能手机、平板电脑、膝上型便携计算机、台式计算机、可穿戴设备、虚拟现实设备、智能家居等设备完成本公开实施例提供的技术方案。
在一些实施例中,本公开实施例还可以通过云计算完成,例如通过云向用户提供本公开实施例提供的漏洞检测服务。
下面参考图2,其示出了适于用来实现本申请实施例的设备的计算机系统200的结构示意图。图2示出的设备仅仅是一个示例,不应对本申请实施例的功能和使用范围带来任何限制。
如图2所示,计算机系统200包括中央处理单元(CPU)201,其可以根据存储在只读存储器(ROM)202中的程序或者从储存部分208加载到随机访问存储器(RAM)203中的程序而执行各种适当的动作和处理。在RAM 203中,还存储有系统200操作所需的各种程序和数据。CPU 201、ROM 202以及RAM 203通过总线204彼此相连。输入/输出(I/O)接口205也连接至总线204。
以下部件连接至I/O接口205:包括键盘、鼠标等的输入部分206;包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的输出部分207;包括硬盘等的储存部分208;以及包括诸如LAN卡、调制解调器等的网络接口卡的通信部分209。通信部分209经由诸如因特网的网络执行通信处理。驱动器210也根据需要连接至I/O接口205。可拆卸介质211,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器210上,以便于从其上读出的计算机程序根据需要被安装入储存部分208。
特别地,根据本公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在计算机可读存储介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分209从网络上被下载和安装,和/或从可拆卸介质211被安装。在该计算机程序被中央处理单元(CPU)201执行时,执行本申请的系统中限定的上述功能。
需要说明的是,本申请所示的计算机可读存储介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本申请中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本申请中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读存储介质,该计算机可读存储介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读存储介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、RF等等,或者上述的任意合适的组合。
附图中的流程图和框图,图示了按照本申请各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
描述于本申请实施例中所涉及到的模块和/或子模块和/或单元和/或子单元可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的模块和/或子模块和/或单元和/或子单元也可以设置在处理器中,例如,可以描述为:一种处理器包括发送单元、获取单元、确定单元和第一处理单元。其中,这些模块和/或子模块和/或单元和/或子单元的名称在某种情况下并不构成对该模块和/或子模块和/或单元和/或子单元本身的限定。
作为另一方面,本申请还提供了一种计算机可读存储介质,该计算机可读存储介质可以是上述实施例中描述的设备中所包含的;也可以是单独存在,而未装配入该设备中。上述计算机可读存储介质承载有一个或者多个程序,当上述一个或者多个程序被一个该设备执行时,使得该设备可实现功能包括:对目标二进制代码进行静态分析以获得分析结果,所述分析结果包括控制依赖图、函数调用图和控制流图;获取目标函数列表,所述目标函数列表包括初始目标函数;基于所述控制依赖图、所述函数调用图和所述控制流图,通过等价分析确定与所述初始目标函数等价的目标函数,将与所述初始目标函数等价的目标函数加入所述目标函数列表;对所述目标函数列表中的目标函数进行二进制漏洞检测。
需要理解的是,在本公开附图中的任何元素数量均用于示例而非限制,以及任何命名都仅用于区分,而不具有任何限制含义。为了方便理解,下面对本公开实施例中涉及的名词进行解释。
静态分析技术:一种在不运行程序代码的情况下,可以通过词法分析、语法分析、控制流分析、数据流分析等技术对二进制代码进行扫描,以验证二进制代码是否满足规范性、安全性、可靠性、可维护性等指标的一种代码分析技术。
函数调用图:可以用来表示程序代码中各个函数之间的调用关系。
控制流图(Control Flow Graph,CFG):静态分析产生的一种有向图,该图中的节点表示基本代码块,节点间的有向边代表控制流路径,反向边表示可能存在的循环。
控制依赖图:一种可以用于表示基本代码块的分支依赖关系的流程图。
基本代码块:是指程序顺序执行的语句序列,其中只有一个入口和一个出口,入口就是其中的第一个语句,出口就是其中的最后一个语句
分支依赖关系:从一个基本块流向另一个基本块需要满足的分支条件。例如,假设从基本块A走向基本块B需要满足条件a、条件b以及条件c均为真,那么基本块B相对于基本块A的分支依赖关系可以是{a:真,b:真,c:真}。
数据流分析技术:通过对控制流图进行遍历,对代码在不同路径上的执行过程中,数据的赋值和存储、内存的读和写过程进行分析。
数据流图:数据流分析产生的结果,记录了代码在不同路径上的执行过程中,数据的赋值和存储、内存的读和写过程。
等价分析技术(Global Value Numbering,GVN):一种推断程序中变量等价关系的方法。常用于编译器中,用于程序优化。
中间表示(Intermediate Representation,IR):一般来说,通常将编译器分为前端和后端。其中,前端会对所输入的程序进行词法分析、语法分析、语义分析,然后生成中间表达形式,也就是IR,后端会对IR进行优化,然后生成目标代码。
静态单赋值中间表示(Static Single Assignment IntermediateRepresentation,SSA IR):IR的某一种特殊形式,在静态单赋值中间表示中每一个变量仅被定义一次。
释放后重用(Use-After-Free,UAF)漏洞:若程序对已释放的数据仍进行操作,则该程序存在UAF漏洞。
命令注入漏洞:若程序中的命令执行函数(例如system(系统函数)、execve(执行文件函数)等)会被输入接受函数(例如read(读入函数)函数)读入的污点数据污染,则该程序存在命令注入漏洞。
污点数据:某指定数据以及与该指定数据具有关联关系的共享数据。
污点数据规则:用于判定代码中的污点数据,可根据代码漏洞的特征设置相应的污点数据规则。
堆溢出漏洞:若程序中的内存分配函数为目标值指针分配的地址发生溢出,可以认为该代码存在堆溢出漏洞。
相关技术中,对二进制代码的漏洞检测主要分为两类:
一类是以符号执行技术为代表的动态检测:通过符号执行,从程序入口开始探索所有的可能路径,利用约束求解技术求解出路径约束,并在符号执行过程中,完成漏洞检测问题。另一类则是利用程序静态分析技术,通过对分析程序的控制流,数据流以及数据依赖关系等,对程序是否出现漏洞做出判断。
其中,符号执行技术受限于符号执行本身,效率方面通常无法接受。一般来说,由于符号执行需要在执行过程中对每一个分支进行约束求解,而约束求解器对于非线性约束的求解效率低下,导致整体执行效率低下。另一方面,由于在每一个分支处,符号执行引擎都需要对两个不同路径进行探索,导致探索空间指数级别扩大,使得执行效率低下。
静态分析技术,通常以静态数据流为基础,以分析指针属性在过程间的传播。但由于程序分析过程中不仅需要分析当前函数,还需要将当前函数调用的函数内嵌入当前函数进行分析,导致分析开销巨大,导致误报、错报的产生,尤其难以应用于大规模的程序分析中(即被分析函数调用的函数越多,被分析函数的规模越大,产生的分析消耗越大,进而产生的误报越多)。
本公开实施例提供了一种分析资源消耗较少、误报率较低的漏洞检测方法。
图3是根据一示例性实施例示出的一种漏洞检测方法的流程图。本公开实施例提供的方法可以由任意具备计算处理能力的电子设备处理,例如上述图1实施例中的服务器105和/或设备102、103,在下面的实施例中,以服务器105为执行主体为例进行举例说明,但本公开并不限定于此。
参照图3,本公开实施例提供的漏洞检测方法可以包括以下步骤。
在步骤S1中,对目标二进制代码进行静态分析以获得分析结果,所述分析结果包括控制依赖图、函数调用图和控制流图。
在一些实施例中,目标二进制代码可以由目标编译器对目标源程序编译后获得。
在一些实施例中,可以通过目标二进制引擎对目标二进制代码进行静态程序分析,以获得目标二进制代码的控制依赖图、函数调用图以及控制流图。其中,目标二进制引擎可以是IDA Pro(Interactive Disassembler Professional,交互式反汇编器专业版)、Binary Ninja(逆向平台)等,本公开对此不作限制。
一般来说,对目标二进制代码进行静态分析,可以将目标二进制代码翻译成一种中间表示,并获得中间表示下的分析结果(例如控制依赖图、函数调用图或者控制流图),该中间表示可以是SSA IR;当然也可以将目标二进制代码反汇编成汇编语言,以获得汇编语言下的分析结果(例如控制依赖图、函数调用图以及控制流图)。可以理解的是,通过其他语言下实现本本公开提供的漏洞检测方法也在本公开的保护范围内,本公开对此不作限制。
为了便于静态分析,通常会将目标二进制代码翻译为中间表示(例如,静态单赋值中间表示),并对翻译获得的中间表示进行程序优化,例如常量折叠(constant folding)、常量传播(constant propagation)、强度削减(strength reduction)以及死代码删除(dead code elimination)等,本公开对此不作限制。
在本公开中,将以把目标二进制代码翻译成SSA IR为例对实施例进行解释,但本公开并不限于此。
在步骤S2中,获取目标函数列表,所述目标函数列表包括初始目标函数。
在一些实施例中,可以根据不同的漏洞模式确定不同的目标函数列表,目标函数列表中可以包括该漏洞模式需要追踪、定位的目标函数,例如对于UAF漏洞来说需要追踪内存释放函数,对于命令注入漏洞来说需要追踪输入接受函数,对于堆溢出漏洞来说需要追踪内存分配函数。
在一些实施例中,目标函数列表不仅可以包括本领域技术人员已知功能和名称的初始目标函数(例如free(释放函数)、malloc(memory allocation,动态内存分配)等),还可以包括与初始目标函数等价的函数,其中与初始目标函数等价的函数可以是与初始目标函数功能相同的自定义函数。
例如:对于下列free_version函数来说,它可以实现与函数free相同的功能,即释放参数x,由此便可以认为函数free_version与函数free等价。
int free_version(x)//定义函数free_version
{
free(x);//释放函数x
}。
可以理解的是,目标函数列表中可以包括多个功能相同而名称不同的初始目标函数。
对于UAF漏洞来说,目标函数列表中应该包括目标二进制代码中的内存释放函数,该内存释放函数可以是free、delete(删除函数)、realloc(再分配函数)或者SSL_free等本领域技术人员已知名称和功能的函数,也可以是那些可以实现内存释放功能但名称未知的自定义函数。其中,本领域技术人员已知名称和功能的函数(例如free、delete、realloc)就可以是初始目标函数。
对于堆溢出漏洞,目标函数列表中可以包括目标二进制代码中的内存分配函数,该内存分配函数可以是malloc,realloc等本领域技术人员已知名称和功能的函数,也可以是那些可以实现内存分配功能但名称未知的自定义函数。
对于命令注入漏洞,目标函数列表中可以包括目标二进制代码中的输入接受函数,该输入接受函数可以是read,gets(获取函数)等本领域技术人员已知名称和功能的函数,也可以是那些可以实现输入接受功能但名称未知的自定义函数。
应该理解的是,本公开不仅可以完成对UAF、堆溢出以及命令注入漏洞的检测,还可以完成其他需要对指定功能的函数进行定位的漏洞的检测,本公开对此不作限制。
为方便说明,本公开使用源程序代码中的函数名称对实施例进行解释。但应该理解的是,由于本公开实施例是基于中间语言下或汇编语言下的分析结果进行分析,所以在实际操作中将会以中间语言或汇编语言下的函数名称为实际操作对象。
在步骤S3中,基于所述控制依赖图、所述函数调用图和所述控制流图,通过等价分析确定与所述初始目标函数等价的目标函数,将与所述初始目标函数等价的目标函数加入所述目标函数列表。
在一些实施例中,目标二进制代码中可以包括一些已知名称和功能的初始目标函数,如上述free、delete等,也可以包括一些自定义的函数。本实施例可以通过上述控制依赖图、函数调用图以及控制流图对目标二进制代码中的函数进行分析,以确定与初始目标函数功能等价的自定义函数。
在一些实施例中,可以首先根据函数调用图确定调用初始目标函数的第一函数,该初始目标函数可以包括第一目标参数,该第一目标参数可以是初始目标函数的形参;通过控制流图对第一目标参数和第一函数的形式参数进行等价分析;若第一函数中包括与第一目标参数等价的形式参数,则可以认为第一函数是候选等价参数;根据函数调用图确定候选等价函数中调用初始目标函数的位置;根据控制依赖图确定各个调用位置处的分支依赖集合;若各个分支依赖集合的并集为候选等价函数中条件依赖集合的全集,则候选等价函数与初始目标函数等价。
其中,条件依赖集合的全集指的是候选等价函数的所有分支对应条件的集合。例如,假设候选等价函数包括条件1(包括真和假两条分支)和条件2(包括真和假两条分支),那么各个候选等价函数各个分支对应的条件依赖集合可以为{条件1:真,条件2:真}、{条件1:真,条件2:假}、{条件1:假,条件2:真}、{条件1:假,条件2:假},那么候选等价集合的条件依赖集合的全集为{条件1:真|假,条件2:真|假}。
在一些实施例中,若第一函数与初始目标函数等价,则将第一函数加入目标函数列表,然后将目标函数列表中的所有的函数作为初始目标函数,并继续通过控制依赖图、函数调用图和控制流图确定与初始目标函数等价的函数,直至目标二进制代码中不存在与初始目标函数等价的函数。
在步骤S4中,对所述目标函数列表中的目标函数进行二进制漏洞检测。
在一些实施例中,可以根据漏洞模式下的漏洞检测规则对目标函数列表中的目标函数进行二进制漏洞检测。
例如,UAF漏洞检测规则可以是:在目标程序中,若内存释放函数释放目标参数的释放点后支配该目标参数的调用点,则该目标程序存在UAF漏洞。
在静态单赋值中间语言下,若从某函数的第一条指令到达目标参数调用点的分支均经过该目标参数释放点对应的指令,则可以认为该目标参数的释放点后支配该目标参数的调用点。
可以理解的是,由于静态单赋值中间语言的特性为:一个变量仅会被赋值一次,也就是说一旦某个变量被赋值之后将不会再被定义。因此,一旦程序中的某个变量被释放后再被调用,即可以认为该程序存在UAF漏洞。
再例如,命令注入漏洞检测规则可以是:若输入接受函数(例如read函数)函数读入的污点数据将命令执行函数(例如system、execve等)污染,则可以认为目标程序包括命令注入漏洞。
本实施例提供的技术方案,通过静态分析技术确定了与初始目标函数等价的目标函数,并基于与初始目标函数等价的目标函数进行漏洞分析。在漏洞分析过程中,该方法一方面可以对目标函数进行抽象抽象化处理(即只关心该目标函数可以实现的功能,对内部结构不作分析),相比于将目标函数内嵌至待分析函数中进行分析,本实施例提供的技术方案更能适应大规模函数的漏洞分析;另一方面,本实施例提供的技术方案根据初始目标函数确定等价的目标函数,扩展了一般过程漏洞检测技术的检测范围,在能保证检测效率的前提下,提升了检测范围和精确了分析结果。
图4是图3中步骤S3在一示例性实施例中的流程图。
在一些实施例中,初始目标函数包括第一目标参数,其中第一目标参数可以是初始目标函数的形式参数。例如,对于初始目标函数free(x)来说,x就是第一目标参数。另外,若将与初始目标函数free(x)等价的目标函数作为初始目标函数处理的话,则该等价函数的第一目标参数可以是与初始目标函数的第一目标参数等价的参数。
可以理解的是,一个目标函数可以与多个初始目标函数等价,例如对于下列目标函数free_version1来说,free和delete都是初始目标函数,t1与x等价,t2与y等价,所以函数free_version1既与函数free(t1)等价也与函数delete(t2)等价,其中t1是free(t1)的第一目标参数,t2是delete(t2)的第一目标参数,所以x和y应该是函数free_version1的第一目标参数。
int free_version1(x,y,z)//定义函数free_version1
{
t1=x;
t2=y;
free(t1); //释放函数t1
delete(t2); //释放函数t2
}。
参考图4,上述步骤S3可以包括以下步骤。
在步骤S31中,根据所述函数调用图确定调用所述初始目标函数的第一函数。
应该理解的是,目标函数列表中的初始目标函数可以不止一个,而调用同一初始目标函数的第一函数也可以不止一个。
在步骤S32中,根据所述控制流图对所述第一函数的形式参数与所述第一目标参数进行等价分析。
在一些实施例中,上述控制流图可以是静态单赋值中间语言下的控制流图,其中静态单赋值中间语言下的控制流图中的参量只会被赋值一次。
一般来说,中间语言下的控制流图通常已完成例如常量折叠、常量传播、强度削减以及死代码删除等优化操作。
在一些实施例中,在静态单赋值中间语言下,第一函数的形式参数对应的操作符(例如:加、减、乘、除、和、或、非等运算符)与第一目标参数对应的操作符相同,且第一函数的形式参数对应的操作数与第一目标参数对应的操作数(一种操作对象)全等或者相同,且上述形式参数后支配第一目标参数(即若第一目标参数被执行,上述形式参数也必然已被执行),则可以认为该形式参数与第一目标参数全等
在一些实施例中,若上述形式参数与第一目标参数全等,且上述形式参数后支配第一目标参数,则该形式参数与第一目标参数等价。
一般来说,形式参数后支配第一目标参数可以指的是:若从第一函数的第一条指令到达第一目标参数对应指令的分支均经过该形式参数对应指令,则该形式参数后支配第一目标参数。
在步骤S33中,若所述第一函数存在与所述第一目标参数等价的形式参数,则所述第一函数是所述初始目标函数的候选等价函数,并根据所述候选等价函数中初始目标函数的调用信息确定所述目标函数。
可以理解的是,如果第一函数包括与第一目标参数等价的形式参数,则第一函数可能实现与初始目标函数相同的功能。例如,假设第一函数中只存在一条分支语句(例如第一函数中不包括条件判断语句),那么如果该分支语句中调用了初始目标函数并且第一函数包括与初始目标函数的第一目标参数等价的形式参数,那么该第一函数就可以实现与初始目标函数相同的功能。
本实施例提供的技术方案,通过对初始目标函数的第一目标参数进行等价分析,准确的确定了与初始目标函数等价的目标函数,该目标函数可以实现与初始目标函数相同的功能。
图5是图4中步骤S33在一示例性实施例中的流程图。
在一些实施例中,若第一函数中包括多条分支语句,那么需要对第一函数的各个分支进行分析才能确定第一函数与初始目标函数是否等价。
在一些实施例中,第一函数可以包括多条分支语句。如果当第一函数只在第一分支中调用了初始目标函数并且第一函数包括该初始目标函数的第一目标参数时,就认为第一函数与初始目标函数等价,如此便可能会由于该第一分支不被执行而产生漏洞错报的情况。
因此,如果根据图4所示方法对包括多个分支的第一函数进行等价判断,则有可能会因为程序执行过程中并不经过调用目标函数的分支,而导致漏洞检测过程中错报等情况。
因此,本实施例提供了以下漏洞检测技术,可以减少错报、误报。
参考图5,上述步骤S33可以包括以下步骤。
在步骤S331中,若所述第一函数存在与所述第一目标参数全等的形式参数,且所述形式参数后支配所述第一目标参数。
在步骤S332中,则所述形式参数与所述第一目标参数等价。
在一些实施例中,若第一函数的形式参数对应的(例如:加、减、乘、除、和、或、非等运算符)与第一目标参数对应的操作符相同,且第一函数的形式参数对应的操作数与第一目标参数对应的操作数(一种操作对象)全等或者相同,且上述形式参数后支配第一目标参数(即若第一目标参数被执行,上述形式参数也必然已被执行),则可以认为该形式参数与第一目标参数全等。
一般来说,如果从第一函数的第一条指令到达第一目标参数对应指令的分支均经过形式参数对应指令,则可以认为形式参数后支配第一目标参数。
本实施例提供的技术方案,在判断第一函数与初始目标函数等价的过程中确保了第一函数中各个分支都会调用初始目标函数,并且第一函数中包括与初始目标函数对应的第一目标参数等价的形式参数。如此,通过参数的等价判断以及支配关系的分析,可以保证无论执行第一函数的哪一条分支均可以实现与初始目标函数相同的功能。
上述实施例提供的技术方案,可以保证在漏洞检测过程中无论执行第一函数的哪条分支,第一函数均可以实现初始目标函数等价的功能,基于该第一函数进行漏洞检测,可以提高漏洞检测的准确性,减少多报、错报等情况。
图6是图5中步骤S331在一示例性实施例中的流程图。
在一些实施例中,目标二进制代码的分析结果可以是静态单赋值中间语言下的分析结果,也就是说分析结果中的变量只会被赋值一次。
参考图6,上述步骤S331可以包括以下步骤。
在步骤S3311中,在所述静态单赋值中间语言下,若所述第一函数的形式参数对应的操作符与所述第一目标参数对应的操作符相同。
在步骤S3312中,并且所述第一函数的形式参数对应的操作数与所述第一目标参数对应的操作数全等或者相同。
在步骤S3313中,则所述第一函数的形式参数与所述第一目标参数全等。
由于目标二进制代码的分析结果包括静态单赋值语言下的控制流图,所以同一变量只会被赋值一次。所以一旦第一函数的形式参数与第一目标参数的操作符以及操作数均相等,则可以确认该形式参数与第一目标参数全等。
图7是图5中步骤S331在另一示例性实施例中的流程图。
参考图7,上述步骤S331可以包括以下步骤。
在步骤S3314中,对所述控制流图中的指令进行数据流分析。
在步骤S3315中,若从所述第一函数的第一条指令到达所述第一目标参数对应指令的分支均经过所述形式参数对应指令,则所述形式参数后支配所述第一目标参数。
如图8所示,假设语句1是第一函数的第一条指令,语句4是第一目标参数所在指令,那么从语句1到语句4无论经过那一条分支均需要经过第一函数的形式参数所在的语句2,因此可以认为该形式参数后支配所述第一目标参数。
在一些实施例中,目标函数列表中的初始目标函数可以不止一个,所述第一目标参数也可以不止一个(多个初始目标函数可以对应多个第一目标参数,单个初始目标函数也可以对应不止一个第一目标参数)。
如图9所示,假设目标函数列表中包括两个初始目标函数,每个初始目标函数包括一个第一目标参数(例如第一目标参数1和第一目标参数2),由于从第一函数的第一条语句(语句1)到第一目标参数所在语句(语句4和语句5)必然经过形式参数所在语句(即语句2),所以可以认为该形式参数后支配第一目标参数。
图10是图3中步骤S3在一示例性实施例中的流程图。
参考图3,上述步骤S3可以包括以下步骤。
在步骤S34中,根据所述函数调用图确定所述候选等价函数中调用所述初始目标函数的位置。
在步骤S35中,根据所述控制依赖图确定各个调用所述初始目标函数的位置的分支依赖集合。
在一些实施例中,该分支依赖集合中可以包括从第一函数第一条指令开始到调用位置所需要的所有条件的集合。
如图11所示第一函数,语句4对应的分支依赖集合可以为{条件1:假,条件2:真|假},语句6对应的分支依赖集合可以为{条件1:真,条件2:假},语句7对应的分支依赖集合可以为{条件1:真,条件2:真}。
在步骤S36中,若所述分支依赖集合的并集为所述候选等价函数中各分支依赖集合的全集,则所述候选等价函数与所述初始目标函数等价。
在一些实施例中,由于初始目标函数可能为多个,所以初始目标函数对应的分支依赖集合也可能为多个。假设初始目标函数在图11中的语句4、语句6以及语句7位置处,则各个初始目标函数的分支依赖集合分别为:{条件1:假,条件2:真|假}、{条件1:真,条件2:假}、{条件1:真,条件2:真},对各个分支依赖集合求并集为:{条件1:真|假,条件2:真|假},其中,{条件1:真|假,条件2:真|假}正好是候选等价函数中各分支依赖集合的全集。也就是说,在候选等价函数的各个分支中均调用了初始目标函数并且候选等价函数中包括与初始目标函数的第一目标参数等价的形式参数。
在一些实施例中,可以根据控制依赖图确定各个初始目标函数被调用位置处的分支依赖集合。然后获取各个调用位置对应的分支依赖集合的并集,若各个分支依赖集合的并集为候选等价函数中条件依赖集合的全集,则候选等价函数与初始目标函数等价。
本实施例提供的技术方案,可以确保与初始目标函数等价的第一函数中的各个分支均可以实现初始目标函数对应的功能。
图12是根据一示例性实施例示出的一种漏洞检测方法的流程图。
在软件的漏洞检测中,当数据释放后还会被引用时,可以认为该程序存在UAF漏洞。本实施例提供的漏洞检测方法可以完成对UAF漏洞的检测。
在一些实施例中,若初始目标函数为内存释放函数,内存释放函数可以释放第二目标参数,第二目标参数可以是内存释放函数释放的参数。
参考图12,上述漏洞检测方法可以包括以下步骤。
在步骤S6中,确定内存释放函数在目标二进制代码中的位置。
在步骤S7中,若所述内存释放函数释放所述第二目标参数的释放点后支配所述第二目标参数的调用点,则所述目标二进制代码存在UAF漏洞。
在一些实施例中,可以根据数据流分析对控制流图进行处理,以确定第二目标参数在释放点(对应于目标函数列表中各个函数所在位置)被释放后是否还会被调用,若该第二目标参数在释放点之后还会被使用那么该目标二进制代码存在UAF漏洞。
本实施例提供的技术方案,在进行UAF漏洞检测时,可以将内存释放函数以及与内存释放函数等价的函数从目标二进制代码中按照功能抽象出来,在漏洞分析过程中只需考虑各个目标函数的功能,无需对函数内部情况进行分析,极大地节约了分析开销,提高了漏洞分析效率以及漏洞检测的准确率。
图13是根据一示例性实施例示出的一种漏洞检测方法的流程图。
在软件的漏洞检测中,当命令执行函数(例如system、execve等)可能被输入接受函数从外界获取的污点数据污染时,则可以认为该程序存在命令注入漏洞。
本公开实施例提供的漏洞检测方法可以完成对命令注入漏洞的检测。
在一些实施例中,初始目标函数可以为输入接受函数(例如,read、gets等),输入接受函数可以从外界接受第三目标参数。
参考图13,上述漏洞检测方法可以包括以下步骤。
在步骤S8中,对所述第三目标参数进行污点分析。
在步骤S9中,若目标命令执行函数被所述第三目标参数污染,则所述目标二进制代码存在命令注入漏洞。
在一些实施例中,可以通过数据流分析技术对输入接受函数从外界接受的第三目标参数进行污点分析,若目标执行命令被该第三目标参数污染,则可以认为该程序存在命令注入漏洞。
本实施例提供的技术方案,在进行命令注入漏洞检测时,可以将输入接受函数以及与输入接受函数等价的函数从目标二进制代码中按照功能抽象出来,在漏洞分析过程中只需考虑各个目标函数的功能,无需对函数内部情况进行分析,极大地节约了分析开销,提高了漏洞分析效率以及漏洞检测的准确率。
图14是根据一示例性实施例示出的一种漏洞检测方法的流程图。
在软件的漏洞检测中,当内存分配函数为目标值指针分配的地址发生溢出之后,可以认为该程序存在堆溢出漏洞。
本公开实施例提供的漏洞检测方法可以完成对堆溢出漏洞的检测。
在一些实施例中,若初始目标函数为内存分配函数,上述漏洞检测方法可以包括以下步骤。
在步骤S10中,获取所述内存分配函数返回的目标内存指针以及所述目标内存指针的大小。
在一些实施例中,所述目标函数函数可以为malloc、realloc等内存分配函数,该内存分配函数可以为目标内存指针分配目标大小的内存。
在步骤S12中,根据所述控制流图对所述目标内存指针进行流分析,确定所述目标内存指针在各个指令中的内存大小。
在一些实施例中,可以通过数据流分析技术分析在被分配内存之后的指针的大小。
在步骤S13中,若存在内存大小为负数的目标内存指针,则所述目标二进制代码存在堆溢出漏洞。
本实施例提供的技术方案,在进行堆溢出漏洞检测时,可以将内存分配函数以及与内存分配等价的函数从目标二进制代码中按照功能抽象出来,在漏洞分析过程中只需考虑各个目标函数的功能,无需对函数内部情况进行分析,极大地节约了分析开销,提高了漏洞分析效率以及漏洞检测的准确率。
图15是根据一示例性实施例示出的一种漏洞检测系统。如图15所示,该漏洞检测系统可以包括:中间表示翻译模块151、静态分析模块152、目标函数检测模块153以及漏洞检测模块154。
其中,中间表示翻译模块151可以用于将目标二进制代码翻译为中间表示。静态分析模块152可以用于根据中间表示下的目标二进制代码获得目标二进制代码的控制依赖图、函数调用图以及控制流图。目标函数检测模块153可以用于根据中间语言下的控制依赖图、函数调用图以及控制流图确定与初始目标函数等价的目标函数,并生产目标函数列表。漏洞检测模块154可以用于根据目标函数列表中的目标函数进行漏洞检测。
本实施例提供的漏洞检测系统,通过静态分析技术确定了与初始目标函数等价的目标函数,并基于与初始目标函数等价的目标函数进行漏洞分析。在漏洞分析过程中,该方法一方面对目标函数进行抽象抽象化处理(即只关心该目标函数可以实现的功能,对内部结构不作分析),相比于将目标函数内嵌至待分析函数中进行分析,本实施例提供的技术方案更能适应大规模函数的漏洞分析;另一方面,本实施例提供的技术方案根据初始目标函数确定等价的目标函数,扩展了一般过程漏洞检测技术的检测范围,在能保证扫描效率的前提下,提升了扫描范围和精确了分析结果。
图16是根据一示例性实施例示出的一种漏洞检测装置的框图。参照图16,本公开实施例提供的漏洞检测装置1600可以包括:静态分析模块1601、初始目标函数获取模块1602、等价分析模块1603、目标函数加入模块1604以漏洞检测模块1605。
其中,所述静态分析模块1601可以配置为对目标二进制代码进行静态分析以获得分析结果,所述分析结果包括控制依赖图、函数调用图和控制流图。所述初始目标函数获取模块1602可以配置为获取目标函数列表,所述目标函数列表包括初始目标函数。所述等价分析模块1603可以配置为基于所述控制依赖图、所述函数调用图和所述控制流图,通过等价分析确定与所述初始目标函数等价的目标函数。所述目标函数加入模块1604可以配置为将与所述初始目标函数等价的目标函数加入所述目标函数列表。所述漏洞检测模块1605可以配置为对所述目标函数列表中的目标函数进行二进制漏洞检测。
在一些实施例中,所述初始目标函数包括第一目标参数。其中,所述等价分析模块1603可以包括:调用子模块、等价分析子模块、候选等价函数确定子模块以及调用信息确定子单元。
其中,所述调用子模块可以配置为根据所述函数调用图确定调用所述初始目标函数的第一函数。所述等价分析子模块可以配置为根据所述控制流图对所述第一函数的形式参数与所述第一目标参数进行等价分析。所述候选等价函数确定子模块可以配置为若所述第一函数存在与所述第一目标参数等价的形式参数,则所述第一函数是所述初始目标函数的候选等价函数。所述调用信息确定子单元可以配置为根据所述候选等价函数中初始目标函数的调用信息确定所述目标函数。
在一些实施例中,所述候选等价函数确定子模块可以包括:形式参数确定单元和参数等价确定单元。
其中,所述形式参数确定单元可以配置为若所述第一函数存在与所述第一目标参数全等的形式参数,且所述形式参数后支配所述第一目标参数。所述参数等价确定单元可以配置为则所述形式参数与所述第一目标参数等价。
在一些实施例中,所述分析结果为静态单赋值中间语言下的分析结果;其中,所述形式参数确定单元可以包括:操作符确定子单元、操作数确定子单元以及全等判断子单元。
其中,所述操作符确定子单元可以配置为在所述静态单赋值中间语言下,若所述第一函数的形式参数对应的操作符与所述第一目标参数对应的操作符相同;所述操作数确定子单元可以配置为并且所述第一函数的形式参数对应的操作数与所述第一目标参数对应的操作数全等或者相同;所述全等判断子单元可以配置为则所述第一函数的形式参数与所述第一目标参数全等。
在一些实施例中,所述形式参数确定单元还可以包括:数据流分析子单元和后支配确定子单元。
其中,所述数据流分析子单元可以配置为对所述控制流图中的指令进行数据流分析;所述后支配确定子单元可以配置为若从所述第一函数的第一条指令到达所述第一目标参数对应指令的分支均经过所述形式参数对应指令,则所述形式参数后支配所述第一目标参数。
在一些实施例中,所述等价分析模块1603还可以包括:调用位置确定子模块、分支依赖集合确定子模块以及并集确定子模块。
其中,所述调用位置确定子模块可以配置为根据所述函数调用图确定所述候选等价函数中调用所述初始目标函数的位置;所述分支依赖集合可以配置为根据所述控制依赖图确定各个调用所述初始目标函数的位置的分支依赖集合;所述并集确定子模块可以配置为若所述分支依赖集合的并集为所述候选等价函数中各分支依赖集合的全集,则所述候选等价函数与所述初始目标函数等价。
在一些实施例中,所述初始目标函数为内存释放函数,所述内存释放函数释放第二目标参数;其中,所述漏洞检测模块1605可以包括:释放重引用漏洞检测子模块。
其中,所述释放重引用漏洞检测子模块可以配置为若所述内存释放函数释放所述第二目标参数的释放点后支配所述第二目标参数的调用点,则所述目标二进制代码存在释放重引用UAF漏洞。
在一些实施例中,所述初始目标函数为输入接受函数,所述输入接受函数接受第三目标参数;其中,所述漏洞检测模块1605可以包括:污点分析子模块和命令注入漏洞检测子模块。
其中,所述污点分析子模块可以配置为对所述第三目标参数进行污点分析;所述命令注入口袋检测子模块可以配置为若目标命令执行函数被所述第三目标参数污染,则所述目标二进制代码存在命令注入漏洞。
在一些实施例中,所述初始目标函数为内存分配函数;所述漏洞检测模块1605可以包括:指针大小获取子模块、指针大小追踪子模块以及堆溢出漏洞检测子模块。
其中,所述指针大小获取子模块可以配置为获取所述内存分配函数返回的目标内存指针以及所述目标内存指针的大小;所述指针大小追踪子模块可以配置为根据所述控制流图对所述目标内存指针进行流分析,确定所述目标内存指针在各个指令中的内存大小;所述堆溢出漏洞检测子模块可以配置为若存在内存大小为负数的目标内存指针,则所述目标二进制代码存在堆溢出漏洞。
由于本公开的示例实施例漏洞检测装置1600的各个功能模块与上述漏洞检测方法的示例实施例的步骤对应,因此在此不再赘述。
通过以上的实施方式的描述,本领域的技术人员易于理解,这里描述的示例实施方式可以通过软件实现,也可以通过软件结合必要的硬件的方式来实现。因此,本公开实施例的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中,包括若干指令用以使得一台计算设备(可以是个人计算机、服务器、移动终端、或者智能设备等)执行根据本公开实施例的方法,例如图3的一个或多个所示的步骤。
此外,上述附图仅是根据本公开示例性实施例的方法所包括的处理的示意性说明,而不是限制目的。易于理解,上述附图所示的处理并不表明或限制这些处理的时间顺序。另外,也易于理解,这些处理可以是例如在多个模块中同步或异步执行的。
本领域技术人员在考虑说明书及实践这里公开的公开后,将容易想到本公开的其他实施例。本公开旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未申请的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由权利要求指出。
应当理解的是,本公开并不限于这里已经示出的详细结构、附图方式或实现方法,相反,本公开意图涵盖包含在所附权利要求的精神和范围内的各种修改和等效设置。

Claims (16)

1.一种漏洞检测方法,其特征在于,包括:
对目标二进制代码进行静态分析以获得分析结果,所述分析结果包括控制依赖图、函数调用图和控制流图;
获取目标函数列表,所述目标函数列表包括初始目标函数,所述初始目标函数包括第一目标参数;
根据所述函数调用图确定调用所述初始目标函数的第一函数;
根据所述控制流图对所述第一函数的形式参数与所述第一目标参数进行等价分析;
若所述第一函数存在与所述第一目标参数等价的形式参数,则所述第一函数是所述初始目标函数的候选等价函数;
根据所述候选等价函数中初始目标函数的调用信息确定所述目标函数,所述目标函数为与初始目标函数等价的候选等价函数;
将所述目标函数加入所述目标函数列表;
对所述目标函数列表中的目标函数进行二进制漏洞检测。
2.根据权利要求1所述方法,其特征在于,所述第一函数存在与所述第一目标参数等价的形式参数,包括:
若所述第一函数存在与所述第一目标参数全等的形式参数,且所述形式参数后支配所述第一目标参数;
则所述形式参数与所述第一目标参数等价;
其中,所述形式参数后支配所述第一目标参数,包括:
对所述控制流图中的指令进行数据流分析;
若从所述第一函数的第一条指令到达所述第一目标参数对应指令的分支均经过所述形式参数对应指令,则所述形式参数后支配所述第一目标参数。
3.根据权利要求2所述方法,其特征在于,所述分析结果为静态单赋值中间语言下的分析结果;其中,所述第一函数的形式参数与所述第一目标参数全等,还包括:
在所述静态单赋值中间语言下,若所述第一函数的形式参数对应的操作符与所述第一目标参数对应的操作符相同,并且
所述第一函数的形式参数对应的操作数与所述第一目标参数对应的操作数全等或者相同;
则所述第一函数的形式参数与所述第一目标参数全等。
4.根据权利要求1所述方法,其特征在于,根据所述候选等价函数中初始目标函数的调用信息确定所述目标函数,还包括:
根据所述函数调用图确定所述候选等价函数中调用所述初始目标函数的位置;
根据所述控制依赖图确定各个调用所述初始目标函数的位置的分支依赖集合;
若所述分支依赖集合的并集为所述候选等价函数中各分支依赖集合的全集,则所述候选等价函数与所述初始目标函数等价。
5.根据权利要求1所述方法,其特征在于,所述初始目标函数为内存释放函数,所述内存释放函数释放第二目标参数;其中,对所述目标函数列表中的目标函数进行二进制漏洞检测,包括:
若所述内存释放函数释放所述第二目标参数的释放点后支配所述第二目标参数的调用点,则所述目标二进制代码存在释放重引用UAF漏洞。
6.根据权利要求1所述方法,其特征在于,所述初始目标函数为输入接受函数,所述输入接受函数接受第三目标参数;其中,对所述目标函数列表中的目标函数进行二进制漏洞检测,包括:
对所述第三目标参数进行污点分析;
若目标命令执行函数被所述第三目标参数污染,则所述目标二进制代码存在命令注入漏洞。
7.根据权利要求1所述方法,其特征在于,所述初始目标函数为内存分配函数;其中,对所述目标函数列表中的目标函数进行二进制漏洞检测,包括:
获取所述内存分配函数返回的目标内存指针以及所述目标内存指针的大小;
根据所述控制流图对所述目标内存指针进行流分析,确定所述目标内存指针在各个指令中的内存大小;
若存在内存大小为负数的目标内存指针,则所述目标二进制代码存在堆溢出漏洞。
8.一种漏洞检测方法装置,其特征在于,包括:
静态分析模块,配置为对目标二进制代码进行静态分析以获得分析结果,所述分析结果包括控制依赖图、函数调用图和控制流图;
初始目标函数获取模块,配置为获取目标函数列表,所述目标函数列表包括初始目标函数,所述初始目标函数包括第一目标参数;
等价分析模块,配置为根据所述函数调用图确定调用所述初始目标函数的第一函数;根据所述控制流图对所述第一函数的形式参数与所述第一目标参数进行等价分析;若所述第一函数存在与所述第一目标参数等价的形式参数,则所述第一函数是所述初始目标函数的候选等价函数;根据所述候选等价函数中初始目标函数的调用信息确定所述目标函数,所述目标函数为与初始目标函数等价的候选等价函数;
目标函数加入模块,配置为将与所述初始目标函数等价的目标函数加入所述目标函数列表;
漏洞检测模块,配置为对所述目标函数列表中的目标函数进行二进制漏洞检测。
9.根据权利要求8所述装置,其特征在于,所述候选等价函数确定子模块包括:
形式参数确定单元,配置为若所述第一函数存在与所述第一目标参数全等的形式参数,且所述形式参数后支配所述第一目标参数;
参数等价确定单元,配置为则所述形式参数与所述第一目标参数等价;
其中,所述形式参数后支配所述第一目标参数,包括:
对所述控制流图中的指令进行数据流分析;
若从所述第一函数的第一条指令到达所述第一目标参数对应指令的分支均经过所述形式参数对应指令,则所述形式参数后支配所述第一目标参数。
10.根据权利要求9所述装置,其特征在于,所述分析结果为静态单赋值中间语言下的分析结果;其中,所述形式参数确定单元包括:
操作符确定子单元,配置为在所述静态单赋值中间语言下,若所述第一函数的形式参数对应的操作符与所述第一目标参数对应的操作符相同;
操作数确定子单元,配置为所述第一函数的形式参数对应的操作数与所述第一目标参数对应的操作数全等或者相同;
全等判断子单元,配置为则所述第一函数的形式参数与所述第一目标参数全等。
11.根据权利要求8所述装置,其特征在于,所述等价分析模块还包括:
调用位置确定子模块,配置为根据所述函数调用图确定所述候选等价函数中调用所述初始目标函数的位置;
分支依赖集合,配置为根据所述控制依赖图确定各个调用所述初始目标函数的位置的分支依赖集合;
并集确定子模块,配置为若所述分支依赖集合的并集为所述候选等价函数中各分支依赖集合的全集,则所述候选等价函数与所述初始目标函数等价。
12.根据权利要求8所述装置,其特征在于,所述初始目标函数为内存释放函数,所述内存释放函数释放第二目标参数;其中所述漏洞检测模块包括:
释放重引用漏洞检测子模块,配置为若所述内存释放函数释放所述第二目标参数的释放点后支配所述第二目标参数的调用点,则所述目标二进制代码存在释放重引用UAF漏洞。
13.根据权利要求8所述装置,其特征在于,所述初始目标函数为输入接受函数,所述输入接受函数接受第三目标参数;其中所述漏洞检测模块包括:
污点分析子模块,配置为对所述第三目标参数进行污点分析;
命令注入口袋检测子模块,配置为若目标命令执行函数被所述第三目标参数污染,则所述目标二进制代码存在命令注入漏洞。
14.根据权利要求8所述装置,其特征在于,所述初始目标函数为内存分配函数;其中,所述漏洞检测模块包括:
指针大小获取子模块,配置为获取所述内存分配函数返回的目标内存指针以及所述目标内存指针的大小;
指针大小追踪子模块,配置为根据所述控制流图对所述目标内存指针进行流分析,确定所述目标内存指针在各个指令中的内存大小;
堆溢出漏洞检测子模块,配置为若存在内存大小为负数的目标内存指针,则所述目标二进制代码存在堆溢出漏洞。
15.一种电子设备,其特征在于,包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序,
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如权利要求1-7中任一项所述的方法。
16.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述程序被处理器执行时实现如权利要求1-7中任一项所述的方法。
CN202010219712.8A 2020-03-25 2020-03-25 漏洞检测方法、装置、电子设备和计算机可读存储介质 Active CN111488579B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010219712.8A CN111488579B (zh) 2020-03-25 2020-03-25 漏洞检测方法、装置、电子设备和计算机可读存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010219712.8A CN111488579B (zh) 2020-03-25 2020-03-25 漏洞检测方法、装置、电子设备和计算机可读存储介质

Publications (2)

Publication Number Publication Date
CN111488579A CN111488579A (zh) 2020-08-04
CN111488579B true CN111488579B (zh) 2023-06-02

Family

ID=71810732

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010219712.8A Active CN111488579B (zh) 2020-03-25 2020-03-25 漏洞检测方法、装置、电子设备和计算机可读存储介质

Country Status (1)

Country Link
CN (1) CN111488579B (zh)

Families Citing this family (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113760700A (zh) * 2020-08-06 2021-12-07 北京京东振世信息技术有限公司 程序死循环检测方法、装置、电子设备及存储介质
CN112487434A (zh) * 2020-11-05 2021-03-12 杭州孝道科技有限公司 一种应用软件自适应安全防护方法
CN112800423B (zh) * 2021-01-26 2022-10-11 北京航空航天大学 一种二进制代码授权漏洞检测方法
CN113051565B (zh) * 2021-03-16 2024-05-28 深信服科技股份有限公司 恶意脚本的检测方法及装置、设备、存储介质
CN113821251B (zh) * 2021-09-29 2024-02-06 北京无限自在文化传媒股份有限公司 基于人工智能的代码优化方法、装置、设备和存储介质
CN114282221B (zh) * 2021-12-09 2024-01-12 苏州浪潮智能科技有限公司 注入类漏洞检测方法、系统、终端及存储介质

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101697121A (zh) * 2009-10-26 2010-04-21 哈尔滨工业大学 一种基于程序源代码语义分析的代码相似度检测方法
CN104573503A (zh) * 2015-02-11 2015-04-29 中国农业银行股份有限公司 一种内存访问溢出的检测方法及装置
CN107085533A (zh) * 2017-03-27 2017-08-22 北京北大软件工程股份有限公司 一种指针修改影响的分析方法和系统
CN109002721A (zh) * 2018-07-12 2018-12-14 南方电网科学研究院有限责任公司 一种信息安全漏洞的挖掘分析方法
CN110363004A (zh) * 2018-04-10 2019-10-22 腾讯科技(深圳)有限公司 一种代码漏洞检测方法、装置、介质及设备

Family Cites Families (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101968766B (zh) * 2010-10-21 2012-09-05 上海交通大学 计算机程序实际运行时触发软件漏洞的检测系统
US9507945B2 (en) * 2013-04-01 2016-11-29 The Johns Hopkins University Method and apparatus for automated vulnerability detection
CN103389939B (zh) * 2013-07-03 2015-11-25 清华大学 一种针对堆可控分配漏洞的检测方法及系统
US9411964B1 (en) * 2014-11-24 2016-08-09 Bluerisc, Inc. Characterizing, detecting and healing vulnerabilities in computer code
CN104794401B (zh) * 2015-04-15 2018-01-16 南京大学 一种静态分析辅助的符号执行漏洞检测方法
CN107977305B (zh) * 2016-10-24 2019-05-03 百度在线网络技术(北京)有限公司 用于检测应用的方法和装置
CN106709356B (zh) * 2016-12-07 2019-05-24 西安电子科技大学 基于静态污点分析和符号执行的安卓应用漏洞挖掘方法
CN106650452B (zh) * 2016-12-30 2020-01-24 北京工业大学 一种Android系统内置应用漏洞挖掘方法
CN108319858B (zh) * 2018-01-29 2020-07-10 中国科学院信息工程研究所 针对不安全函数的数据依赖图构建方法及装置
CN110197072B (zh) * 2018-06-04 2023-03-21 腾讯科技(深圳)有限公司 软件安全漏洞的发掘方法及系统、存储介质和计算机设备
CN109359468B (zh) * 2018-08-23 2021-12-14 创新先进技术有限公司 漏洞检测方法、装置及设备
CN109525556B (zh) * 2018-10-18 2022-01-11 中国电力科学研究院有限公司 一种用于确定嵌入式系统固件中协议漏洞的轻量级方法及系统
CN110287702B (zh) * 2019-05-29 2020-08-11 清华大学 一种二进制漏洞克隆检测方法及装置
CN110909358A (zh) * 2019-10-22 2020-03-24 上海安智信息科技有限公司 一种基于动静态分析的整形漏洞检测方法

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101697121A (zh) * 2009-10-26 2010-04-21 哈尔滨工业大学 一种基于程序源代码语义分析的代码相似度检测方法
CN104573503A (zh) * 2015-02-11 2015-04-29 中国农业银行股份有限公司 一种内存访问溢出的检测方法及装置
CN107085533A (zh) * 2017-03-27 2017-08-22 北京北大软件工程股份有限公司 一种指针修改影响的分析方法和系统
CN110363004A (zh) * 2018-04-10 2019-10-22 腾讯科技(深圳)有限公司 一种代码漏洞检测方法、装置、介质及设备
CN109002721A (zh) * 2018-07-12 2018-12-14 南方电网科学研究院有限责任公司 一种信息安全漏洞的挖掘分析方法

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
使用敏感路径识别方法分析安卓应用安全性;缪小川等;《使用敏感路径识别方法分析安卓应用安全性》;全文 *
基于模型检测方法的可信软件验证技术研究;梁加宾;《基于模型检测方法的可信软件验证技术研究》;全文 *
夏耐.基于简化控制流监控的程序入侵检测.《基于简化控制流监控的程序入侵检测》.2007,全文. *

Also Published As

Publication number Publication date
CN111488579A (zh) 2020-08-04

Similar Documents

Publication Publication Date Title
CN111488579B (zh) 漏洞检测方法、装置、电子设备和计算机可读存储介质
US11036614B1 (en) Data control-oriented smart contract static analysis method and system
Shi et al. Pinpoint: Fast and precise sparse value flow analysis for million lines of code
CN110908640B (zh) 实现业务功能的方法和脚本引擎
Tan et al. Making k-object-sensitive pointer analysis more precise with still k-limiting
US7975257B2 (en) Iterative static and dynamic software analysis
US8893102B2 (en) Method and system for performing backward-driven path-sensitive dataflow analysis
US20110078424A1 (en) Optimizing program code using branch elimination
CN112100072B (zh) 应用程序代码的静态检测方法、装置、设备及介质
US10360004B2 (en) Using dynamic information to refine control flow graphs
CN103577324A (zh) 移动应用中隐私信息泄露的静态检测方法
CN111506900B (zh) 漏洞检测方法、装置、电子设备及计算机存储介质
CN111488573A (zh) 链接库检测方法、装置、电子设备和计算机可读存储介质
Arzt et al. Using targeted symbolic execution for reducing false-positives in dataflow analysis
CN113254945A (zh) 基于污点分析的web漏洞静态检测方法、系统和介质
CN112115472A (zh) 一种面向数据管控的智能合约代码检查方法和系统
Titze et al. Apparecium: Revealing data flows in android applications
CN112527302B (zh) 错误检测的方法及装置、终端和存储介质
Bohluli et al. Detecting privacy leaks in android apps using inter-component information flow control analysis
CN114047923A (zh) 错误代码定位方法、装置、存储介质以及电子设备
Sui et al. Parallel construction of interprocedural memory SSA form
Mouzarani et al. A unit-based symbolic execution method for detecting heap overflow vulnerability in executable codes
US20230315862A1 (en) Method and apparatus for identifying dynamically invoked computer code using literal values
Deering et al. Flowminer: Automatic summarization of library data-flow for malware analysis
CN110297639B (zh) 用于检测代码的方法和装置

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
REG Reference to a national code

Ref country code: HK

Ref legal event code: DE

Ref document number: 40027451

Country of ref document: HK

GR01 Patent grant
GR01 Patent grant