本文分享自华为云社区《从过去5年CWE TOP 25的数据看软件缺陷的防护》,作者:Uncle_Tom。
"以史为鉴,可以知兴替"。CWE 已经连续5年发布了 CWE TOP 25,我们可以从过去5年CWE TOP 25 的变化趋势,去寻找高危安全漏洞的发展趋势,为安全政策和投资决策提供指引,这对于安全防护人员、代码检查工具的开发,以及编程人员都有着非常重要意义。
2023年的 CWE 危险性最高的安全缺陷已经公布:《2023年最具威胁的25种安全漏洞(CWE TOP 25)》, 这对于安全防护人员、代码检查工具的开发人员非常重要。从2019年开始,CWE 已经连续5年发布了 CWE TOP 25,我们可以从过去5年CWE TOP 25 的变化趋势,去寻找高危安全漏洞的发展趋势,为安全政策和投资决策提供指引。
大家需要注意,美国国家缺陷漏洞库(NVD)Top 25 每年的数据的统计方式都存在很大的变动,这主要原因包括:每年报告的漏洞类型、重新映射策略的更改、在 CWE 映射视图中添加新的 CWE 条目等。因此,由于数据偏差,排名的可靠性存在一定偏差。例如,数据中增加一些 CVE 可能会极大地改变 CWE 在 排名之间的位置。 这个问题也是我们在前面关于CWE定义分类并非完全正交性的讨论中,一直探讨的问题,正是由于这个问题的存在,使CVE在CWE归属的问题上存在歧义,由此可能导致最终数据的偏差。
另外作为防御方,并不能仅仅关注TOP 25 的问题,而需要关注更为广泛的安全问题,例如前40名,甚至前100名的安全问题。因为作为防御方,整体的防御能力取决于防御的最短板。正如我经常举的例子:进攻方是拿一个针,在你系统的各个方面扎来扎去,只要有一个薄弱点,就会使系统被攻破。作为防御方,必须了解整个系统防御体系的每一个弱点,并采取防御手段,投入的成本远高于进攻方。
为了更全面的了解CWE TOP 25的变动趋势,我们先得到2019 到 2023年CWE TOP 25 的数据;同时尽可能的降低统计数据给我们带来的数据偏差的干扰,我们将分析数据扩大到TOP 40。这个数据可以从CWE的网页:View historical rank data 得到。
CWE ID |
CWE描述 |
2019 |
2020 |
2021 |
2022 |
2023 |
斜率 |
变动趋势 |
---|---|---|---|---|---|---|---|---|
Out-of-bounds Write 越界写入 |
12 |
2 |
1 |
1 |
1 |
-2.3 |
up |
|
Improper Neutralization of Input During Web Page Generation (‘Cross-site Scripting’) 在Web页面生成时对输入的转义处理不恰当(跨站脚本) |
2 |
1 |
2 |
2 |
2 |
0.1 |
stable |
|
Improper Neutralization of Special Elements used in an SQL Command (‘SQL Injection’) SQL命令中使用的特殊元素转义处理不恰当(SQL注入) |
6 |
6 |
6 |
3 |
3 |
-0.9 |
stable |
|
Use After Free 释放后使用 |
7 |
8 |
7 |
7 |
4 |
-0.7 |
stable |
|
Improper Neutralization of Special Elements used in an OS Command (‘OS Command Injection’) OS命令中使用的特殊元素转义处理不恰当(OS命令注入) |
11 |
10 |
5 |
6 |
5 |
-1.6 |
up |
|
Improper Input Validation 不正确的输入验证 |
3 |
3 |
4 |
4 |
6 |
0.7 |
stable |
|
Out-of-bounds Read 越界读取 |
5 |
4 |
3 |
5 |
7 |
0.5 |
stable |
|
Improper Limitation of a Pathname to a Restricted Directory (‘Path Traversal’) 对路径名的限制不恰当(路径遍历) |
10 |
12 |
8 |
8 |
8 |
-0.8 |
stable |
|
Cross-Site Request Forgery (CSRF) 跨站请求伪造(CSRF) |
9 |
9 |
9 |
9 |
9 |
0 |
stable |
|
Unrestricted Upload of File with Dangerous Type 危险类型文件的不加限制上传 |
16 |
15 |
10 |
10 |
10 |
-1.7 |
up |
|
Missing Authorization 授权机制缺失 |
36 |
25 |
18 |
16 |
11 |
-5.9 |
rapid_ascent |
|
NULL Pointer Dereference 空指针解引用 |
14 |
13 |
15 |
11 |
12 |
-0.6 |
stable |
|
Improper Authentication 认证机制不恰当 |
13 |
14 |
14 |
14 |
13 |
0 |
stable |
|
Integer Overflow or Wraparound 整数溢出或超界折返 |
8 |
11 |
12 |
13 |
14 |
1.4 |
stable |
|
Deserialization of Untrusted Data 不可信数据的反序列化 |
23 |
21 |
13 |
12 |
15 |
-2.5 |
up |
|
Improper Neutralization of Special Elements used in a Command (‘Command Injection’) 在命令中使用的特殊元素转义处理不恰当(命令注入) |
30 |
31 |
25 |
17 |
16 |
-4.2 |
rapid_ascent |
|
Improper Restriction of Operations within the Bounds of a Memory Buffer 内存缓冲区边界内操作的限制不恰当 |
1 |
5 |
17 |
19 |
17 |
4.6 |
rapid_decline |
|
Use of Hard-coded Credentials 使用硬编码的凭证 |
19 |
20 |
16 |
15 |
18 |
-0.7 |
stable |
|
Server-Side Request Forgery SSRF) 服务端请求伪造(SSRF) |
32 |
27 |
24 |
21 |
19 |
-3.2 |
rapid_ascent |
|
Missing Authentication for Critical Function 关键功能的认证机制缺失 |
38 |
24 |
11 |
18 |
20 |
-4.2 |
rapid_ascent |
|
Concurrent Execution using Shared Resource with Improper Synchronization (‘Race Condition’) 使用共享资源的并发执行不恰当同步问题(竞争条件) |
31 |
34 |
33 |
22 |
21 |
-3.2 |
rapid_ascent |
|
Improper Privilege Management 特权管理不恰当 |
24 |
22 |
29 |
29 |
22 |
0.3 |
stable |
|
Improper Control of Generation of Code (‘Code Injection’) 对生成代码的控制不恰当(代码注入) |
18 |
17 |
28 |
25 |
23 |
1.8 |
stable |
|
Incorrect Authorization 授权机制不正确 |
35 |
29 |
38 |
28 |
24 |
-2.3 |
up |
|
Incorrect Default Permissions 默认权限不正确 |
19 |
20 |
25 |
3 |
down |
|||
Reachable Assertion 可访问断言 |
26 |
|||||||
Uncontrolled Search Path Element 不受控制的搜索路径元素 |
34 |
27 |
27 |
-3.5 |
rapid_ascent |
|||
Improper Restriction of XML External Entity Reference XML 外部实体引用限制不当 |
17 |
19 |
23 |
24 |
28 |
2.7 |
down |
|
Allocation of Resources Without Limits or Throttling 无限制或未控制地分配资源 |
39 |
40 |
29 |
-3.64 |
rapid_ascent |
|||
Exposure of Sensitive Information to an Unauthorized Actor 将敏感信息暴露给未经授权的参与者 |
4 |
7 |
20 |
33 |
30 |
7.8 |
rapid_decline |
|
Incorrect Permission Assignment for Critical Resource 关键资源的权限分配不正确 |
15 |
16 |
22 |
30 |
31 |
4.6 |
rapid_decline |
|
URL Redirection to Untrusted Site (‘Open Redirect’) URL 指向未可信站点的URL重定向(开放重定向) |
34 |
35 |
37 |
35 |
32 |
-0.4 |
stable |
|
Improperly Controlled Modification of Object Prototype Attributes (‘Prototype Pollution’) 对象原型属性的不当控制修改(原型污染) |
34 |
33 |
-1 |
stable |
||||
Improper Certificate Validation 证书验证不正确 |
25 |
28 |
26 |
26 |
34 |
1.6 |
stable |
|
Insufficiently Protected Credentials 凭据保护不足 |
28 |
18 |
21 |
38 |
35 |
3.4 |
rapid_decline |
|
Missing Release of Memory after Effective Lifetime 使用后内存未释放(内存泄露) |
32 |
32 |
36 |
36 |
1.6 |
down |
||
Uncontrolled Resource Consumption 不受控制的资源消耗 |
20 |
23 |
27 |
23 |
37 |
3.4 |
rapid_decline |
|
Authorization Bypass Through User-Controlled Key 通过用户控制密钥绕过授权机制 |
38 |
|||||||
Improper Link Resolution Before File Access (‘Link Following’) 在文件访问前对链接解析不恰当(链接跟随) |
40 |
31 |
37 |
39 |
0.3 |
stable |
||
Exposure of Resource to Wrong Sphere 将资源暴露在错误的领域 |
32 |
40 |
8 |
rapid_decline |
我们将这些数据通过折线图表示,如下图:
这个图看起来有些乱,不便于我们找到一些规律,于是我们采用下面的方法,对缺陷排名做个数据分析。
将一个CWE的历年的排名作为纵坐标,将从2019到2023年做为横坐标,通过拟合横坐标和纵坐标形成的点图,可以通过线性拟合的方式得到一条斜线,这条拟合线可以用公式表示:
y = bx + a
其中, b 为数据点的线性回归线的斜率,斜率为垂直距离除以线上任意两个点之间的水平距离,即回归线的变化率。斜率越大可以说明变动越大。
斜率可以通过下面的公式求得:
这里我们可以利用excle 表格中的 SLOPE 函数求得。计算结果见上表的"斜率"一列。
为了衡量斜率波动的大小,我们通过标准差(σ)的范围来衡量波动的大小。标准差可以测量值在平均值(中值)附近分布的范围大小。计算公式如下:
这个我们也可以借助excel 的 STDEV 函数求得标准差:
σ = 3.11917143
以及斜率的平均值:
avg = 0.064661654
然后我们再将斜率按间隔: 0.5, 统计各个值段的频次,再利用excle 的 NORMDIST 函数, 得到指定平均值和标准偏差的正态分布函数。
由此我们给出了斜率波动幅度的衡量标准:
斜率波动幅度 |
斜率波动范围 |
解释 |
---|---|---|
相对稳定(stable) |
±0.5σ±0.5 σ
之间: -1.494924061 < 斜率 < 1.624247369
|
CWE变动(上升/下降)在5名以内,相对稳定(stable). |
上升趋势(up) |
-σ ~ -0.5σ:-3.054509776 < 斜率 ≤≤ -1.494924061 |
CWE上升5-10名,有上升趋势(up). |
快速上升(rapid_ascent) |
≤≤ -σ: 斜率 ≤≤-3.054509776 |
CWE上升10名以上,有快速上升趋势(rapid_ascent). |
下降趋势(down) |
0.5σ ~ σ:1.624247369 ≤≤ 斜率 < 3.183833084 |
CWE下降5-10名,有下降趋势(down). |
快速下降(rapid_decline) |
≥≥σ:斜率 ≥≥ 3.183833084 |
CWE下降10名以上,有快速下降趋势(rapid_decline). |
基于这个波动幅度,我们可以得到下表:
斜率波动 |
CWE数量 |
CWE百分比 |
---|---|---|
相对稳定(stable) |
17 |
42.50% |
快速上升(rapid_ascent) |
7 |
17.50% |
快速下降(rapid_decline) |
6 |
15.00% |
上升(up) |
5 |
12.50% |
下降(down) |
3 |
7.50% |
新进 |
2 |
5.00% |
总计 |
40 |
100.00% |
从这个统计表,我们可以看到:
下面我们分别对这些区域进行分析,试图找到这些高位安全问题的变动趋势和根因。
对于波动相对稳定的CWE,前40名里有17个CWE。为了使图能够看的更加清楚,图里只展示了CWE 在2023年CWE TOP 25 中的 13 个CWE。如下图:
在上图中一共有13个CWE,其中有10个CWE常年都维持在15名以内,波动的幅度较小。按CWE-1400 软件安全保障综合分类视图的分类,给出分类一栏的类别。
分类 |
CWE |
2023年排名 |
CWE-1409:注入问题 |
CWE-79:在Web页面生成时对输入的转义处理不恰当(跨站脚本) |
2 |
CWE-89:SQL命令中使用的特殊元素转义处理不恰当(SQL注入) |
3 |
|
CWE-94:对生成代码的控制不恰当(代码注入) |
23 |
|
CWE-1399:内存安全 |
CWE-416:释放后使用 |
4 |
CWE-125:越界读取 |
7 |
|
CWE-1406:不正确的输入验证 |
CWE-20:不正确的输入验证 |
6 |
CWE-1404:文件处理 |
CWE-22:对路径名的限制不恰当(路径遍历) |
8 |
CWE-59:在文件访问前对链接解析不恰当(链接跟随) |
39 |
|
CWE-1411:数据真实性验证不足 |
CWE-352:跨站请求伪造(CSRF) |
9 |
CWE-1412:不良编码实践 |
CWE-476:空指针解引用 |
12 |
CWE-1396:访问控制 |
CWE-287:认证机制不恰当 |
13 |
CWE-798:使用硬编码的凭证 |
18 |
|
CWE-269:特权管理不恰当 |
22 |
|
CWE-601:指向未可信站点的URL重定向(开放重定向) |
32 |
|
CWE-295:证书验证不正确 |
34 |
|
CWE-1415:资源控制 |
CWE-1321 对象原型属性的不当控制修改(原型污染) |
33 |
这些稳定的CWE 大致可以分为3大类:
这里我们再看下再过去5年中始终在TOP 25 中的高危漏洞,如下图。
和相对稳定的图相比,增加了5个CWE,这些变动主要是因为缺陷上升或下降的原因,变动的CWE 主要有:
这些CWE的增长速度基本在 5 到 10 名之间。这些CWE 有:
这些CWE的排名在过去的5年中,基本上增长超过了10名。这些CWE有:
这些CWE的下降的速度基本在 5 到 10 名之间。这些CWE 有:
这些CWE的排名快速下降,下降的速度基本在 10 名以上。这些CWE 有: