CN111581106A - 二进制程序漏洞测试方法、装置及可读存储介质 - Google Patents
二进制程序漏洞测试方法、装置及可读存储介质 Download PDFInfo
- Publication number
- CN111581106A CN111581106A CN202010397145.5A CN202010397145A CN111581106A CN 111581106 A CN111581106 A CN 111581106A CN 202010397145 A CN202010397145 A CN 202010397145A CN 111581106 A CN111581106 A CN 111581106A
- Authority
- CN
- China
- Prior art keywords
- test case
- test
- program
- new
- binary program
- 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
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3684—Test management for test design, e.g. generating new test cases
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3676—Test management for coverage analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
-
- 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
-
- Y—GENERAL 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
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE 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/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Security & Cryptography (AREA)
- Quality & Reliability (AREA)
- Software Systems (AREA)
- Computing Systems (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种二进制程序漏洞测试方法、装置及可读存储介质。该方法包括:对目标二进制程序进行插桩处理并生成插桩信息一致的LLVM位码和可执行文件;相互嵌套执行对可执行文件进行模糊测试及对LLVM位码进行符号执行的过程,通过模糊测试,生成测试用例并更新覆盖信息;通过符号执行,搜索程序执行树,当根据覆盖信息发现程序执行中有分支未被覆盖时,生成相应的测试用例并加入到测试用例集合中;通过模糊测试,监控测试用例集合,当有新的测试用例时,读取新的测试用例并加入到模糊测试的测试用例队列中,并基于新的测试用例,继续探索分支后面的分支,生成测试用例并更新覆盖信息;当检测到符合终止条件时,结束漏洞测试过程。
Description
技术领域
本发明涉及电力信息安全技术领域,具体涉及一种二进制程序漏洞测试方法、装置及可读存储介质。
背景技术
现阶段,面向源代码的应用漏洞挖掘技术已经有了显著的发展。然而,面向源代码的应用漏洞挖掘也存在一些不足,由于应用的开发使用的都是高级语言(C语言、Java等),在实际运行时都将被编译成二进制代码,在编译、链接的过程中可能由于设置不当等多种原因引入漏洞,使得这些新引入的漏洞难以被检测。而面向程序的漏洞挖掘具有语言无关性且不需要程序源代码,同时也不需要进行编译和链接,可以直接被执行,因此对程序开展漏洞挖掘能够发现面向源代码的漏洞挖掘难以发现的漏洞。面向程序的漏洞挖掘由于接触的是计算机底层语言,对于挖掘人员的技术要求高,整体挖掘难度较大。
目前,程序漏洞挖掘效率低、难度大的原因,主要是因为在挖掘程序时,由于缺乏对于漏洞存在位置的预知,因此依赖于尽可能多的覆盖二进制代码的方式来发现漏洞,需要耗费大量的时间来探索程序中的各条路径,对于何时能够发现漏洞存在很大的随机性。
发明内容
有鉴于此,本发明实施例提供了一种二进制程序漏洞测试方法、装置及可读存储介质,以解决程序漏洞挖掘效率低、难度大的问题。
根据第一方面,本发明实施例提供了一种二进制程序漏洞测试方法,包括以下步骤:对目标二进制程序进行插桩处理并生成插桩信息一致的LLVM位码和可执行文件;相互嵌套执行对所述可执行文件进行模糊测试及对所述LLVM位码进行符号执行的过程,其中,通过模糊测试,生成测试用例并更新覆盖信息;通过符号执行,搜索程序执行树,当根据所述覆盖信息发现所述程序执行中有分支未被覆盖时,生成相应的测试用例并加入到测试用例集合中;通过模糊测试,监控所述测试用例集合,当有新的测试用例时,读取新的测试用例并加入到模糊测试的测试用例队列中,并基于新的测试用例,继续探索所述分支后面的分支,生成测试用例并更新覆盖信息;当检测到符合终止条件时,结束漏洞测试过程。
通过模糊测试探索程序执行树中的多个易覆盖的以及较深位置的分支,通过符号执行来系统性的搜索执行树,以尽可能的覆盖模糊测试未覆盖到的分支。实现对于二进制程序中漏洞更深层的测试,并提升漏洞的发现效率。
结合第一方面,在第一方面第一实施方式中,生成插桩信息一致的LLVM位码和可执行文件,具体包括:对目标二进制程序先插桩并编译为LLVM位码;将所述LLVM位码编译为目标代码,生成object文件;将object文件链接为可执行文件。
最终模糊测试与符号执行同步覆盖信息,仅插桩一次,从而保证了LLVM位码与可执行代码的插桩信息保持一致。
结合第一方面,在第一方面第二实施方式中,在对目标二进制程序进行插桩处理并生成插桩信息一致的LLVM位码和可执行文件之后,还包括:清除插桩后的冗余指令,所述清除插桩后的冗余指令,包括:输入插桩处理后的LLVM位码;删除插桩处理引入的外部全局变量;在插桩处理后的LLVM位码中的每一个基本块中,删除插桩处理的额外代码;对每个基本块,解析插桩指令并得到随机插桩编号,删除插桩指令,并插入一条指令以保存插桩编号的值。
经过AFL插桩后会引入两个外部全局变量,并且LLVM位码中的每个基本块会多出计算指令。而符号执行不需要这些动态计算覆盖信息,因此这些指令会大大影响符号执行的执行效率。通过获得插桩信息中的编号,并删除其它无用指令,经过冗余指令的清除,在每个基本块中指令将减少为一条。
结合第一方面第二实施方式,在第一方面第三实施方式中,通过KLEE进行符号执行,所述插入一条指令具体包括:插入一条KLEE未支持的指令AtmoicRMW。
结合第一方面第三实施方式,在第一方面第四实施方式中,对所述LLVM位码进行符号执行,具体包括:输入插桩处理后的LLVM位码和覆盖信息;创建一个初始状态并将其加入状态集合中;从初始状态开始进行遍历,在状态集合中选择一个状态;得到当前状态的指令,根据指令的不同类型并对其进行解释执行;当指令为分支条件时,当前状态分叉为两个状态并更新路径条件;当前分支的路径条件可满足时,将生成的新状态加入状态集合;当遇到指令AtmoicRMW时解析得到基本块编号,基于所述基本块编号检查当前分支是否被覆盖;计算当前分支的哈希值,当覆盖到新的分支时,生成测试用例,并将其加入到测试用例集合;当当前分支生成新的分支后,将该状态优先级降低,符号执行优先探索其它分支;对其它类型的指令,符号执行根据相应的语义进行解释与执行,输出新生成的测试用例集合。
结合第一方面第四实施方式,在第一方面第五实施方式中,从初始状态开始进行遍历的遍历搜索方法采用深度优先策略或广度优先策略。
结合第一方面,在第一方面第六实施方式中,对所述可执行文件进行模糊测试,具体包括:输入已有测试用例,待测二进制程序以及来自符号执行的新增测试用例集合,输出生成的所有测试用例;依次遍历已有测试用例中的每一个测试用例,首先对其进行变异得到新的测试用例;待测二进制程序执行新的测试用例,得到覆盖信息以及运行结果;当运行结果发现异常,判定为触发漏洞的测试用例;当测试用例使得新的分支被覆盖,将其加入测试用例集合并更新覆盖信息;完成一个测试用例的处理后,检查是否符号执行探索到新的未覆盖分支,当发现新的测试用例,将其加入到已有测试用例的最前列,并将新增测试用例集清空。
结合第一方面第六实施方式,在第一方面第七实施方式中,所述步骤中输出生成的所有测试用例包括触发漏洞的输入测试用例。
结合第一方面,在第一方面第八实施方式中,对目标二进制程序进行插桩处理,包括:通过AFL对目标二进制程序进行插桩处理。
结合第一方面,在第一方面第九实施方式中,所述符合终止条件包括:当漏洞测试过程检测到程序漏洞;或漏洞测试过程的执行时间超过预设的程序执行时间。
根据第二方面,本发明实施例提供了一种二进制程序漏洞测试装置,包括:编译模块,用于对目标二进制程序进行插桩处理并生成插桩信息一致的LLVM位码和可执行文件;运行模块,包括模糊测试模块和符号执行模块,用于相互嵌套执行对所述可执行文件进行模糊测试及对所述LLVM位码进行符号执行的过程,其中,符号执行模块,用于搜索程序执行树,当根据覆盖信息发现所述程序执行中有分支未被覆盖时,生成相应的测试用例并加入到测试用例集合中,模糊测试模块,用于生成测试用例并更新覆盖信息,还用于监控测试用例集合,当有新的测试用例时,读取新的测试用例并加入到模糊测试的测试用例队列中,并基于新的测试用例,继续探索所述分支后面的分支,生成测试用例并更新覆盖信息;检测模块,用于检测到符合终止条件时,结束漏洞测试过程。
根据第三方面,本发明实施例提供了一种电子设备,包括:至少一个处理器;以及与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的计算机程序,所述计算机程序被所述至少一个处理器执行,以使所述至少一个处理器执行第一方面或者第一方面的任意一种实施方式中所述的二进制程序漏洞测试方法。
根据第四方面,本发明实施例提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行第一方面或者第一方面的任意一种实施方式中所述的二进制程序漏洞测试方法。
本发明实施例技术方案,具有如下优点:
本发明实施例提供了一种二进制程序漏洞测试方法,包括对目标二进制程序进行插桩处理并生成插桩信息一致的LLVM位码和可执行文件;相互嵌套执行对所述可执行文件进行模糊测试及对所述LLVM位码进行符号执行的过程,当检测到符合终止条件时,结束漏洞测试过程。通过本发明实施例的一种二进制程序漏洞测试方法,将模糊测试与符号执行两种方法结合运用于二进制程序的漏洞发现,实现对于二进制程序中漏洞更深层的测试,并提升漏洞的发现效率,提出了一种针对WLLVM编译工具的改进方法,确保编译后的LLVM位码与可执行程序在插桩信息上保持一致性。提出一种针对符号执行的基本块插桩冗余信息清除方法。
附图说明
通过参考附图会更加清楚的理解本发明的特征和优点,附图是示意性的而不应理解为对本发明进行任何限制,在附图中:
图1是根据本发明实施例的二进制程序漏洞测试方法的整体流程示意图;
图2是根据本发明实施例的二进制程序漏洞测试方法的一个示意图;
图3是根据本发明实施例的二进制程序漏洞测试装置的结构框图;
图4是根据本发明实施例提供的二进制程序漏洞测试方法的电子设备的硬件结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
模糊测试的优点在于动态执行,因此执行一个测试用例,其可以覆盖到较深的位置;而缺点是当遇到复杂的分支条件时,则很难通过随机变异的方法来生成满足该条件的测试用例。而符号执行的优点是其可以突破复杂分支条件,由于维护了路径条件,因此通过约束求解器可以生成满足该条件的测试用例。而缺点是由于所有值都需要进行符号化,因此当遇到依赖符号输入的循环或者递归时,其无法确定迭代次数,从而陷入到循环展开中。此外,随着路径深度的增加,路径条件也会越来越复杂,其对于约束求解器也会构成很大的挑战。本发明通过结合符号执行帮助模糊测试能否覆盖更多地分支,从而发现更多的漏洞。
如图1所示,本发明实施例的一种二进制程序漏洞测试方法,主要分为编译和运行两个阶段,在编译阶段实现对目标二进制程序进行插桩处理并生成插桩信息一致的LLVM(Low Level Virtual Machine)位码和可执行文件;在运行阶段实现模糊测试以及符号执行,相互嵌套执行对所述可执行文件进行模糊测试及对所述LLVM位码进行符号执行的过程,如图2所示,包括:
步骤S201:对目标二进制程序进行插桩处理并生成插桩信息一致的LLVM位码和可执行文件;
步骤S202:通过模糊测试不断的生成测试用例并更新覆盖信息(virgin_bits);通过模糊测试,监控测试用例集合,当有新的测试用例T时,读取新的测试用例并加入到模糊测试的测试用例队列中,此时(p,c)已被覆盖。并基于新的测试用例,继续探索所述分支(p,c)后面的分支,生成测试用例并更新覆盖信息;
步骤S203:通过符号执行,搜索程序执行树,当根据覆盖信息发现所述程序执行中有分支(p,c)未被覆盖时,生成相应的测试用例T并加入到测试用例集合中;
步骤S204:步骤S202、步骤S203相互嵌套执行,不断更新测试用例集合SE_Seeds,尝试覆盖到更多地目标程序的分支。
步骤S205:当检测到符合终止条件时,结束漏洞测试过程。
通过上述步骤,模糊测试探索程序执行树中的多个易覆盖的以及较深位置的分支,通过符号执行来系统性的搜索执行树,以尽可能的覆盖模糊测试未覆盖到的分支。实现对于二进制程序中漏洞更深层的测试,并提升漏洞的发现效率。
上述步骤涉及到生成插桩信息一致的LLVM位码和可执行文件,在一个具体实施方式中,如图1所示,该步骤包括:对目标二进制程序先插桩并编译为LLVM位码;将所述LLVM位码编译为目标代码,即object文件;将object文件链接为可执行文件。
符号执行与模糊测试结合的前提是其双方版本一致。具体来说,在源文件以及可执行文件这两个版本中,需要保证控制流图以及每个基本块的插桩编号相同,使得双方在覆盖信息上保持一致,本实施例中使用Whole Program LLVM(WLLVM)对二进制程序进行编译,并在其基础上进行修改,确保编译后生成的LLVM位码和可执行代码中的插桩信息一致,原本的WLLVM生成LLVM位码与可执行代码是分两次编译的,从而导致同一个基本块在两次编译中随机生成两个不同的编号。最终模糊测试与符号执行无法同步覆盖信息。修改后的WLLVM中仅插桩一次,从而保证了LLVM位码与可执行代码的插桩信息保持一致。
在一个可选实施方式中,如图1所示,进行以下步骤,清除插桩后的冗余指令,本实施例中使用的模糊测试由AFL(American Fuzzy Loop)实现,先对目标二进制程序进行插桩处理,AFL在编译过程中为待测程序的每个基本块(basic block)插入一个编号,当一个条件分支(prev,cur)被覆盖一次时,其执行次数加1(即trace_bits[h(prev,cur)]++)。其中prev和cur分别表示先前基本块与当前基本块的编号,trace_bits是记录当前测试用例覆盖信息的数组,索引值表示分支的哈希值。这样,在执行一个测试用例后,trace_bits记录了程序中每个分支的覆盖次数。同时,在执行多个测试用例后,AFL也会记录全局覆盖信息数组virgin_bits,其表示已执行的所有测试用例的覆盖信息。通过比较trace_bits与virgin_bits后,可以判断出当前测试用例是否可以覆盖到新状态,从而决定是否保留该测试用例。通过AFL对目标程序进行插桩处理,AFL在编译过程中为待测程序的每个基本块(basic block)插入一个编号,经过AFL插桩后会引入两个外部全局变量,并且LLVM位码中的每个基本块会多出8条计算指令。而符号执行不需要这些动态计算覆盖信息,因此这些指令会大大影响符号执行的执行效率。本实施例中通过获得插桩信息中的编号,并删除其它无用指令。
具体步骤为:输入是插桩处理后的LLVM位码;删除AFL引入的外部全局变量(即afl_prev_loc与afl_area_ptr),由于这两个全局变量都是外部变量,造成符号执行运行时无法找到变量而报错;在LLVM位码的每一个基本块中,删除AFL插桩的额外代码。对于每个基本块B,首先解析插桩指令并得到随机插桩编号ID,然后删除插桩指令,并插入一条指令以保存ID的值;当符号执行工具为KLEE时,则选择加入一条KLEE未支持的指令AtmoicRMW来保存ID。
经过冗余指令的清除,在每个基本块中8条指令将减少为一条。
在一个可选实施方式中,通过KLEE进行符号执行,KLEE是基于LLVM(Low LevelVirtual Machine)实现的符号执行工具。被测程序被编译为LLVM位码,KLEE直接解释指令集并将其转为相应的约束条件。在一个具体实施方式中,该步骤包括:
输入是插桩处理后的LLVM位码,覆盖信息virgin_bits,输出为新生成的测试用例SE_Seeds;创建一个初始状态并将其加入状态集合States中;从初始状态开始进行遍历,在集合States中选择一个状态,这里搜索方法可以采取不同的策略,例如深度优先策略或者广度优先策略等;得到当前状态的指令inst,根据指令的不同类型并对其进行解释执行;当指令为分支条件时,当前状态分叉为两个状态并更新路径条件state.pc;如果当前分支的路径条件可满足(通过约束求解器发现可解),则将生成的新状态加入状态集合;当遇到指令AtmoicRMW时解析得到基本块编号,基于该编号可以检查当前分支是否被覆盖;计算当前分支的哈希值(与AFL中的插桩计算等价)。如果覆盖到新的分支时,则生成测试用例,并将其加入到测试用例集合SE_Seeds;当该路径生成新的分支后,我们将该状态优先级降低,因为在符号执行突破新的分支后,我们期待模糊测试基于该测试用例进行更深位置的探索。因此,为了提高效率,此时符号执行将优先探索其它分支,从而避免与模糊测试进行同位置的探索。对于其它类型的指令,符号执行将根据相应的语义进行解释与执行。
在一个可选实施方式中,通过AFL进行模糊测试,本实施例中使用的模糊测试由AFL实现。
具体步骤为:输入为已有测试用例Seeds,待测程序P以及来自符号执行的新增测试用例集SE_Seeds,输出是生成的所有测试用例,其中包含可以触发漏洞的输入测试用例;AFL依次遍历Seeds中的每一个测试用例seed首先对其进行变异得到新的测试用例newseed。一个测试用例可以通过多种变异操作得到多个测试用例;程序P执行新的测试用例newseed,得到覆盖信息以及运行结果;如果运行结果发现异常,则找到了触发漏洞的测试用例;如果该测试用例使得新的分支被覆盖,则将其加入测试用例集合并更新覆盖信息;在完成一个测试用例的处理后,将检查是否符号执行探索到新的未覆盖分支,如果发现新的测试用例,则将其加入到Seeds的最前列,并将SE_Seeds清空。
这样在符号执行发现新的测试用例后,模糊测试将对其进行变异,以探索该分支下更深位置的分支。
上述步骤涉及当检测到符合终止条件时,结束漏洞测试过程,在一个可选实施方式中,当触发到漏洞(程序崩溃)或者超过预设的程序执行时间后,整个漏洞发现过程终止。
本发明实施例提供了一种二进制程序漏洞测试装置,该装置用于实现上述实施例及优选实施方式,已经进行过说明的不再赘述。如以下所使用的,术语“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。
本发明实施例提供一种二进制程序漏洞测试装置,如图3所示,该二进制程序漏洞测试装置,包括:
编译模块31,用于对目标二进制程序进行插桩处理并生成插桩信息一致的LLVM位码和可执行文件,详细内容请参见上述方法实施例的步骤S201的相关描述,在此不再赘述;
运行模块32,包括模糊测试模块322和符号执行模块321,用于相互嵌套执行对所述可执行文件进行模糊测试及对所述LLVM位码进行符号执行的过程,其中,符号执行模块321,用于搜索程序执行树,当根据覆盖信息发现所述程序执行中有分支未被覆盖时,生成相应的测试用例并加入到测试用例集合中,模糊测试模块322,用于生成测试用例并更新覆盖信息,还用于监控测试用例集合,当有新的测试用例时,读取新的测试用例并加入到模糊测试的测试用例队列中,并基于新的测试用例,继续探索所述分支后面的分支,生成测试用例并更新覆盖信息,详细内容请参见上述方法实施例的步骤S202、步骤S203、步骤S204的相关描述,在此不再赘述;
检测模块33,用于检测到符合终止条件时,结束漏洞测试过程,详细内容请参见上述方法实施例的步骤S205的相关描述,在此不再赘述。
通过本发明实施例的一种二进制程序漏洞测试装置,实现对于程序中漏洞更深层的测试,提升漏洞的发现效率,具有广泛的工程实用价值。
上述各个模块的更进一步的功能描述与上述对应实施例相同,在此不再赘述。
本发明实施例还提供了一种电子设备,如图4所示,该电子设备可以包括处理器41和存储器42,其中处理器41和存储器42可以通过总线或者其他方式连接,图4中以通过总线连接为例。
处理器41可以为中央处理器(Central Processing Unit,CPU)。处理器41还可以为其他通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现场可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等芯片,或者上述各类芯片的组合。
存储器42作为一种非暂态计算机可读存储介质,可用于存储非暂态软件程序、非暂态计算机可执行程序以及模块,如本发明实施例中的二进制程序漏洞测试方法对应的程序指令/模块(例如,图3所示的编译模块31、运行模块32、模糊测试模块322、符号执行模块321、检测模块33)。处理器41通过运行存储在存储器42中的非暂态软件程序、指令以及模块,从而执行处理器的各种功能应用以及数据处理,即实现上述方法实施例中的二进制程序漏洞测试方法。
存储器42可以包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需要的应用程序;存储数据区可存储处理器41所创建的数据等。此外,存储器42可以包括高速随机存取存储器,还可以包括非暂态存储器,例如至少一个磁盘存储器件、闪存器件、或其他非暂态固态存储器件。在一些实施例中,存储器42可选包括相对于处理器41远程设置的存储器,这些远程存储器可以通过网络连接至处理器41。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
所述一个或者多个模块存储在所述存储器42中,当被所述处理器41执行时,执行方法实施例中的二进制程序漏洞测试方法。
上述电子设备具体细节可以对应参阅方法实施例中对应的相关描述和效果进行理解,此处不再赘述。
本领域技术人员可以理解,实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各移动应用节点信誉度评价方法的实施例的流程。其中,所述存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)、随机存储记忆体(Random Access Memory,RAM)、快闪存储器(Flash Memory)、硬盘(Hard Disk Drive,缩写:HDD)或固态硬盘(Solid-State Drive,SSD)等;所述存储介质还可以包括上述种类的存储器的组合。
虽然结合附图描述了本发明的实施例,但是本领域技术人员可以在不脱离本发明的精神和范围的情况下作出各种修改和变型,这样的修改和变型均落入由所附权利要求所限定的范围之内。
Claims (13)
1.一种二进制程序漏洞测试方法,其特征在于,包括以下步骤:
对目标二进制程序进行插桩处理并生成插桩信息一致的LLVM位码和可执行文件;
相互嵌套执行对所述可执行文件进行模糊测试及对所述LLVM位码进行符号执行的过程,其中,
通过模糊测试,生成测试用例并更新覆盖信息;
通过符号执行,搜索程序执行树,当根据所述覆盖信息发现所述程序执行中有分支未被覆盖时,生成相应的测试用例并加入到测试用例集合中;
通过模糊测试,监控所述测试用例集合,当有新的测试用例时,读取新的测试用例并加入到模糊测试的测试用例队列中,并基于新的测试用例,继续探索所述分支后面的分支,生成测试用例并更新覆盖信息;
当检测到符合终止条件时,结束漏洞测试过程。
2.根据权利要求1所述的二进制程序漏洞测试方法,其特征在于,生成插桩信息一致的LLVM位码和可执行文件,具体包括:
对目标二进制程序先插桩并编译为LLVM位码;
将所述LLVM位码编译为目标代码,生成object文件;
将object文件链接为可执行文件。
3.根据权利要求1所述的二进制程序漏洞测试方法,其特征在于,在对目标二进制程序进行插桩处理并生成插桩信息一致的LLVM位码和可执行文件之后,还包括:清除插桩后的冗余指令,所述清除插桩后的冗余指令,包括:
输入插桩处理后的LLVM位码;
删除插桩处理引入的外部全局变量;
在插桩处理后的LLVM位码中的每一个基本块中,删除插桩处理的额外代码;
对每个基本块,解析插桩指令并得到随机插桩编号,删除插桩指令,并插入一条指令以保存插桩编号的值。
4.根据权利要求3所述的二进制程序漏洞测试方法,其特征在于,通过KLEE进行符号执行,所述插入一条指令具体包括:插入一条KLEE未支持的指令AtmoicRMW。
5.根据权利要求4所述的二进制程序漏洞测试方法,其特征在于,对所述LLVM位码进行符号执行,具体包括:
输入插桩处理后的LLVM位码和覆盖信息;
创建一个初始状态并将其加入状态集合中;
从初始状态开始进行遍历,在状态集合中选择一个状态;
得到当前状态的指令,根据指令的不同类型并对其进行解释执行;
当指令为分支条件时,当前状态分叉为两个状态并更新路径条件;
当前分支的路径条件可满足时,将生成的新状态加入状态集合;
当遇到指令AtmoicRMW时解析得到基本块编号,基于所述基本块编号检查当前分支是否被覆盖;
计算当前分支的哈希值,当覆盖到新的分支时,生成测试用例,并将其加入到测试用例集合;
当当前分支生成新的分支后,将该状态优先级降低,符号执行优先探索其它分支;
对其它类型的指令,符号执行根据相应的语义进行解释与执行;
输出新生成的测试用例集合。
6.根据权利要求5所述的二进制程序漏洞测试方法,其特征在于,从初始状态开始进行遍历的遍历搜索方法采用深度优先策略或广度优先策略。
7.根据权利要求1所述的二进制程序漏洞测试方法,其特征在于,对所述可执行文件进行模糊测试,具体包括:
输入已有测试用例,待测二进制程序以及来自符号执行的新增测试用例集合;
依次遍历已有测试用例中的每一个测试用例,对其进行变异得到新的测试用例;
待测二进制程序执行新的测试用例,得到覆盖信息以及运行结果;
当运行结果发现异常,判定为触发漏洞的测试用例;当测试用例使得新的分支被覆盖,将其加入测试用例集合并更新覆盖信息;
完成一个测试用例的处理后,检查是否符号执行探索到新的未覆盖分支,当发现新的测试用例,将其加入到已有测试用例的最前列,并将新增测试用例集清空;
输出生成的所有测试用例。
8.根据权利要求7所述的二进制程序漏洞测试方法,其特征在于,输出生成的所有测试用例包括触发漏洞的输入测试用例。
9.根据权利要求1所述的二进制程序漏洞测试方法,其特征在于,对目标二进制程序进行插桩处理,包括:通过AFL对目标二进制程序进行插桩处理。
10.根据权利要求1所述的二进制程序漏洞测试方法,其特征在于,所述符合终止条件包括:
当漏洞测试过程检测到程序漏洞;或
漏洞测试过程的执行时间超过预设的程序执行时间。
11.一种二进制程序漏洞测试装置,其特征在于,包括:
编译模块,用于对目标二进制程序进行插桩处理并生成插桩信息一致的LLVM位码和可执行文件;
运行模块,包括模糊测试模块和符号执行模块,用于相互嵌套执行对所述可执行文件进行模糊测试及对所述LLVM位码进行符号执行的过程,其中,
符号执行模块,用于搜索程序执行树,当根据覆盖信息发现所述程序执行中有分支未被覆盖时,生成相应的测试用例并加入到测试用例集合中,
模糊测试模块,用于生成测试用例并更新覆盖信息,还用于监控测试用例集合,当有新的测试用例时,读取新的测试用例并加入到模糊测试的测试用例队列中,并基于新的测试用例,继续探索所述分支后面的分支,生成测试用例并更新覆盖信息;
检测模块,用于检测到符合终止条件时,结束漏洞测试过程。
12.一种电子设备,其特征在于,包括:
至少一个处理器;以及
与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的计算机程序,所述计算机程序被所述至少一个处理器执行,以使所述至少一个处理器执行权利要求1-10任一项所述的二进制程序漏洞测试方法。
13.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1-10任一项所述的二进制程序漏洞测试方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010397145.5A CN111581106B (zh) | 2020-05-12 | 2020-05-12 | 二进制程序漏洞测试方法、装置及可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010397145.5A CN111581106B (zh) | 2020-05-12 | 2020-05-12 | 二进制程序漏洞测试方法、装置及可读存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111581106A true CN111581106A (zh) | 2020-08-25 |
CN111581106B CN111581106B (zh) | 2023-05-23 |
Family
ID=72112116
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010397145.5A Active CN111581106B (zh) | 2020-05-12 | 2020-05-12 | 二进制程序漏洞测试方法、装置及可读存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111581106B (zh) |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112181833A (zh) * | 2020-09-28 | 2021-01-05 | 全球能源互联网研究院有限公司 | 一种智能化模糊测试方法、装置及系统 |
CN113076263A (zh) * | 2021-05-06 | 2021-07-06 | 北京字节跳动网络技术有限公司 | 一种进程运行的方法、装置、计算机设备及存储介质 |
CN113297070A (zh) * | 2021-04-30 | 2021-08-24 | 中国科学院信息工程研究所 | 一种面向软件更新的软件测试方法和装置 |
CN113407443A (zh) * | 2021-06-02 | 2021-09-17 | 贝格迈思(深圳)科技有限公司 | 一种基于gpu二进制代码翻译的高效模糊测试方法 |
CN113569252A (zh) * | 2021-07-07 | 2021-10-29 | 四川省信息安全测评中心 | 结合神经网络基于函数与分支覆盖的漏洞检测方法 |
CN114661578A (zh) * | 2022-01-26 | 2022-06-24 | 天津大学 | 基于支配点覆盖的导向式灰盒模糊测试方法及装置 |
CN115292206A (zh) * | 2022-10-08 | 2022-11-04 | 西安深信科创信息技术有限公司 | 软件漏洞检测方法、装置、电子设备及存储介质 |
CN115687111A (zh) * | 2022-10-27 | 2023-02-03 | 中国人民解放军国防科技大学 | 面向计算机二进制程序的直接比对依赖识别方法与系统 |
CN115794651A (zh) * | 2022-12-21 | 2023-03-14 | 北京水木羽林科技有限公司 | 一种支持多二进制的无冲突插桩方法和系统 |
CN117873908A (zh) * | 2024-03-12 | 2024-04-12 | 中兴通讯股份有限公司 | 测试用例确定方法及装置 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108052825A (zh) * | 2017-12-29 | 2018-05-18 | 哈尔滨工业大学 | 针对二进制可执行文件的模糊测试与符号执行相结合的漏洞检测系统 |
CN109032927A (zh) * | 2018-06-26 | 2018-12-18 | 腾讯科技(深圳)有限公司 | 一种漏洞挖掘方法及装置 |
CN109032942A (zh) * | 2018-07-24 | 2018-12-18 | 北京理工大学 | 一种基于afl的模糊测试框架 |
CN110287693A (zh) * | 2019-06-13 | 2019-09-27 | 成都积微物联集团股份有限公司 | 一种基于符号执行路径剪枝的缓冲区溢出漏洞自动检测方法 |
US20190384697A1 (en) * | 2018-06-18 | 2019-12-19 | Fujitsu Limited | Branch coverage guided symbolic execution for hybrid fuzz testing of software binaries |
-
2020
- 2020-05-12 CN CN202010397145.5A patent/CN111581106B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108052825A (zh) * | 2017-12-29 | 2018-05-18 | 哈尔滨工业大学 | 针对二进制可执行文件的模糊测试与符号执行相结合的漏洞检测系统 |
US20190384697A1 (en) * | 2018-06-18 | 2019-12-19 | Fujitsu Limited | Branch coverage guided symbolic execution for hybrid fuzz testing of software binaries |
CN109032927A (zh) * | 2018-06-26 | 2018-12-18 | 腾讯科技(深圳)有限公司 | 一种漏洞挖掘方法及装置 |
CN109032942A (zh) * | 2018-07-24 | 2018-12-18 | 北京理工大学 | 一种基于afl的模糊测试框架 |
CN110287693A (zh) * | 2019-06-13 | 2019-09-27 | 成都积微物联集团股份有限公司 | 一种基于符号执行路径剪枝的缓冲区溢出漏洞自动检测方法 |
Cited By (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112181833A (zh) * | 2020-09-28 | 2021-01-05 | 全球能源互联网研究院有限公司 | 一种智能化模糊测试方法、装置及系统 |
CN113297070A (zh) * | 2021-04-30 | 2021-08-24 | 中国科学院信息工程研究所 | 一种面向软件更新的软件测试方法和装置 |
CN113076263A (zh) * | 2021-05-06 | 2021-07-06 | 北京字节跳动网络技术有限公司 | 一种进程运行的方法、装置、计算机设备及存储介质 |
CN113407443A (zh) * | 2021-06-02 | 2021-09-17 | 贝格迈思(深圳)科技有限公司 | 一种基于gpu二进制代码翻译的高效模糊测试方法 |
CN113569252A (zh) * | 2021-07-07 | 2021-10-29 | 四川省信息安全测评中心 | 结合神经网络基于函数与分支覆盖的漏洞检测方法 |
CN114661578B (zh) * | 2022-01-26 | 2024-06-04 | 天津大学 | 基于支配点覆盖的导向式灰盒模糊测试方法及装置 |
CN114661578A (zh) * | 2022-01-26 | 2022-06-24 | 天津大学 | 基于支配点覆盖的导向式灰盒模糊测试方法及装置 |
CN115292206A (zh) * | 2022-10-08 | 2022-11-04 | 西安深信科创信息技术有限公司 | 软件漏洞检测方法、装置、电子设备及存储介质 |
CN115292206B (zh) * | 2022-10-08 | 2023-03-14 | 西安深信科创信息技术有限公司 | 软件漏洞检测方法、装置、电子设备及存储介质 |
CN115687111B (zh) * | 2022-10-27 | 2024-05-14 | 中国人民解放军国防科技大学 | 面向计算机二进制程序的直接比对依赖识别方法与系统 |
CN115687111A (zh) * | 2022-10-27 | 2023-02-03 | 中国人民解放军国防科技大学 | 面向计算机二进制程序的直接比对依赖识别方法与系统 |
CN115794651A (zh) * | 2022-12-21 | 2023-03-14 | 北京水木羽林科技有限公司 | 一种支持多二进制的无冲突插桩方法和系统 |
CN115794651B (zh) * | 2022-12-21 | 2023-08-18 | 北京水木羽林科技有限公司 | 一种支持多二进制的无冲突插桩方法和系统 |
CN117873908A (zh) * | 2024-03-12 | 2024-04-12 | 中兴通讯股份有限公司 | 测试用例确定方法及装置 |
CN117873908B (zh) * | 2024-03-12 | 2024-06-21 | 中兴通讯股份有限公司 | 测试用例确定方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN111581106B (zh) | 2023-05-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111581106A (zh) | 二进制程序漏洞测试方法、装置及可读存储介质 | |
CN109426723B (zh) | 使用释放后内存的检测方法、系统、设备及存储介质 | |
KR101981028B1 (ko) | 바이너리 기반 보안 취약점 탐색 시스템, 그 방법 및 프로그램 | |
CN101714119B (zh) | 基于二进制程序的测试数据生成器和方法 | |
US10628286B1 (en) | Systems and methods for dynamically identifying program control flow and instrumenting source code | |
CN110197072B (zh) | 软件安全漏洞的发掘方法及系统、存储介质和计算机设备 | |
CN111723382A (zh) | 动态Android程序漏洞验证方法和装置 | |
CN111222141B (zh) | 一种汽车电控单元代码漏洞分析方法和系统 | |
CN104573503A (zh) | 一种内存访问溢出的检测方法及装置 | |
Delahaye et al. | Explanation-based generalization of infeasible path | |
JP6142705B2 (ja) | オブジェクト指向言語のための記号テストドライバの反復生成 | |
CN115344866A (zh) | 基于符号执行的跨架构二进制可执行文件漏洞检测方法及系统 | |
Zhang et al. | A hybrid symbolic execution assisted fuzzing method | |
Dewey et al. | Uncovering use-after-free conditions in compiled code | |
Le | Segmented symbolic analysis | |
US20220058260A1 (en) | Binary image stack cookie protection | |
Saumya et al. | Xstressor: Automatic generation of large-scale worst-case test inputs by inferring path conditions | |
Su et al. | STCG: state-aware test case generation for simulink models | |
CN116881921A (zh) | 一种基于afl的二进制命令注入漏洞检测方法及系统 | |
CN109002723B (zh) | 一种分段式符号执行方法 | |
CN115310095A (zh) | 一种区块链智能合约混合形式化验证方法及系统 | |
Gerasimov et al. | Reachability confirmation of statically detected defects using dynamic analysis | |
Ferreira et al. | Efficient Static Vulnerability Analysis for JavaScript with Multiversion Dependency Graphs | |
CN115687158B (zh) | 一种协议软件的测试方法及装置 | |
CN115237748B (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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |