CN113849814A - 一种可配置系统漏洞复现系统以及复现方法 - Google Patents

一种可配置系统漏洞复现系统以及复现方法 Download PDF

Info

Publication number
CN113849814A
CN113849814A CN202010597156.8A CN202010597156A CN113849814A CN 113849814 A CN113849814 A CN 113849814A CN 202010597156 A CN202010597156 A CN 202010597156A CN 113849814 A CN113849814 A CN 113849814A
Authority
CN
China
Prior art keywords
binary
source code
difference
function
binary system
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.)
Pending
Application number
CN202010597156.8A
Other languages
English (en)
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.)
Nanjing University
Original Assignee
Nanjing University
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 Nanjing University filed Critical Nanjing University
Priority to CN202010597156.8A priority Critical patent/CN113849814A/zh
Publication of CN113849814A publication Critical patent/CN113849814A/zh
Pending legal-status Critical Current

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
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/71Version control; Configuration management

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computing Systems (AREA)
  • Stored Programmes (AREA)

Abstract

本发明提供一种基于相似度的可配置系统漏洞复现方法及系统,通过分析编译系统和源代码,建立软件配置选项与源代码之间的控制关系;使用默认软件配置选项编译生成默认二进制,利用BinDiff二进制差异分析软件,分析默认二进制与目标二进制的差异,并将该差异映射到源代码中;结合软件配置选项与源代码之间的控制关系,确认二进制差异是否由软件配置选项引起的,最终确定目标二进制所使用的软件配置选项。该方法及系统能够在缺失安装/配置信息条件下有效的推断崩溃二进制使用的软件配置选项,节省软件开发人员和安全分析人员进行漏洞复现时所需要的时间。

Description

