漏洞挖掘综述

2020-09-22  本文已影响0人  慢节奏的L君

    1、什么是漏洞?

    漏洞(vulnerability)是指系统中存在的一些功能性或安全性的逻辑缺陷,包括一切导致威胁、损坏计算机系统安全性的所有因素,是计算机系统在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷和不足。由于种种原因,漏洞的存在不可避免,一旦某些较严重的漏洞被攻击者发现,就有可能被其利用,在未授权的情况下访问或破坏计算机系统。

2、什么是fuzzing?

进行软件漏洞挖掘时,通常有静态分析(staticanalysis)、动态分析(dynamicanalysis)、符号执行(symbolicexecution)、模糊测试(fuzzing)这几种技术手段。

静态分析就是不真正的运行目标程序,但是通过对它进行各种语法、语义、数据流等的分析,来进行漏洞发掘。静态分析是由静态分析软件完成的;它的速度快,但是误报率高。

动态分析就是我们通常见到的大佬们用od一步步跟踪程序运行进行的分析。它的准确率很高,但是需要调试人员丰富的知识储备,而且这种调试方法很难进行大规模的程序漏洞挖掘。

符号执行简单来说,就是试图找到什么输入对应什么样的运行状态,它要去覆盖所有的执行路径。因此,当被分析的程序比较复杂,有很多执行路径时,就会遇到路径爆炸的问题。

模糊测试不需要人过多的参与,也不像动态分析那样要求分析人员有丰富的知识。简单解释,它就是用大量的输入数据自动去执行程序,从而发现哪些输入能够使程序发生异常,进而分析可能存在的漏洞。当前比较成功的fuzzer(执行模糊测试的程序)有AFL、libFuzzer、OSS-Fuzz等,我们的产品也是这类技术中的一种。

3、Fuzzing的技术要点

那么这一项技术主要有哪些难点,或者说影响挖掘效率的点呢?在安全会议上经常能看到对于这些问题的研究,比如2019年USENIX上用粒子群算法来辅助变异操作符的选择,AFL的变体AFLGo其实也是在CSS上发表的。

输入数据

因为要用输入数据去自动执行程序,很明显数据的生成会极大的影响挖掘效率。1.假如目标程序的输入格式是pdf文件,那么不符合该格式的文件就很难进入到目标程序内部进行运行测试。2.即使是符合输入要求的数据,也许数据A和数据B触发相同的执行路径,那么让A和B都运行就是在浪费资源。3.对于单独的数据A,也许其中真正控制执行路径的只是一小部分,那么在其余部分的处理就是在浪费资源。

对于第一个输入格式的问题,generation-basedfuzzer给出了可行的解决方案。简单来说,它要求一些关于输入数据格式的先验知识,这样它就可以更好地根据用户输入数据产生新数据。对于第二和第三个问题,AFL中给出了相应的解决办法。Afl-cmin能够给出输入数据的最小集合,也就是会把上述的A和B留其一;afl-tmin则能够将单个输入文件进行压缩。

变异操作

用户给出的数据是有限的,但是进行fuzz测试需要大量的数据,因此fuzzer会根据用户给出的数据产生新的数据,这一过程即所谓的变异操作。那么变异过程中定义哪些变异操作符(即哪些改变原输入数据的操作)?在一次变异时面对多个变异操作符该选择哪个?选用哪些输入数据进行变异?

提高覆盖率

Fuzz的本质就是用输入去检测当前输入对应的执行路径会不会产生可能的漏洞。因此,如果覆盖更多的路径,就意味着可能检测出更多的漏洞。提高覆盖率更像是一个根本性问题,前两个问题的解决其实也是在提高覆盖率。

4、

我们提出了一种数据流敏感的模糊化解决方案greyone,首先利用经典的特征污点来指导模糊化。采用一种轻量级的、合理的模糊驱动的污点推断(fti)方法,通过在模糊过程中改变输入字节的同时监测变量的值变化来推断变量的污点。针对这个问题,我们提出了一个新的输入优先级模型来确定要探索的分支、要变异的字节以及如何变异。此外,我们使用另一个数据流特征约束符合性,即污染变量到未触及分支中预期值的距离,来调整模糊化的演化方向。

我们的系统在LAVA数据集和19个真实世界程序上对其进行了评估。结果表明,在代码覆盖率和漏洞发现方面,它都优于各种最新的模糊器。在lava数据集中,greyone发现了所有列出的bug,还有336个未列出。在现实世界的程序中,Greyone平均发现了2.12倍的独特程序路径和3.09倍的独特错误比最先进的进化模糊器,包括AFL,Vuzzer,Collafl,Angora和Honggfuzz,而且,Greyone平均发现了1.2倍的独特程序路径和1.52倍的独特错误比最先进的符号解释辅助模糊器Qsym。

上一篇下一篇

猜你喜欢

热点阅读