一种静态二进制漏洞挖掘方法与流程

文档序号:31877241发布日期:2022-10-21 22:03阅读:217来源:国知局

1.本发明涉及一种静态二进制漏洞挖掘方法。


背景技术:

2.在软件漏洞检测的领域,源码级的静态分析仍然是主流。虽然源码级的分析能带来较好的漏洞检测效果,然而现实中它并未对行业带来预想中的安全提升。究其原因,不是每一个厂商都专注于软(固)件的安全。当拥有源码的厂商不愿意去做代码审计的时候,基于二进制的漏洞分析就显得相当有价值。
3.现有的方案主要有两个。国内有刚发布的binabsinspector,而国外则有cwe_checker。这两个方案的共同点,他们都是基于ghidra的分析,以插件形式提供服务。
4.由于现有方案的基础解析部分都来源于ghidra,因此不论这些方案自身表现如何,他们的成功率首先受限于ghidra的正确率。由于是插件形式的实现,这些方案自身无法对ghidra的基础分析进行改进。而ghidra作为一款开源的分析工具,虽然架构支持面广,但也因此导致战线过长,不少架构的分析不到位,存在各种各样的问题。
5.其次,这些工具对cwe(common weakness enumeration)的支持是以内置的方式实现。它们的cwe规则直接以代码形式存在于各自的项目中,且不提供自定义规则的接口。若用户想要使用自定义的规则,那么首先要自行阅读项目源码并了解该方案的内部接口(没有文档),然后根据这些内部接口撰写新规则,最后将这个新规则加到项目源码中,编译得到新的插件。这些项目所编译出来的是原生二进制程序。相较于需要解析执行的程序,它们不仅需要对应平台的工具链进行编译,编译过程中也更可能出现诸如缺少依赖等问题。这个流程工序繁复,耗费时间,且成功率得不到保证。


技术实现要素:

