1 介绍
识别软件漏洞的技术首先可以分为两种不同的方法:静态分析和动态分析。软件的静态分析涉及检查源代码或编译的二进制文件而不执行它的方法。动态分析涉及在运行时检查软件,通常在附加某种调试器之后。
静态分析虽然有用,但通常会产生许多在实践中无法利用的误报,并且需要大量的手动验证工作来确定哪些问题是真正的漏洞。但是,它确实允许在检查整个应用程序时实现完整的代码覆盖率。
这种方法有很多优点,因为自动化的易用性,并且能够测试代码审查过于耗时的非常大的应用程序。
2 软件漏洞
3 漏洞检测
3.1 静态分析
静态代码分析(SCA)技术通常涉及对应用程序源代码的检查或对已编译的二进制代码的反汇编。重要的一点是,被检查的软件没有被执行[72]。静态地分析源代码或二进制代码可以覆盖完整的代码。完全可以检查整个程序。这样做的缺点是,经常会标记出用户在运行时无法触及的问题。从安全的角度来看,这些错误并不重要,因为它们无法被利用。因此就有了分类的问题;通常需要对大量的漏洞进行排序,以识别出安全研究人员感兴趣的一小部分漏洞[69]。在不了解运行时环境的情况下,一些漏洞无法被检测或理解,因此在静态分析期间不太可能被检测到。静态分析的另一个潜在问题是,如果不同时分析这些库,目标程序导入的第三方库中的漏洞就会丢失。这些问题在我们稍后将讨论的模糊处理中都不存在。
一些比较流行的免费静态代码分析工具包括Cppcheck[33]和用于查找C/ c++源代码漏洞的FlawFinder[31],用于PHP的RIPS[29],以及用于Java的FindBugs[13]。流行的商业解决方案可以处理多种编程语言的软件,包括VeraCode[14]