1.2 发现缺陷的方法

在现代软件开发环境下,通常将源代码编译或解析成二进制代码,而后作为信息系统的一部分运行,源代码作为软件的原始形态,其存在的缺陷是导致软件漏洞的原因之一。因此,从源代码中发现缺陷并进行修复的过程,是消减软件漏洞的过程。

发现源代码中的缺陷通常有以下三种方法。

1)人工审计

人工对源代码进行走查,依据缺陷的特征进行查找和分析,从而确定是否存在缺陷。

人工审计方式的优势体现在可以发现与业务逻辑等相关的缺陷,这些缺陷与软件实际业务关系紧密,不易形成缺陷模式并固化到自动化检测工具中。

但人工审计对人员的要求非常高,需要相关人员熟悉软件业务、能够读懂源代码且具有丰富的安全知识。即便如此,在面对巨大的源代码量时,单纯通过人工审计的方式难以在有限的时间内发现全部的问题。对于一个项目,很可能会经历较长的时间跨度,经历人员的频繁迭代,因此人工审计发现缺陷的困难度较高。

2)工具审计

工具审计指通过运行源代码缺陷检测工具,自动地发现源代码中存在的缺陷。

自动化检测工具以源代码或者其他工具可接受的中间表示作为输入内容,分析后输出缺陷。自动化检测工具通常内置多种检测规则,在接收到输入内容后,将输入内容转变为易于扫描分析的数据结构,然后使用静态分析技术对其进行分析,从而发现源代码中存在的符合一定模式的缺陷。

这种方法较人工审计效率更高,但存在准确性问题。使用工具检测或多或少会存在误报或者漏报的情况。因此,自动化检测工具开发者仍需不断优化检测技术和检测规则,以降低误报和漏报。

3)人工审计与工具审计结合

人工审计与工具审计结合指先通过工具审计的方式获取检测结果,然后再人工对检测结果进行复审,从而发现缺陷。

较前面两种方式,人工审计与工具审计结合的方式显然更符合快速发现绝大多数缺陷的需求。这种方式去除了单一使用工具审计方法带来的误报,审计结果更为准确,同时还可以通过人工审计对工具审计结果进行补充,发现更多的缺陷。

目前,国内外已有一些常用的源代码审计工具,这些工具通过静态分析技术对源代码进行解析,同时内置了多种缺陷检测模式,可以自动地发现源代码中存在的缺陷。本书第2章至第4章中的实例使用了奇安信代码卫士对源代码进行自动化检测。