本文分享自华为云社区《应用软件的缺陷分类》,作者:Uncle_Tom 。
软件缺陷分类在已知缺陷管理、缺陷用例库建设、静态检查工具的能力覆盖和横向对比中起着重要的作用。本文参考GB/T-30279, CNNVD,NVD,以及CWE的各种视图, 给出了一个建立适合自己的缺陷分类方法。
最近先后几波同事找到我这边来讨论软件缺陷分类。
业界现在有那些软件缺陷分类可以做为参考,以及如何建立适合自己的缺陷分类?
对于网络安全漏洞,国家在2020年颁布的国标《GB/T 30279-2020 信息安全技术 网络安全漏洞分类分级指南》,并于2021.06.01投入使用。这个标准的网络安全漏洞分类是基于漏洞产生或触发的技术原因对漏洞进行的划分,分类导图如下图所示。标准采用树形导图对漏洞进行分类,首先从根节点开始,根据漏洞成因将漏洞归入某个具体的类别,如果该类型节点有子类型节点,且漏洞成因可以归入该子类型,则将漏洞划分为该子类型,如此递归,直到漏洞归入的类型无子类型节点或漏洞不能归入子类型为止。
按照这个分类标准,国家缺陷漏洞库(CNNVD)将信息安全漏洞划分为26种类型,分别是:配置错误、代码问题、资源管理错误、数字错误、信息泄露、竞争条件、输入验证、缓冲区错误、格式化字符串、跨站脚本、路径遍历、后置链接、SQL注入、注入、代码注入、命令注入、操作系统命令注入、安全特征问题、授权问题、信任管理、加密问题、未充分验证数据可靠性、跨站请求伪造、权限许可和访问控制、访问控制错误、资料不足。
这个分类方式参考了CWE的 3.1版本,3.1版本从2018-03-29 到 2019-01-03使用。目前随着CWE的这几年的快速发展,里面的CWE-16 配置错误,CWE-17 代码问题,已经废弃不再使用。虽然这个分类覆盖了网络安全的主要缺陷类型,但也存在着分类粒度过大,无法完成缺陷分类的全覆盖的问题。
美国国家通用漏洞数据库(NVD)从一开始就参考了CWE 的分类方式对发现的CVE进行缺陷分类指导。
从2008到2016年, 主要参考视图CWE-635 NVD 2008-2016。如下图:
这个版本的分类主要有19个分类。国标的分类和这个分类有很大程度的吻合,可以说基本上一致。
NVD 主要参考CWE的1003视图,如下图。
CWE-1003视图包含 37个一级节点,一共130个分类节点。
随着各种缺陷的不断发现,CWE的分类也在不断的完善过程中,特别是这几年,几乎每年都有3-4此的更新,为了使发现的CVE能够得到尽可能准确的CWE分类,在主页面上特别增加了一个CVE对应CWE的菜单CVE Mapping CWE guidance,协助用户完成对应任务。
同时这几年CWE也连续发布了各年的最危险的25种安全问题,详见:
在进行历年TOP 25的问题的统计过程中,CWE的研究人员也发现了软件问题分类给统计工作带来的困扰,在不断的修正着分类的从属关系,使之保持正交的分类统计方式,避免因问题分类问题导致的缺陷的重复计算。
CWE做为软件缺陷分类的重要标准, 对安全研究、安全标准、缺陷管理起了重要的纽带作用。CWE使代码缺陷不同领域的研究人员在交流安全问题时,能够采用相同的定义,减少了歧义性。
CWE(Common Weakness Enumeration)。CWE被用于以下目的:
更多的介绍见:
CWE-699 开发者视图,这个视图主要以开发者的角度,围绕软件开发中经常使用或遇到的概念来组织弱点。这包括软件开发生命周期的所有方面,包括体系结构和实现。因此,这种观点可以与架构师、开发人员、教育工作者和评估供应商的观点紧密一致。它提供了各种类别,旨在简化导航、浏览和映射。
这个视图包含40个分类,以及399个节点。
CWE-1000 研究者视图, 该视图旨在促进对弱点的研究,包括弱点之间的相互依赖性,并可用来系统地找出CWE内部的理论差距。该视图面向的是学术研究人员、漏洞分析人员和评估工具厂商。它对弱点进行了分类,在很大程度上忽略了如何检测它们,它们出现在代码中的什么地方,以及它们何时被引入软件开发生命周期。相反,它主要是根据软件行为的抽象来组织的。这种分类方法不关心缺陷的检测方法,缺陷在代码中的位置,在软件开发生命周期中何时引入缺陷。该视图主要基于对软件行为进行抽象描述的方法组织归类。
这个视图包含10个分类,933个节点。这个视图涵盖了所有的节点。
研究人员在使用CWE进行软件缺陷分类的过程中,发现分类之间的重合会给分类和研究带来很多的困惑。大家需要一个类别之间相互排斥的分类方法,尽管这样很不容易,但还是可以通过增加节点来逐步实现。
于是在CWE4.11版本终于给出了一个建议的参考,这个就是视图:CWE-1400 软件安全保障分类, 这个视图围绕大规模软件保证研究感兴趣的类别组织弱点,以支持使用安全语言开发等策略消除弱点。还可以用于帮助跟踪公开披露的漏洞数据中的弱点趋势。这个视图是全面的,因为每一个弱点都包含在其中,而不像大多数其他只使用弱点子集的观点。这个视图是由最高级别的类别构成的,只有第二级别的弱点。研究者视图(CWE-1000)中提出的弱点之间的关系未显示。
每个弱点只被添加到一个类别中。所有类别相互排斥;也就是说,任何弱点都不可能是一个以上类别的成员。虽然弱点难以仅根据一个特征进行严格的分类,但强制将其归入一个类别可以简化某些类型的分析。
这个分类方式,每个类别的规模可能差异很大,因为:
(1)与其他领域相比,CWE在某些领域没有得到很好的充实;
(2)分组中CWE的抽象可能会下降到Variant级别,而不是其他类型。
CWE-1400 软件安全保障分类,如下图:
CWE-1400 软件安全保障分类在应用软件架构中的分布
在早些年,为了能更好的用于静态分析工具的对比和缺陷用例的整理, 依据代码编码过程的各个环节,对开发者视图(CWE-699)的40个分类进行了顺序调整,对节点数较小的一些分类进行了合并;同时参考研究者视图(CWE-1000),对开发者视图(CWE-699)分类中的节点进行了扩充。最终定义出适合静态分析工具检查和缺陷用例管理的视图。 视图中的定义按照编码、权限、程序间交互,以及程序设计分为31个分类。视图一共包含850个软件CWE弱点。
分类的基本原则:
自定义缺陷分类
自定义视图和其他视图的比较
从CWE 4.0之后,为了完善缺陷,加入了硬件的缺陷。自定义视图并未包含硬件类缺陷,缺陷缺少的部分主要为硬件类缺陷。
自定义缺陷采用CWE 4.12版本统计、比较。
CWE 节点类型 | 本视图节点数 | 开发者视图(699) | 研究者视图(1000) | 软件安全保障视图(1400) | CWE节点总数 |
---|---|---|---|---|---|
View | 1 | 1 | 1 | 1 | 49 |
Pillar | 0 | 0 | 10 | 10 | 10 |
Category | 31 | 40 | 0 | 22 | 374 |
Class | 87 | 1 | 105 | 107 | 107 |
Base | 441 | 393 | 523 | 519 | 519 |
Variant | 284 | 25 | 288 | 290 | 290 |
Compund | 7 | 0 | 7 | 7 | 7 |
Total | 850 | 460 | 934 | 956 | 1356 |
自定义缺陷分类在应用软件架构中的分布