6.针对现有技术中的不足,本发明的目的是提供一种流程工序简单,节约时间,且成功率能够得到保证的静态二进制漏洞挖掘方法。
7.本发明解决其技术问题所采用的技术方案是:
8.一种静态二进制漏洞挖掘方法,包括:
9.解析可执行文件,获取可执行代码段以及数据段;
10.依据解析结果获知可执行代码段,将可执行代码转化为汇编语言表述;
11.对表述的汇编语言进行分析,将可执行代码重新划分成一个个函数,函数内划分成一个个代码块;
12.进行代码块重组,根据计算机图论对各个代码块识别,并构建出这些块的嵌套关系;
13.以块为单位构建中间码表述;
14.将中间码用到的地址转化成变量形式表示;
15.对所得到的变量从函数层面进行索引,挖掘执行漏洞。
16.作为优选,该可执行文件为elf格式的二进制文件。
17.作为优选,解析可执行文件的方法为:将文件按节表的信息,把文件内容加载到内存中,并获取可执行代码段以及各个数据段。
18.作为优选,将可执行代码转化为汇编语言表述的方法为:依据elf中e_machine的值获知上述可执行代码所对应的指令集平台,并启动和该平台相应的反汇编引擎,将这些二进制可执行代码转化为汇编语言表述。
19.作为优选,对表述的汇编语言进行分析的方法为:根据各指令集平台的约定规则进行函数头部/尾部识别。
20.作为优选,根据计算机图论对各个代码块识别的方法为:将各个代码块识别为if/else/switch/case块,并构建出这些块的嵌套关系。
21.作为优选,以块为单位构建中间码表述的方法为:将汇编表述翻译为一套自订的中间语言。
22.作为优选,对所得到的变量从函数层面进行索引的方法为:使用binql的查询语言撰写规则,将该获取用户输入的函数列为数据源,将带有命令执行功能的函数列为输出源;将该规则传入到binql引擎进行处理,当存在一个路径,这个不安全的用户输入会被送入命令执行类函数,那么binql就会告警,发现一个潜在的任意命令执行漏洞。
23.作为优选,binql引擎进行处理的方式为:binql查询函数调用不安全的函数的位置,以及函数的变量中存放的不安全的输入,以及这个变量被传送到的变量/函数参数,从而探测所有的路线。
24.本发明的有益效果是:
25.现有的其他方案都依赖于ghidra这一引擎,对于这些方案而言,ghidra的内部实现是不可控的;另外,本方案所提出的一套查询语言,可允许用户自行撰写漏洞规则并交由本方案进行全自动处理,这个过程不需要用户对项目本身作出任何修改,反观现有方案,它们既不提供外部接口接受新规则,也没有给出内部接口的文档,若要增加对新漏洞种类的描述,则只能自行增补源码并编译。
具体实施方式
26.以下结合对本发明的原理和特征进行描述,所举实例只用于解释本发明,并非用于限定本发明的范围。在下列段落中以举例方式更具体地描述本发明。根据下面说明和权利要求书,本发明的优点和特征将更清楚。
27.除非另有定义,本文所使用的所有的技术和科学术语与属于本发明的技术领域的技术人员通常理解的含义相同。本文中在本发明的说明书中所使用的术语只是为了描述具体的实施例的目的,不是旨在于限制本发明。本文所使用的术语“及/或”包括一个或多个相关的所列项目的任意的和所有的组合。
28.实施例
29.一种静态二进制漏洞挖掘方法,以一个elf格式的二进制文件可执行文件为例,包括以下步骤:
30.第一步是解析elf格式,该过程和计算机加载elf文件的流程类似,将文件按节表的信息,把文件内容加载到内存中,并获取可执行代码段以及各个数据段;
31.第二步则是依据elf中e_machine的值获知上述可执行代码所对应的指令集平台,并启动和该平台相应的反汇编引擎,将这些二进制可执行代码转化为汇编语言表述;
32.第三步则是对上述反汇编结果进行分析,根据各指令集平台的约定规则进行函数头部/尾部识别,将扁平的可执行代码重新划分成一个个函数,函数内划分成一个个代码块;
33.第四步是代码块重组,根据计算机图论将各个代码块识别为if/else/switch/case等块,并构建出这些块的嵌套关系;
34.第五步则是以块为单位构建中间语言表述。此处概念上和llvm的中间码类似,将汇编表述翻译为一套自订的中间语言,第五步是针对中间码的收缩和优化;
35.而第六步是将中间码用到的地址转化成变量形式表示。
36.上述这些步骤由自主研发的另一套反编译系统所实现,具体如下:
37.本方案承接上述步骤,将上述第六步中所得到的变量从函数层面进行索引,对于局部变量,上述第五步所使用到的静态单变量表述,揭示了局部变量之间的数据流动。对于带有全局性质的变量,如全局变量和函数入口地址等,则可以枚举每一个函数中所有的全局性质的引用,并根据这些引用构造出一个【目标】-》【源】的交叉引用映射表。比如,给定一个函数入口地址(目标),可以根据这个映射表查询到所有的调用源。当局部引用和全局引用全部组合起来构成一份索引,那么给定一个任意的输入源,这个输入的所有可能流向的地方都能被探查出来。例如,某个固件中的某个函数返回了不安全的用户输入,现要了解该固件是否存在任意代码执行漏洞。使用binql的查询语言撰写规则,将该获取用户输入的函数列为数据源,将诸如system等带有命令执行功能的函数列为输出源,然后将该规则传入到binql引擎进行处理。binql会查询,哪些函数在什么位置调用了这个不安全的函数,这个不安全的输入存放在这个函数的什么变量中,而这个变量又将被传送到哪个变量/函数参数中,这些所有的路线都能被探测出来。如果存在一个路径,这个不安全的用户输入会被送入命令执行类函数,那么binql就会告警,发现一个潜在的任意命令执行漏洞。
38.反编译系统能解析并生成针对目标二进制程序的伪代码。相比原生的汇编程序,伪代码贴近程序员所编写的程序,便于研究人员深入理解目标二进制程序的逻辑。然而,尽管伪代码便于人类理解,伪代码的本身并未对机器分析提供帮助。在这个资讯爆发的年代,对二进制程序的漏洞分析已不能停留于对研究人员的协助,而是要有一套完整的自动化漏洞分析机制。漏洞研究人员的主要职能,将从过去的漏洞挖掘,转变为设计漏洞挖掘规则,将规则交由漏洞挖掘方案进行自动化挖掘,并作最终的漏洞验证。
39.如要实现上述目的,现有的二进制反编译系统必须为机器自动化作相应的升级。无论是何种漏洞,其核心都涉及数据的流动及处理。伪代码虽然能展示出这些数据关系,但并不直观。比如,现发现某一函数中的某个变量是作为数组下标被用于数组读写,若该变量可被恶意控制,那么该函数就存在数组越界漏洞,实现拒绝服务攻击甚至任意地址读写。然而,这个变量从何而来,是程序内部根据缓冲区大小等程序内部信息所计算得到,还是说这个变量来源于程序外部所传进来的参数,显然,这些问题并不能完全靠二进制反编译解决。幸运的是,二进制反编译的过程中生成了各种数据,而这些数据能被有效地整合起来,以解决上述问题。
40.若要实现自动化挖掘,首先要整理出各个变量,以及他们之间的引用关系。当机器
执行一个二进制程序时,事实上在机器眼中并没有变量的概念,而只有指针。比如,一个函数的各种局部变量,在机器眼中就是栈指针再加上其在编译过程中所决定的一个偏移量。然而,在大多数情况下,漏洞分析都是以变量为单位,指针和偏移量这两者本身不存在意义。在反编译的过程中,指针和偏移量都被转化成对应的变量。对于全局性质的变量,包括全局变量以及各个函数的入口,对其的引用存在于函数当中。因此,只需枚举每个函数的所有变量,检测并提取对函数外部的引用,那么就能得到全局性的引用关系。对于局部变量,反编译过程中生成的ssa(静态单赋值)数据直接揭示出各局部变量在其生命周期中的所有读写操作。经过上述处理记录各个变量,并对全/局部引用关系进行整合,针对某二进制文件的数据流动描述就完成了。
41.一套自动化漏洞挖掘方案,除了需要整理好数据流,还需要一套科学的漏洞描述方案,使得漏洞挖掘方案能抽象地理解研究人员所希望挖掘的漏洞类型。针对存在源码的静态漏洞挖掘,业界中最闻名的解决方案非codeql莫属。然而,codeql并不工作于没有源代码的环境中。受codeql的启发,并针对二进制程序的特点进行修改,binql应运而生。binql依旧采用类似sql的语句格式,一行binql语句进行一次查询。binql通过from关键字指定source(数据来源)和sink(数据目的地),where关键字表述对数据的操作。以一个cgi程序的任意命令执行为例,如果它通过get_user_input(parameter_name)获取名为parameter_name的用户输入数据,则source指定为get_user_input函数,sink指定为带命令执行功能的各个系统函数,即system等。在where语句块中,对数据流进行连通性描述,即表述敏感数据是能够从source流向sink。通过这套查询语言,研究人员可以抽象地描述漏洞并交由机器进行漏洞挖掘。
42.除了上述的binql基础构成,binql还有一些针对现实环境的配套解决方案。上面提到,在挖据cgi程序的任意命令执行漏洞中,我们需要得知并制定用户输入源。为了令自动化更进一步,binql的cgi扩充套件可以以前端html/js为输入源,提取参数名称的字符串并和目标cgi程序中的字符串作模糊匹配,使得可以全自动化地感知用户输入源,免去繁琐的手动指定,进一步提升漏洞挖掘效率。
43.本发明的有益效果是:
44.现有的其他方案都依赖于ghidra这一引擎,对于这些方案而言,ghidra的内部实现是不可控的;另外,本方案所提出的一套查询语言,可允许用户自行撰写漏洞规则并交由本方案进行全自动处理,这个过程不需要用户对项目本身作出任何修改,反观现有方案,它们既不提供外部接口接受新规则,也没有给出内部接口的文档,若要增加对新漏洞种类的描述,则只能自行增补源码并编译。
45.本发明的上述实施例并不是对本发明保护范围的限定,本发明的实施方式不限于此,凡此种种根据本发明的上述内容,按照本领域的普通技术知识和惯用手段,在不脱离本发明上述基本技术思想前提下,对本发明上述结构做出的其它多种形式的修改、替换或变更,均应落在本发明的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1