一种可配置系统漏洞复现系统以及复现方法
技术领域
本发明属于计算机技术漏洞复现领域,更具体地,涉及一种可配置系统漏洞复现系统以及复现方法。
背景技术
随着互联网的飞速发展,软件系统在人们的日常生活中占据了越来越重要的地位。在全球信息化安全的博弈中,软件系统的安全问题变得尤为重要。尽管软件厂商已经建立自己的测试团队,通过一些漏洞挖掘技术(例如模糊测试)来寻找现有软件中的存在的漏洞,但是随着软件日益复杂,功能日益增多,发布周期日益缩短,测试团队在新版本发布之前只能找到部分漏洞并进行修复。一旦这些漏洞被发现并且被恶意使用,所有使用该软件的用户将受到影响,甚至造成用户的隐私泄露和财产损失。
漏洞复现是开发人员调试和修复软件漏洞的关键步骤。完成本地的漏洞复现是十分重要的,一方面,开发人员可以详细的检测软件发生崩溃时的状态信息以便找到发生错误的原因,另一方面,本地测试也可以检查漏洞是否修复成功。
特别的是,在可配置系统里缺失安装/配置信息对漏洞复现有很大影响。首先,开源软件在现在的计算机系统中扮演了关键的角色,某些开源软件支持很多可定制化的功能,在编译的时候可以根据自己的需求进行编译;其次,高度可配置的软件系统不能精确的预测软件编译选项,更为重要的是,存在一些漏洞是与软件配置选项相关的,该类漏洞将只存在于特定的软件配置选项中。Abal在文章中指出,人们对对于软件配置选择导致的程序出错并没有深入的理解,由于像Linux Kernel这样的大型软件,以及缺少分析软件配置选项的工具,导致一旦在某些特定的配置选项中出现问题,开发人员将很难定位和修复。因此,迫切的需要一种有效的方法恢复可配置系统中的安装/配置信息。
国内外学者已提出许多关于漏洞复现的技术和工具。大致分为两个方向:1.漏洞的修复和诊断,更加关注漏洞的运行结果复现,例如:如何生成可以触发崩溃的输入文件等;2.漏洞复现过程中不同的信息对漏洞复现产生的影响,当关键信息缺失时可能导致漏洞复现失败。
漏洞的修复和诊断常见两种方法:基于动态信息的“记录-重现”和基于静态信息的内存快照。
基于动态信息的记录-重现方法。一部分方法是通过对每个方法的入口进行插桩,记录程序在运行时的函数调用关系和参数位置信息,当程序崩溃时,利用记录的信息生成测试用例用于触发崩溃。另一部分收集程序执行时的状态信息,然后根据收集到的信息使用符号执行进行模拟执行,并且利用符号执行技术进行约束求解,进而发现可能的测试输入,再结合ad-hoc搜索策略来生成测试输入来触发崩溃。
基于静态信息的内存快照方法。该方法避免“记录-重现”工作需要对软件进行插桩,仅仅通过操作系统本身收集到的进程崩溃时的内存堆栈信息(core dump),并且结合信息结合遗传测试工具EvoSuite来生成能够触发崩溃的测试集。通过使用内存堆栈信息,摆脱了对性能开销较高的插桩的依赖,降低了系统在运行时的开销,提高了运行效率。
漏洞复现中信息缺失可能导致漏洞复现失败。Dhaliwal从10个Firefox发行版本中收集大量的崩溃报告和漏洞进行调研,分析了栈信息对漏洞复现的影响。Mu针对真实世界中的漏洞进行了大规模并且有深度的复现实验,研究探索提高可复现性的方案,并且首次深入地理解大众报告的漏洞的重现困难程度。通过定量和定性的分析方法,指出在漏洞报告中仍然确实很多关键因素导致漏洞复现失败(例如安装信息,如何从源码编译生成含有漏洞的可执行文件),并且提出一些标准化漏洞报告方法。
不幸的是,在漏洞的修复和诊断中几乎所有的工作都假设已经存在可以产生崩溃的可执行文件,但是实际上软件系统为了适配更多的使用人群,通常软件系统会含有各种各样的可配置选项供不同需求的人来使用,因此系统编译生成的可执行文件可能有很多,导致软件开发人员并不能够轻易的得到可以产生崩溃的可执行文件。特别是开源系统,用户可以根据自己的需求自定义软件配置选项,导致从源代码到可以产生崩溃的可执行文件之间仍然具有很大的距离。
由此可见,在可配置系统中,当缺失安装/配置信息时,漏洞复现将变得更为困难。
发明内容
发明目的:本发明为了克服当缺失安装/配置信息时,可配置系统进行漏洞复现困难的问题,提供一种可配置系统漏洞复现系统以及复现方法,推断崩溃二进制使用的软件配置选项。
为了解决上述技术问题,本发明公开了一种基于相似度的可配置系统漏洞复现系统,包括:
差异分析模块,提取二进制差异,并且将差异映射到源代码级别;提取二进制差异利用二进制差异分析软件BinDiff生成的比较数据。
特征提取模块,包括源代码特征提取和二进制特征提取,源代码特征提取基于源代码分析工具TypeChef生成的抽象语法树VAST,并且在抽象语法树VAST上提取代码的约束依赖,二进制特征提取基于二进制反汇编工具IDA(Interactive DisassemblerProfessional)提取二进制特征;特征包括基本的字符串、常量、函数调用;
匹配模块,利用特征提取模块生成的特征进行匹配,包括粗粒度的函数级特征匹配和细粒度的组合特征匹配。
差异分析模块,用于提取默认二进制与目标二进制之间的差异,并且将该差异对应到源代码级别,差异体现在函数级别;
通过BinDiff获得二进制差异的数据库,使用Python对数据库中信息进行提取和分析,使用networkx函数库对数据库中的信息进行建模,以基本块为节点构建函数控制流图,并且对差异节点进行记录。寻找差异节点的最短公共父节点和最短公共子节点,以便利用调试信息将二进制差异对应到源代码中。二进制与源代码对应使用默认二进制中调试信息,将二进制差异控制在源代码的某个范围之内。所谓基本块,是指程序:顺序执行的语句序列,其中只有一个入口和一个出口,入口就是其中的第—个语句,出口就是其中的最后一个语句。通俗来讲,通常作为程序分析的基本单元。
特征提取模块,用于提取源代码和二进制特征;
源代码特征提取,通过遍历VAST树完成特征提取,根据不同的需求可以提取不同的特征。函数匹配需要整个函数的一些特征,因此VAST的遍历以函数入口为起始位置,遍历整个函数,提取字符串等特征。为了增加匹配精准度,在代码范围较小的片段提取条件分支(例如if语句)结构特征。在提取特征时,每一个特征都需要记录与之对应的约束条件,以便在函数匹配时进行约束求解。
二进制特征提取使用IDA作为反汇编工具,IDA提供了Python编程接口,可以编写脚本提取需要的特征。在提取二进制特征时,使用Python软件库(networkx包)对IDA的数据进行封装,对于二进制中的指令,只保留关键指令,例如比较指令(cmp),字符串,常量等,将其余指令去除。保留的指令根据原有的图结构连接,这时可以得到一个只含有关键指令的图结构,在本文的后续匹配过程中,都将在该图结构上进行匹配。
特征匹配是在二进制中搜索源代码特征是否存在。对于简单特征而言,只需要在二进制图上进行搜索,遍历所有节点匹配源代码特征即可,使用networkx可以很方便的遍历图的所有节点。而对于组合特征,因为组合特征有一定的结构信息,将组合特征构建成一个小的图结构,相当于在二进制的图结构中搜索源代码的图结构。值得注意的是,在匹配组合特征时,以比较指令(cmp)为匹配根节点,依次匹配判断条件和内容,这样的好处可以提高匹配效率。
特征匹配会将源代码与二进制进行匹配,而源代码存在则有一定的约束条件,约束条件由一些宏的表达式组成。设计并实现约束条件的词法分析和求解,将每一个约束条件构建AST,第一步划分单词和操作符,第二步利用逻辑表达式的文法将表达式解析为AST树,最后遍历AST树生成符合约束求解器(Z3)的输入格式,最后将得到每一个宏应该的取值,最终可以对应于软件配置选项。
本发明提供一种基于相似度的可配置系统漏洞复现方法,包括以下步骤:
步骤1,分析编译系统和源代码,建立软件配置选项与源代码之间的控制关系;
步骤2,使用与崩溃二进制相同的编译器相关信息和默认软件配置选项由源代码构建本地生成二进制,作为默认二进制,崩溃二进制则作为目标二进制;
步骤3,使用BinDiff二进制差异分析软件,分析默认二进制与目标二进制的差异,并将该差异映射到源代码中;
步骤4,提取源代码与二进制特征进行匹配,确认二进制差异是否由软件配置选项引起的,最终确定目标二进制所使用的软件配置选项。
步骤1中,编译系统读取用户自定义软件配置选项,生成符合用户配置要求的配置文件,最终编译生成二进制文件。编译系统控制最终的生成二进制文件的方式分为两类:一类是,编译系统在configure脚本中直接控制某些文件,当用户通过运行命令./configure--with-lzma后,选项with-lzma为开启状态,与该选项相关的源代码文件将被编译到二进制中;另一类是,编译系统在configure脚本运行过程中会定义一些宏,通常定义在config.h文件中,而在源代码文件使用条件编译指令(#if、#ifdef)控制与软件配置选项相关的代码,当软件编译时,编译器将读取config.h文件中对应宏的值,选择编译对应的代码。
条件编译控制与软件配置选项相关代码时,使用宏作为中介。利用TypeChef分析源代码中所有宏与代码块之间的依赖关系,并且生成含有宏节点的抽象语法树(VAST),以便提取源代码的约束依赖条件。
步骤2中,假设已知目标二进制的编译器相关信息,例如编译器,版本,优化等级等。使用与目标二进制相同的编译器信息和默认的软件配置信息,并且增加调试选项,生成含有调试信息的默认二进制,用于和目标二进制进行比对。
使用BinDiff分析默认二进制与目标二进制,建立函数之间对应关系,并且分析函数之间存在的差异。将所有函数分为3类:1.只在默认二进制中;2.只在目标二进制中;3.两个二进制中都存在,此时分析函数内存在的差异。
只在默认二进制中。该函数仅仅存在默认二进制当中,显而易见,在生成目标二进制时,该函数不应该被编译到二进制当中。因此,首先分析该函数存在的约束条件,通过对约束条件取反,实现函数不被编译到目标二进制中。
只在目标二进制中。该函数仅仅存在目标二进制当中,表示该函数应该被编译到目标二进制当中,但是却不在默认二进制中。对于这一类函数,可以使用一些粗粒度的搜索策略,通过匹配二进制和源代码特征,来确定对应的源代码是哪一个函数,进而进行约束求解确定函数存在的约束条件。
两个二进制中都存在。函数在两个二进制中都存在,则需要进行更细粒度的分析。首先,对完全一致的函数进行存在条件提取(函数被编译到二进制中需要满足的约束条件),并且通过约束求解得到约束条件的值。然后,分析函数匹配成功,但是相似度不完全一致的函数。该类函数首先进行源代码分析,查看函数内部是否与某些宏相关,如果函数内部没有宏,那么函数在二进制上的差异可能由于其他原因导致的,可以认为该函数的差异是误报。其次函数内部如果存在宏,那么需要进一步提取函数在二进制上的差异块。
最终需要将差异需要映射到源代码上,但是可能存在差异的基本块没有调试信息,将无法映射到源代码层面(目标二进制不含有调试信息)。为了利用调试信息找到对应的源代码,首先需要找到最短公共父节点和最短公共子节点,也就是说,从父节点出发到子节点的路径,可以覆盖所有的差异基本块。而父节点和子节点在默认二进制和目标二进制都存在对应关系,可以利用调试信息将二进制的指令对应到源代码级别。
为了识别某一个宏控制的源代码是否在二进制中存在,需要提取二进制和源代码的某些特征进行匹配,从而验证宏控制的代码是否存在与二进制当中。特征提取包括二进制特征提取和源代码特征提取
分析步骤3中所对应的源代码,在VAST上分析并提取源代码特征,并且包括源代码的约束条件;分析步骤3中二进制对应的存在差异的代码块,使用IDA提取二进制特征。源代码和二进制特征选择字符串、常量、函数调用和全局变量等信息,因为这些特征比较简单,并且在均存在与源代码和二进制中,不会受到编译器编译优化的影响。利用特征进行代码匹配,以确定差异二进制代码是否由软件配置选项引起的(软件配置选项会导致不同的代码编译到二进制中)。
本发明提供一种基于相似度的可配置系统漏洞复现方法及系统,通过分析编译系统和源代码,建立软件配置选项与源代码之间的控制关系;使用默认软件配置选项编译生成默认二进制,利用二进制差异分析软件(BinDiff),分析默认二进制与目标二进制的差异,并将该差异映射到源代码中;结合软件配置选项与源代码之间的控制关系,确认二进制差异是否由软件配置选项引起的,最终确定目标二进制所使用的软件配置选项。该方法及系统能够在缺失安装/配置信息条件下有效的推断崩溃二进制使用的软件配置选项,节省软件开发人员和安全分析人员进行漏洞复现时所需要的时间。
附图说明
下面结合附图和具体实施方式对本发明做更进一步的具体说明,本发明的上述和/或其他方面的优点将会变得更加清楚。
图1为本发明实施例的一种基于相似度的可配置系统漏洞复现方法的整体流程示意图;
图2为本发明实施例的一种基于相似度的可配置系统漏洞复现系统整体结构示意图;
图3为BinDiff分析二进制差异示意图;
图4为约束求解示意图。
图5为约束表达式转换为约束求解器(Z3)支持的格式示意图。
具体实施方式
漏洞复现是开发人员调试和修复软件漏洞的关键步骤,完成本地的漏洞复现是十分重要的。但是实际上软件系统为了适配更多的使用人群,通常软件系统会含有各种各样的可配置选项供不同需求的人来使用,导致开发人员在本地进行漏洞复现时不得不关注用户使用的软件配置选项。
本发明假设已知可以产生崩溃的二进制文件使用的编译器相关的信息(编译器、编译器版本、优化选项、系统架构),并且可以获得可以产生崩溃的二进制文件,该文件应包含代码段信息,即使无法执行。
本发明提供一种基于相似度的可配置系统漏洞复现方法,包括:分析编译系统和源代码,建立软件配置选项与源代码之间的控制关系;使用与崩溃二进制(目标二进制)相同的编译器相关信息和默认软件配置选项,由源代码构建默认二进制,使用BinDiff二进制差异分析软件,分析默认二进制与目标二进制的差异,并将该差异映射到源代码中;提取源代码与二进制特征进行匹配,确认二进制差异是否由软件配置选项引起的,最终确定目标二进制所使用的软件配置选项。
请参阅图1,图1为本发明实施例的一种基于相似度的可配置系统漏洞复现方法的整体流程示意图,如图1所示,该二进制漏洞代码克隆检测方法,包括:
步骤1,分析编译系统和源代码,建立软件配置选项与源代码之间的控制关系;
编译系统读取用户自定义软件配置选项,生成符合用户配置要求的配置文件,最终编译生成二进制文件。编译系统控制最终的生成二进制文件的方式分为两类:一类是,编译系统在configure脚本中直接控制某些文件,当用户开启选项with-lzma时,这些源代码文件将被编译到二进制中;另一类是,编译系统在configure脚本运行过程中会定义一些宏,通常定义在config.h文件中,而在源代码文件使用条件编译指令(#if、#ifdef)控制与软件配置选项相关的代码,当软件编译时,编译器将读取config.h文件中对应宏的值,选择编译对应的代码。
条件编译控制与软件配置选项相关代码时,使用宏作为中介。利用TypeChef分析源代码中所有宏与代码块之间的依赖关系,并且生成含有宏节点的抽象语法树(VAST),以便提取源代码的约束依赖条件。
步骤2,使用与崩溃二进制相同的编译器相关信息和默认软件配置选项由源代码构建本地生成二进制;
假设已知目标二进制的编译器相关信息,例如编译器,版本,优化等级等。使用与目标二进制相同的编译器信息和默认的软件配置信息,并且增加调试选项,生成含有调试信息的默认二进制,用于和目标二进制进行比对。
步骤3,使用BinDiff二进制差异分析软件,分析默认二进制与目标二进制的差异,并将该差异映射到源代码中;
使用BinDiff分析默认二进制与目标二进制,建立函数之间对应关系,并且分析函数之间存在的差异。将所有函数分为3类:1.只在默认二进制中;2.只在目标二进制中;3.两个二进制中都存在,此时分析函数内存在的差异。
只在默认二进制中。该函数仅仅存在默认二进制当中,显而易见,在生成目标二进制时,该函数不应该被编译到二进制当中。因此,首先分析该函数存在的约束条件,通过对约束条件取反,实现函数不被编译到目标二进制中。
只在目标二进制中。该函数仅仅存在目标二进制当中,表示该函数应该被编译到目标二进制当中,但是却不在默认二进制中。对于这一类函数,可以使用一些粗粒度的搜索策略,通过匹配二进制和源代码特征,来确定对应的源代码是哪一个函数,进而进行约束求解确定函数存在的约束条件。
两个二进制中都存在。函数在两个二进制中都存在,则需要进行更细粒度的分析。首先,对完全一致的函数进行存在条件提取(函数被编译到二进制中需要满足的约束条件),并且通过约束求解得到约束条件的值。然后,分析函数匹配成功,但是相似度不完全一致的函数。该类函数首先进行源代码分析,查看函数内部是否与某些宏相关,如果函数内部没有宏,那么函数在二进制上的差异可能由于其他原因导致的,可以认为该函数的差异是误报。其次函数内部如果存在宏,那么需要进一步提取函数在二进制上的差异块。
如图3所示,通过BinDiff可以看到两个函数在基本块级别的差异,标号为1的是两个二进制都存在的基本块,标号为2是只存在默认二进制的基本块,标号为3的是只存在目标二进制的基本块。
最终需要将差异需要映射到源代码上,但是可能存在差异的基本块没有调试信息,将无法映射到源代码层面(目标二进制不含有调试信息)。为了利用调试信息找到对应的源代码,首先需要找到最短公共父节点和最短公共子节点,也就是说,从父节点出发到子节点的路径,可以覆盖所有的差异基本块。而父节点和子节点在默认二进制和目标二进制都存在对应关系,可以利用调试信息将二进制的指令对应到源代码级别。
步骤4,提取源代码与二进制特征进行匹配,确认二进制差异是否由软件配置选项引起的,最终确定目标二进制所使用的软件配置选项;
为了识别某一个宏控制的源代码是否在二进制中存在,需要提取二进制和源代码的某些特征进行匹配,从而验证宏控制的代码是否存在与二进制当中。特征提取包括二进制特征提取和源代码特征提取
分析步骤3中所对应的源代码,在VAST上分析并提取源代码特征,并且包括源代码的约束条件;分析步骤3中二进制对应的存在差异的代码块,使用IDA提取二进制特征。源代码和二进制特征选择字符串、常量、函数调用和全局变量等信息,因为这些特征比较简单,并且在均存在与源代码和二进制中,不会受到编译器编译优化的影响。利用特征进行代码匹配,以确定差异二进制代码是否由软件配置选项引起的(软件配置选项会导致不同的代码编译到二进制中)。
如图4所示,二进制特征与源代码特征匹配完成之后,确定每一个源代码所需的依赖条件,使用约束求解器求得一个可满足的解。根据步骤1中分析的软件配置选项与源代码之间/宏的关系,推断软件配置选项是否开启。
图2为本发明实施例的一种基于相似度的可配置系统漏洞复现系统的整体流程示意图,如图2所示,本发明提供一种基于相似度的可配置系统漏洞复现系统,包括特征差异分析模块、特征提取模块和匹配模块,通过各模块的配合实现上述任一实施例中的基于相似度的可配置系统漏洞复现方法,具体实现如下:
差异分析模块,用于提取默认二进制与目标二进制之间的差异,并且将该差异对应到源代码级别,差异体现在函数级别;
具体的,通过BinDiff获得二进制差异的数据库,使用Python对数据库中信息进行提取和分析,使用networkx函数库对数据库中的信息进行建模,以基本块为节点构建函数控制流图,并且对差异节点进行记录。如图3所示,寻找差异节点的最短公共父节点和最短公共子节点,以便利用调试信息将二进制差异对应到源代码中。二进制与源代码对应使用默认二进制中调试信息,将二进制差异控制在源代码的某个范围之内。
特征提取模块,用于提取源代码和二进制特征;
具体的,源代码特征提取,通过遍历VAST树完成特征提取,根据不同的需求可以提取不同的特征。函数匹配需要整个函数的一些特征,因此VAST的遍历以函数入口为起始位置,遍历整个函数,提取字符串等特征。为了增加匹配精准度,在代码范围较小的片段提取if结构特征,这时遍历入口位置为if节点。在提取特征时,每一个特征都需要记录与之对应的约束条件,以便在函数匹配时进行约束求解。
二进制特征提取使用IDA作为反汇编工具,IDA提供了Python编程接口,可以编写脚本提取需要的特征。在提取二进制特征时,使用Python的软件库(networkx包)对IDA的数据进行封装,对于二进制中的指令,只保留关键指令,例如比较指令(cmp),字符串,常量等,将其余指令去除。保留的指令根据原有的图结构连接,这时可以得到一个只含有关键指令的图结构,在本文的后续匹配过程中,都将在该图结构上进行匹配。
匹配模块,用于匹配源代码与二进制特征,并且对匹配成功的源代码进行约束求解,最终得到软件配置选项。
特征匹配是在二进制中搜索源代码特征是否存在。对于简单特征而言,只需要在二进制图上进行搜索,遍历所有节点匹配源代码特征即可,使用networkx可以很方便的遍历图的所有节点。而对于组合特征,因为组合特征有一定的结构信息,将组合特征构建成一个小的图结构,相当于在二进制的图结构中搜索源代码的图结构。值得注意的是,在匹配组合特征时,以cmp指令为匹配根节点,依次匹配判断条件和内容,这样的好处可以提高匹配效率。
特征匹配会将源代码与二进制进行匹配,而源代码存在则有一定的约束条件,约束条件由一些宏的表达式组成。设计并实现约束条件的词法分析和求解,将每一个约束条件构建AST,第一步划分单词和操作符,第二步利用逻辑表达式的文法将表达式解析为AST树,最后遍历AST树生成符合约束求解器(Z3)的输入格式,如图5所示。最后将得到每一个宏应该的取值,最终可以对应于软件配置选项。
实施例
需要以一个具体的漏洞为例子,将本发明的过程以具体的步骤形式,将各个算法内容具体化说明一遍。
为了便于理解任一实施例中的方法,以CVE-2018-14567为例,详细描述软件配置选项的推断过程:
第一步,分析编译系统和源代码,建立软件配置选项与源代码之间的控制关系。
分析编译系统,对configure脚本文件进行分析,每一个软件配置选项在configure脚本中存在对应的变量,该变量会在运行时对配置文件中的宏进行定义,而宏一般为源代码中控制具体代码块的条件编译变量。例如:软件配置选项with-lzma在configure脚本中对应的变量为WITH_LZMA,脚本在运行时根据变量WITH_LZMA的值定义宏LIBXML_LZMA_ENABLED。
分析宏与源代码之间的关系,使用TypeChef分析所有代码并且生成VAST,并且记录每一个VAST节点与宏的约束关系,即代码在条件编译时被编译到二进制中需要满足的约束条件,最终将建立软件配置选项与源代码之间的控制关系。例如:在函数xmlParserInputBufferGrow中,宏LIBXML_LZMA_ENABLED控制整个条件分支语句,从而可以得到软件配置选项with-lzma开启,该条件分支语句将被编译到二进制中。
第二步,使用与目标二进制相同的编译选项并且使用默认软件配置选项,在本地编译生成默认二进制。
第三步,使用BinDiff二进制差异分析软件,分析默认二进制与目标二进制差异,可以得到默认二进制和目标二进制在函数中存在差异,提取具体的差异代码块,将该差异映射到源代码具体行号。例如图3展示默认二进制与目标二进制在函数层次的差异,利用调试信息可以将该差异映射到源代码行号:3236-3259。
第四步,确认二进制差异是否由软件配置选项引起。分析源代码行号范围内与宏相关的代码块,提取该范围内源代码与二进制差异代码块特征并进行匹配,匹配成功则提取该源代码被编译到二进制中所满足的约束条件,最终确定软件配置选项。例如:在源代码中提取到的特征有:函数调用与条件判断分支;在二进制中提取到的特征有:比较指令(cmp)与函数调用指令(call),此时匹配成功,表明源代码片段应该被编译到二进制中,而该片段满足的约束条件为:LIBXML_LZMA_ENABLED=1。结合第一步中分析的软件配置选项与宏的关系,可以确定该差异由软件配置选项with-lzma引起,进而可以推断目标二进制的软件配置选项应该为:with-lzma=yes。
综上,本发明能够在缺失安装/配置信息条件下有效的推断崩溃二进制使用的软件配置选项,从而辅助开发人员进行漏洞复现,节省软件开发人员和安全分析人员进行漏洞复现时所需要的时间。
本发明提供了一种可配置系统漏洞复现系统以及复现方法,具体实现该技术方案的方法和途径很多,以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。本实施例中未明确的各组成部分均可用现有技术加以实现。

Claims (9)

1.一种基于相似度的可配置系统漏洞复现系统,其特征在于,包括:
差异分析模块,提取二进制差异,并且将差异映射到源代码级别;
特征提取模块,包括源代码特征提取和二进制特征提取,源代码特征提取基于源代码分析工具TypeChef生成的抽象语法树VAST,并且在抽象语法树VAST上提取代码的约束依赖,二进制特征提取基于二进制反汇编工具IDA提取二进制特征;
匹配模块,利用特征提取模块生成的特征进行匹配,包括粗粒度的函数级特征匹配和细粒度的组合特征匹配。
2.根据权利要求1所述的一种基于相似度的可配置系统漏洞复现系统,其特征在于,二进制特征包括字符串、常量和函数调用。
3.根据权利要求1所述的一种基于相似度的可配置系统漏洞复现系统,其特征在于,差异分析模块,用于提取默认二进制与目标二进制之间的差异,并且将该差异对应到源代码级别,差异体现在函数级别;
通过BinDiff获得二进制差异的数据库,使用Python对数据库中信息进行提取和分析,使用networkx函数库对数据库中的信息进行建模,以基本块为节点构建函数控制流图,并且对差异节点进行记录;寻找差异节点的最短公共父节点和最短公共子节点,二进制与源代码对应使用默认二进制中调试信息,根据调试信息找到二进制差异在源代码的开始和结束位置,将二进制差异控制在源代码的函数内部,或者代码片段,包括循环或者分支结构的代码片段。
4.根据权利要求3所述的一种基于相似度的可配置系统漏洞复现系统,其特征在于,源代码特征提取,通过遍历VAST树完成特征提取,VAST的遍历以函数入口为起始位置,遍历整个函数,提取字符串等特征;在提取特征时,每一个特征都要记录与之对应的约束条件,用于在函数匹配时进行约束求解;
二进制特征提取使用二进制反汇编工具IDA,使用Python的软件库networkx对二进制反汇编工具IDA的数据进行封装,对于二进制中的指令,只保留关键指令,将其余指令去除;保留的指令根据原有的图结构连接,得到一个只含有关键指令的图结构;关键指令为比较指令cmp、字符串和常量中的一种或几种。
5.根据权利要求3所述的一种基于相似度的可配置系统漏洞复现系统,其特征在于,特征匹配是在二进制中搜索源代码特征是否存在,对于简单特征,在二进制图上进行搜索,遍历所有节点匹配源代码特征;对于组合特征,将组合特征构建成一张无向图,从而在二进制的图结构中搜索源代码的图结构,以比较指令cmp为匹配根节点,依次匹配判断条件和内容;
特征匹配将源代码与二进制进行匹配,将每一个约束条件构建抽象语法树AST,第一步划分单词和操作符,第二步利用逻辑表达式的文法将表达式解析为AST树,最后遍历抽象语法树AST生成符合约束求解器Z3的输入格式;将得到每一个宏应该的取值,最终对应于软件配置选项,实现漏洞复现。
6.一种基于相似度的可配置系统漏洞复现方法,包括以下步骤:
步骤1,分析编译系统和源代码,建立软件配置选项与源代码之间的控制关系;
步骤2,使用与崩溃二进制相同的编译器相关信息和默认软件配置选项由源代码构建本地生成二进制,作为默认二进制,崩溃二进制则作为目标二进制;
步骤3,使用二进制差异分析软件BinDiff,分析默认二进制与目标二进制的差异,并将该差异映射到源代码中;
步骤4,提取源代码与二进制特征进行匹配,确认二进制差异是否由软件配置选项引起的,最终确定目标二进制所使用的软件配置选项,从而实现漏洞复现。
7.根据权利要求6所述的方法,其特征在于,步骤1中,编译系统读取用户自定义软件配置选项,生成符合用户配置要求的配置文件,最终编译生成二进制文件。编译系统控制最终的生成二进制文件的方式分为两类:一类是,编译系统在configure脚本中直接控制文件,当用户开启选项with-lzma时,源代码文件将被编译到二进制中;另一类是,编译系统在configure脚本运行过程中会定义一些宏,这些宏定义在config.h文件中,而在源代码文件使用条件编译指令(#if、#ifdef)控制与软件配置选项相关的代码,当软件编译时,编译器将读取config.h文件中对应宏的值,选择编译对应的代码;
条件编译控制与软件配置选项代码时,使用宏作为中介,利用TypeChef分析源代码中所有宏与代码块之间的依赖关系,并且生成含有宏节点的抽象语法树VAST,用于提取源代码的约束依赖条件。
8.根据权利要求7所述的方法,其特征在于,步骤2中,在已知目标二进制的编译器信息的条件下,使用与目标二进制相同的编译器信息和默认的软件配置信息,并且增加调试选项,生成含有调试信息的默认二进制,用于和目标二进制进行比对;
使用BinDiff分析默认二进制与目标二进制,建立函数之间对应关系,并且分析函数之间存在的差异;将所有函数分为3类:第1类,只在默认二进制中;第2类,只在目标二进制中;第3类,两个二进制中都存在;
第1类,表示函数仅仅存在默认二进制当中,首先分析该函数存在的约束条件,通过对约束条件取反,实现函数不被编译到目标二进制中;
第2类,表示函数应该被编译到目标二进制当中,但是却不在默认二进制中;使用一些粗粒度的搜索策略,通过匹配二进制和源代码特征,来确定对应的源代码是哪一个函数,进而进行约束求解确定函数存在的约束条件;
第3类,表示函数在两个二进制中都存在,则进行更细粒度的分析;首先,对完全一致的函数进行存在条件提取,函数被编译到二进制中需要满足的约束条件,并且通过约束求解得到约束条件的值;然后,分析函数匹配成功,该类函数首先进行源代码分析,查看函数内部是否与某些宏相关,如果函数内部没有宏,则判定该函数的差异是误报;函数内部如果存在宏,则进一步提取函数在二进制上的差异块;
将差异块映射到源代码上,首先需要找到最短公共父节点和最短公共子节点,从父节点出发到子节点的路径,能够覆盖所有的差异基本块,父节点和子节点在默认二进制和目标二进制都存在对应关系,由此利用调试信息将二进制的指令对应到源代码级别。
9.根据权利要求8所述的方法,其特征在于,分析步骤3中所对应的源代码,在VAST上分析并提取源代码特征,包括源代码的约束条件;分析步骤3中二进制对应的存在差异的代码块,使用IDA提取二进制特征;源代码和二进制特征选择字符串、常量、函数调用和全局变量信息,利用特征进行代码匹配,以确定差异二进制代码是否由软件配置选项引起,从而实现系统漏洞复现。
CN202010597156.8A 2020-06-28 2020-06-28 一种可配置系统漏洞复现系统以及复现方法 Pending CN113849814A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010597156.8A CN113849814A (zh) 2020-06-28 2020-06-28 一种可配置系统漏洞复现系统以及复现方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010597156.8A CN113849814A (zh) 2020-06-28 2020-06-28 一种可配置系统漏洞复现系统以及复现方法

Publications (1)

Publication Number Publication Date
CN113849814A true CN113849814A (zh) 2021-12-28

Family

ID=78972585

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010597156.8A Pending CN113849814A (zh) 2020-06-28 2020-06-28 一种可配置系统漏洞复现系统以及复现方法

Country Status (1)

Country Link
CN (1) CN113849814A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116932037A (zh) * 2023-08-10 2023-10-24 北京大学 一种基于生成式大模型的软件系统配置生成方法与系统

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116932037A (zh) * 2023-08-10 2023-10-24 北京大学 一种基于生成式大模型的软件系统配置生成方法与系统
CN116932037B (zh) * 2023-08-10 2024-03-15 北京大学 一种基于生成式大模型的软件系统配置生成方法与系统

Similar Documents

Publication Publication Date Title
US9208057B2 (en) Efficient model checking technique for finding software defects
US9317408B2 (en) System and method for systematic error injection in generated code
CN101739339B (zh) 一种基于程序动态依赖关系的软件故障定位方法
Tobin-Hochstadt et al. Higher-order symbolic execution via contracts
Kapdan et al. On the structural code clone detection problem: a survey and software metric based approach
CN112256271A (zh) 一种基于静态分析的区块链智能合约安全检测系统
Annamaa et al. An interactive tool for analyzing embedded SQL queries
Silva et al. Flacoco: Fault localization for java based on industry-grade coverage
Zhong et al. Inferring bug signatures to detect real bugs
CN114036072B (zh) 一种支持自动化检测程序缺陷的方法和系统
Chen et al. Analyzing performance-aware code changes in software development process
CN116431476A (zh) 一种基于代码上下文变异的jvm模糊测试方法
CN113836023B (zh) 一种基于体系结构交叉检查的编译器安全性测试方法
Nokhbeh Zaeem et al. History-aware data structure repair using SAT
CN113868136A (zh) 一种基于Go语言可执行形式化语义的程序漏洞分析方法
CN113849814A (zh) 一种可配置系统漏洞复现系统以及复现方法
CN111966578A (zh) 一种安卓兼容性缺陷修复效果的自动化评估方法
Cuomo et al. CD-Form: A clone detector based on formal methods
Nokhbeh Zaeem et al. Repair abstractions for more efficient data structure repair
CN115310095A (zh) 一种区块链智能合约混合形式化验证方法及系统
CN115098355A (zh) 基于历史数据驱动的jvm测试程序生成方法
Borodin et al. Deterministic static analysis
CN110532015B (zh) 面向航天软件的在轨升级系统
Chen et al. Tracking down dynamic feature code changes against Python software evolution
Jiang et al. APP-Miner: Detecting API Misuses via Automatically Mining API Path Patterns

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