本文分享自华为云社区《从过去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大类:
外部输入导致:这类主要包括:CWE-20:不正确的输入验证、CWE-1409:注入问题、CWE-1404:文件处理、以及CWE-1411:数据真实性验证不足。这些问题是能够通过输入校验有效的避免这些问题的发生,同时静态检查工具也能通过污点分析方式,提供有效的排查帮助。
来自内部编程导致:这类主要包括:CWE-1399:内存安全、CWE-1412:不良编码实践、以及CWE-1415:资源控制。
访问控制:这个问题涉及到权限的设计、分配、认证等控制。从检查上来看,需要给检查工具提供更多的信息,才能做出有效的判断。目前这类问题的检查主要聚焦于:默认的初始化设置、关键的提权函数的使用,以及最容易被攻击者利用的密码、密钥硬编码上,由于缺少更多的上下文的辅助信息,检查结果误报偏高。
这里我们再看下再过去5年中始终在TOP 25 中的高危漏洞,如下图。
和相对稳定的图相比,增加了5个CWE,这些变动主要是因为缺陷上升或下降的原因,变动的CWE 主要有:
这些CWE的增长速度基本在 5 到 10 名之间。这些CWE 有:
这些CWE的排名在过去的5年中,基本上增长超过了10名。这些CWE有:
这些CWE的下降的速度基本在 5 到 10 名之间。这些CWE 有:
这些CWE的排名快速下降,下降的速度基本在 10 名以上。这些CWE 有:
手机扫一扫
移动阅读更方便
你可能感兴趣的文章