软件供应链安全:源代码缺陷实例剖析
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3 自动化缺陷检测技术

自动化判断源代码中是否存在缺陷通常采用静态分析的方法。由于静态分析的过程不受程序输入或者执行环境等因素的影响,因此有可能发现传统动态分析方法难以发现的程序漏洞。具体来说,静态分析指在不运行软件的前提下进行的分析过程,分析对象可以是源代码,也可以是可执行代码或某种形式的中间代码(如Java程序的字节码)。

本书主要介绍以源代码作为分析对象的静态分析方法。以源代码作为分析对象,一方面,可以在程序开发阶段辅助开发人员发现代码中存在的问题,以便对相应的代码及时做出修改,提高软件的质量,且在程序的开发阶段,程序的源代码是可见的;另一方面,相对于分析程序编译后的代码,对源代码的分析常常可以利用源代码中丰富的语义信息,从而使分析更加全面。使用静态分析方法,可以更加全面地考虑执行路径的信息,因此能够发现更多的缺陷。自动化缺陷检测技术如下。

1)语法分析技术

语法分析指按具体编程语言的语法规则处理词法,分析程序产生的结果并生成语法分析树的过程。这个过程可以判断程序在结构上是否与预先定义的BNF范式相一致,即程序中是否存在语法错误。程序的BNF范式一般由上下文无关文法描述。支持语法分析的主要技术包括算符优先分析法(自底向上)、递归下降分析法(自顶向下)和LR分析法(自左至右、自底向上)等。语法分析是编译过程中的重要步骤,也是其他分析的基础。

2)类型分析技术

类型分析主要指类型检查。类型检查的目的是分析程序中是否存在类型错误。类型错误通常指违反类型约束的操作,如让两个字符串相乘、数组的越界访问等。类型检查通常是静态进行的,但也可以动态进行。编译时进行的类型检查是静态检查。对于一种编程语言,如果它的所有表达式的类型可以通过静态分析确定下来,进而消除类型错误,那么这个语言是静态类型语言(也是强类型语言)。利用静态类型语言开发出的程序可以在运行程序之前消除许多错误,因此程序质量的保障相对容易(但表达的灵活性相对弱)。

3)控制流分析技术

控制流分析的输出是控制流图,通过控制流图可以得到关于程序结构的一些描述,包括条件、循环等信息。控制流图是一个有向图,图中的每个节点对应一个基本块,而边通常对应分支方向。

4)数据流分析技术

数据流分析用于获取有关数据如何在程序的执行路径上流动的信息。在程序的控制流图上,计算出每个节点前、后的数据流信息,通过数据流分析可以生成数据流图。数据流分析广泛应用于静态分析中,可对变量状态(如未使用变量、死代码等)进行分析。同时,污染传播分析也是数据流分析技术的一种应用。