静态分析

静态分析是一种在不执行代码的情况下直接分析软件源代码或者二进制代码的漏洞挖掘技术。一般来说,静态分析技术可以分析代码的完整控制流和数据流,因此,相对于动态测试的漏洞挖掘技术,该技术具有很高的代码覆盖率,从而为降低漏洞挖掘的漏报率提供了必要条件。换句话说,如果代码中存在一个漏洞,在大多数的情况下可以通过静态分析找到它。目前,基于静态分析的漏洞挖掘对象主要集中在不同种类的源代码,比如 C、C++、C#、Java 和 PHP 代码,并且静态分析主要用于在软件开发阶段进行漏洞挖掘。由于静态分析技术不需要实际执行目标代码,因而具有检测过程快,检测过程可重复和检测漏洞种类多等优点,但缺点是容易导致误报。基于静态分析的漏洞挖掘方法包含词法分析、数据流分析、抽象解释和模型检测等。

  1. 词法分析(Lexical Analysis) 词法分析也称为文法结构分析(Grammar Structure Analysis)或者模型匹配 (Pattern Matching)。词法分析把程序代码分割成一个个 token,然后同预先定义好的危险函数集或者是危险模型进行匹配。例如,词法分析可以检测不安全的 C 函数调用,即如果存在 strcpy(),strcat() 这样的函数调用,则报为疑似漏洞。词法分析算法简单易实现,分析速度很快,但是由于该方法忽略了程序代码的数据流,会产生大量的误报。基于词法分析的漏洞检测工具主要有Flawfinder、ITS4, PMD,RATS 和 Findbugs 等。

  2. 数据流分析(Data Flow Analysis) 数据流分析主要用于源代码编译过程中的程序优化。数据流分析首先根据具体的分析需求确定不同的数据流值,然后构建前向或者后向数据流方程,最后通过求解数据流方程获得程序在不同的程序点处的数据流值。数据流分析也可以用在漏洞挖掘当中,基于数据流分析的漏洞挖掘工具主要有 Jlint、Findbugs、Parfait 等。

  3. 模型检测(Model Checking) 模型检测是用于检测程序的属性是否与构建的模型一致的一种程序验证方法。通常情况下,模型检测器以形式化的时序逻辑作为输入,通过状态空间搜索来寻找与时序逻辑相违背的状态,给出反例从而发现漏洞。在实际应用中,模型检测面临建模困难和状态空间爆炸等问题。基于模型检测的漏洞挖掘工具主要有 CBMC、Java Pathfinder、SLAM、BLAST 等。

  4. 抽象解释(Abstract Interpretation) 抽象解释的概念是由 Patrick Cousot、Radhia Cousot 夫妇于 1977 年提出的。抽象解释主要依赖于对程序的近似,通过将程序抽象近似到一个抽象域上进行计算,可以得到程序变量在某个程序点上所有可能的取值集合,并根据这些取值集合来验证程序的安全性。抽象解释定义了 Galois connection 和 Widening、 Narrowing 算子来保证分析带有循环的程序时能够终止和计算的精确性。抽象解释通过抽象近似,损失了真实程序的计算精度,但提升了计算效率,因而被广泛应用于大型软硬件系统的安全性验证。抽象解释的典型代表工具 ASTREE 曾用于 检验法国空中客车公司的空中巴士 A340 和 A380 系列飞机的飞行控制软件,得到了工业界的认可。抽象解释的其他工具还有 Frama-C 等等。

最后更新于