2.2.2 漏洞产生条件
漏洞和安全缺陷密不可分。软件系统的不同开发阶段会产生不同的安全缺陷,其中一些安全缺陷在一定条件下可转化为安全漏洞。
1.安全缺陷的定义
安全缺陷是指软件、硬件或协议在开发维护和运行使用阶段产生的安全错误的实例。软件系统在不同的开发阶段会产生不同的安全缺陷。
在问题定义阶段,系统分析员对问题性质、问题规模和方案的考虑不周全会引入安全缺陷。这种安全缺陷在开发前不易察觉,只有到了测试阶段甚至投入使用后才能显现出来。在定义需求规范阶段,规范定义的不完善是导致安全缺陷的最主要原因。在系统设计阶段,错误的设计方案是安全缺陷的直接原因。在编码实现阶段,安全缺陷可能是错误地理解了算法导致了代码错误,也可能是无意的代码编写上的一个错误等。在测试阶段,测试人员可能对安全缺陷出现条件判断错误,修改了一个错误,却引入了更多安全缺陷。在维护阶段,修改了有缺陷的代码,却导致了之前正确的模块出现错误等。
特别地,由于产生安全缺陷的阶段可以是在开发阶段,也可以是在使用阶段,因此,安全缺陷不一定是指代码编写上的错误,也可以是由于用户的使用错误或配置错误。例如,在没有任何相关安全防护措施的基础上,用户错误地将某些Web服务器端口打开,或是错误地配置一些参数,启用一些不安全的功能等。
2.安全缺陷分类
为了有效地对安全缺陷进行预防、发现和修复,就要将这些安全缺陷进行相应的分类。我们介绍最具有代表性的软件安全缺陷分析方法:通用缺陷枚举分类法CWE。
通用缺陷枚举(Common Weakness Enumeration,CWE)是一套统一的、可度量的软件缺陷描述体系,是社区开发的常见软件安全漏洞列表,是软件安全工具的衡量标准,也是弱点识别、缓解和预防工作的基准。
CWE是一种包括类缺陷、基础缺陷和变种缺陷等多层次的体系。其中类缺陷(Class Weakness)指的是用一个抽象形式去描述缺陷,通常独立于任何特定的语言或技术,比基础缺陷更常见,使用C表示。基础缺陷(Base Weakness)是指用一个抽象形式去描述缺陷,但是给出了具体的细节去推断检测与预防的方法,比类缺陷更详细,使用B表示。变种缺陷(Variant Weakness)是在非常低的细节层次上描述的一种缺陷,其局限于一个特定的语言或技术,比基础缺陷更具体,使用V表示。
CWE针对不同的用途设计了词典、开发和研究三种视图(View)。词典视图(Comprehensive CWE Dictionary)是将所有的缺陷以字母表的顺序排列以供查阅。开发视图(Development View)是针对软件开发者的,该分类以软件开发周期为参照对缺陷进行分类;研究视图(Research View)是针对学术人士的,该视图从一个内在性质等方面对缺陷进行分析分类。在CWE中,为了便于识别,每一个条目或是名词都被赋予一个唯一的ID,其基本形式是CWE-XXX,如研究视图的标号为CWE-1000。下面将重点介绍后两类分类方法。
(1)CWE开发角度的分类。从开发者的角度对缺陷进行分类的基本思想可归纳为根据软件开发过程中可能遇到的安全问题来对缺陷进行分类,这种分类方法特别适合于软件开发者、测试者以及评估者。该分类包含699个条目,涵盖缺陷在开发或者发布过程中可能出现的环节,如代码、配置和环境。以源代码缺陷为例,则其中共包括9类缺陷:经典的缓冲区溢出缺陷、相对路径遍历、没有保护网页结构、不受控制的格式化字符串、空指针引用、不恰当的输入验证、不恰当的编码或输出泄露、外部控制文件名称或路径、资源不恰当的关闭或释放以及没有检查返回值。
(2)CWE研究角度的分类。该分类方法不关心缺陷的检测、缺陷的位置、缺陷何时引入等问题。主要通过对软件的行为和行为所涉及的资源进行抽象的方法,为缺陷的分类和维护提供了一种形式化的机制。此分类包含663个条目,分为类、基础和变种。基于类层的缺陷描述抽象,与编程语言和基础均无关。基础层对缺陷的描述处于类和变种之间,通过基础层描述可以获得检测和缺陷防范的方法。变种层描述缺陷则详细地涉及编程语言、技术、风格和资源类型等底层信息。