从过去 5 年 CWE TOP 25 的数据看软件缺陷的防护
作者: Uncle_Tom
原文链接:https://bbs.huaweicloud.com/blogs/410171
1. 前言
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 名的安全问题。因为作为防御方,整体的防御能力取决于防御的最短板。正如我经常举的例子:进攻方是拿一个针,在你系统的各个方面扎来扎去,只要有一个薄弱点,就会使系统被攻破。作为防御方,必须了解整个系统防御体系的每一个弱点,并采取防御手段,投入的成本远高于进攻方。
2. CWE TOP 25 数据分析策略
为了更全面的了解 CWE TOP 25 的变动趋势,我们先得到 2019 到 2023 年 CWE TOP 25 的数据;同时尽可能的降低统计数据给我们带来的数据偏差的干扰,我们将分析数据扩大到 TOP 40。这个数据可以从 CWE 的网页:View historical rank data 得到。
2.1. 2019 -2023 CWE TOP 25 数据
我们将这些数据通过折线图表示,如下图:
这个图看起来有些乱,不便于我们找到一些规律,于是我们采用下面的方法,对缺陷排名做个数据分析。
2.2. 斜率
将一个 CWE 的历年的排名作为纵坐标,将从 2019 到 2023 年做为横坐标,通过拟合横坐标和纵坐标形成的点图,可以通过线性拟合的方式得到一条斜线,这条拟合线可以用公式表示:
y = bx + a
其中, b 为数据点的线性回归线的斜率,斜率为垂直距离除以线上任意两个点之间的水平距离,即回归线的变化率。斜率越大可以说明变动越大。
斜率可以通过下面的公式求得:
这里我们可以利用 excle 表格中的 SLOPE 函数求得。计算结果见上表的"斜率"一列。
注意:
斜率为正数:名次变大,表示下降;正的越多,表示下降的越快;
斜率为负数: 名次变小,表示上升;负的越多,表示上升的越快;
斜率为零:名次没有变化。
2.3. 变动趋势
为了衡量斜率波动的大小,我们通过标准差(σ)的范围来衡量波动的大小。标准差可以测量值在平均值(中值)附近分布的范围大小。计算公式如下:
这个我们也可以借助 excel 的 STDEV 函数求得标准差:
σ = 3.11917143
以及斜率的平均值:
avg = 0.064661654
然后我们再将斜率按间隔: 0.5, 统计各个值段的频次,再利用 excle 的 NORMDIST 函数, 得到指定平均值和标准偏差的正态分布函数。
NORMDIST 函数定义为:NORMDIST(x,mean,standard_dev,cumulative)
NORMDIST 函数语法具有下列参数:
X, 必需。 需要计算其分布的数值;
Mean, 必需。 分布的算术平均值;
standard_dev, 必需。 分布的标准偏差;
cumulative, 必需。 决定函数形式的逻辑值。 如果 cumulative 为 TRUE,则 NORMDIST 返回累积分布函数;如果为 FALSE,则返回概率密度函数。这里 我们使用 cumulative 为 FALSE。
通过计算得到下图:
通过分析,我们发现:
σ = 3.11917143, CWE 对应的斜率波动的范围在 10 名左右;
0.5σ = 1.559585715,CWE 对应的斜率波动的范围在 5 名左右。
由此我们给出了斜率波动幅度的衡量标准:
基于这个波动幅度,我们可以得到下表:
从这个统计表,我们可以看到:
相对稳定 17 个,占比 42%,也就是大部分缺陷没有实质性的改变;
上升 5 个,快速上升 7 个,占比 30%,在过去的 5 年未得到有效的控制,特别是快速上升的缺陷更需要引起防范的注意;
下降 3 个,快速下降 6 个,占比 22.5%,说明过去 5 年通过大家的防御能力的提升,这些问题得到一定程度的控制;
有 2 个今年新进入 TOP 40,分别为 26 名的 CWE-617:可访问断言, 以及 38 名的 CWE-639:通过用户控制密钥绕过授权机制。
下面我们分别对这些区域进行分析,试图找到这些高位安全问题的变动趋势和根因。
3. 2019-2023 CWE TOP 25 相对稳定的缺陷
对于波动相对稳定的 CWE,前 40 名里有 17 个 CWE。为了使图能够看的更加清楚,图里只展示了 CWE 在 2023 年 CWE TOP 25 中的 13 个 CWE。如下图:
在上图中一共有 13 个 CWE,其中有 10 个 CWE 常年都维持在 15 名以内,波动的幅度较小。按CWE-1400 软件安全保障综合分类视图的分类,给出分类一栏的类别。
这些稳定的 CWE 大致可以分为 3 大类:
外部输入导致:这类主要包括:CWE-20:不正确的输入验证、CWE-1409:注入问题、CWE-1404:文件处理、以及 CWE-1411:数据真实性验证不足。这些问题是能够通过输入校验有效的避免这些问题的发生,同时静态检查工具也能通过污点分析方式,提供有效的排查帮助。CWE-94:对生成代码的控制不恰当(代码注入)。由于 ChatGpt 的成功,更多的程序员开始使用 AI 辅助编程,已及今后由于大模型引起的开发模式的转变,程序员会更多的利用 AIGC 自动生成代码,自动生成代码的比例也会越来越大。如何通过静态检查工具增加对生成代码安全性的检测力度,以及如何利用大模型辅助静态检查,都会成为未来的静态检查的新兴课题。
来自内部编程导致:这类主要包括:CWE-1399:内存安全、CWE-1412:不良编码实践、以及 CWE-1415:资源控制。内存安全:缓冲去溢出(越界读、越界写、边界操作不当)一直是 C 语言的灵活性带来的副作用。依据微软的统计,Windows 问题中的 70,都是由于内存安全问题造成的。缓冲区溢出也一直是静态检查多年来未能有效解决的问题。工具在检查过程中,一方面需要记录内存分配的大小,还需要在使用时,对是否越界做出明确的判断。目前的工具多通过抽象解析,给出值域的判断,这种方法很多时候过于依赖代码中检查条件的判断,所以存在误报高的现象。通过符号执行并辅助约束求解的技术,能够在一定程度上提高分析的精度,降低误报。但这两个技术的使用会大幅度的降低分析工具的执行速度,无法达到应用级别的使用,只能非常有限的在工具中使用。程序员可以在编码过程中增强边界的检查意识,或通过代码增加对不确定边界的检查,来减低此类问题的发生。由于 C 语言一直存在的内存安全问题,这也是为什么不少企业在探索使用约束更多的 rust 语言来替代 C 语言的主要原因。内存泄露和空指针问题:静态分析工具可以通过状态机的方式,基本已经能够很好的予以解决。再配合动态测试,能够得到有效的得到控制。
访问控制:这个问题涉及到权限的设计、分配、认证等控制。从检查上来看,需要给检查工具提供更多的信息,才能做出有效的判断。目前这类问题的检查主要聚焦于:默认的初始化设置、关键的提权函数的使用,以及最容易被攻击者利用的密码、密钥硬编码上,由于缺少更多的上下文的辅助信息,检查结果误报偏高。
这里我们再看下再过去 5 年中始终在 TOP 25 中的高危漏洞,如下图。
和相对稳定的图相比,增加了 5 个 CWE,这些变动主要是因为缺陷上升或下降的原因,变动的 CWE 主要有:
CWE-787:越界写入。 从 2019 年的 12 名,2020 年 2 的第二名,之后就一直居于第一名。
CWE-78:OS 命令中使用的特殊元素转义处理不恰当(OS 命令注入)。 从 2019 年,逐步上升到 2023 年的第 5 名。这也是一个常见的注入类问题。这个除了对输入做出校验以外,还应该更多的是在代码中减少系统命令的直接使用,而是通过系统函数的调用方式实现系统命令的功能,隔离对系统命令的直接使用。在检查工具上,已经能够比较充分的发现这类问题。相信通过静态分析工具的使用,这个缺陷会逐步减少。
CWE-434:危险类型文件的不加限制上传。 这个问题被划分在 CWE-1416:资源生命周期管理中。这个缺陷从 2019 年的第 16 名,到目前已经连续三年保持第 10 名。这个问题持续排在第十位,确实有些让人意外,从检查和防范上没有太大的难度,这只能说明开发人员缺乏一定的安全意识,未曾对此类问题做出防范。相信通过对开发人员代码安全的教育的普及,这类问题会快速下降。
CWE-502:不可信数据的反序列化。这个问题属于对 CWE-1415:资源控制的问题。这些年数据处理变得越来越重要,这个也给攻击者提供了一种通过构反序列化造数据,来绕过对数据安全检查的攻击方式。持续发现的 Appache Siro、weblogic、tomcat、Jackson,Fastjson 等一系列漏洞也说明了这一问题的风险。从防范上还是要坚持对外部数据的合法、有效性检测。
CWE-119:内存缓冲区边界内操作的限制不恰当。从 2019 年的第一名,逐年降低到 2023 年的第 17 名。看来是可以通过重视和增加检查来有效的避免此类问题的发生。
过去 5 年持续在 CWE TOP 25 中的这 16 个高危安全问题,我们需要在编码、检查和防御过程中引起高度的重视,可以说是重中之重。
4. 2019-2023 CWE TOP 25 增长趋势的缺陷
这些 CWE 的增长速度基本在 5 到 10 名之间。这些 CWE 有:
CWE-787:越界写入。 从 2019 年的 12 名,2020 年 2 的第二名,之后就一直居于第一名。
CWE-78:OS 命令中使用的特殊元素转义处理不恰当(OS 命令注入)。从 2019 年,逐步上升到 2023 年的第 5 名。
CWE-434:危险类型文件的不加限制上传。从 2019 年的第 16 名,到目前已经连续三年保持第 10 名。
CWE-502:不可信数据的反序列化。从 2019 年的 23 名,逐步上升到 2022 年的最高点 12 名,2023 年回落到 15 名。
CWE-863:授权机制不正确。从 2019 年的 35 名,逐步上升到今年终于进入前 25 名的第 24 名。
对于这五个处于上升阶段的 CWE 缺陷,已经在前面的"相对稳定"和"始终在前 25"的讨论中涉及,就不再一一解读。
5. 2019-2023 CWE TOP 快速增长的缺陷
这些 CWE 的排名在过去的 5 年中,基本上增长超过了 10 名。这些 CWE 有:
CWE-862:授权机制缺失。从 2019 年的 36 名,一路上升到 2023 年的 11 名,上升 25 名。
CWE-77:在命令中使用的特殊元素转义处理不恰当(命令注入)。从 2019 年的 30 名,上升到 2023 年的 16 名,上升 14 名。
CWE-918:服务端请求伪造(SSRF)。从 2019 年的 32 名,一路上升到 2023 年的 19 名,上升 12 名。SSRF 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞,大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。对于静态分析,能做的有限。
CWE-306:关键功能的认证机制缺失。从 2019 年的 38 名,快速上升到 2021 年的 11 名,这两年逐步回落到 2023 年的 20 名,上升 18 名。
CWE-362:使用共享资源的并发执行不恰当同步问题(竞争条件)。从 2019 年的 31 名到 2021 年的 33 名,这两年快速上升到 21 名,上升 12 名,进入到 TOP 25。随着并发的普遍使用,竞争条件会成为静态检查除内存安全之外的另一个挑战。
CWE-427:不受控制的搜索路径元素。从 2021 年的 34 名,上升到 2023 年的 27 名。
CWE-770:无限制或未控制地分配资源。从 2020 年的 39 名到 2022 年跌出前 40,2023 年却突然上升到 29 名,上升 10 名。
6. 2019-2023 CWE TOP 下降趋势的缺陷
这些 CWE 的下降的速度基本在 5 到 10 名之间。这些 CWE 有:
CWE-276:默认权限不正确。从 2021 年的 19 名,降到 2023 年的 25 名。只要在安全意识上足够重视,这类安全问题会进一步下降。
CWE-611:XML 外部实体引用限制不当。从 2019 年的 17 名,降到 2023 年的 28 名,跌出了 TOP 25。这可能是在解析 xml 时,做了默认设置和限制,同时这些年 json 的使用,也分流了一部分 xml 的使用。
CWE-401:使用后内存未释放(内存泄露)。从 2021 年的 32 名,降到了 2023 年的 36 名。工具检测技术的成熟,对这类问题的减少也起到了一定的作用。
7. 2019-2023 CWE TOP 快速下降的缺陷
这些 CWE 的排名快速下降,下降的速度基本在 10 名以上。这些 CWE 有:
CWE-119:内存缓冲区边界内操作的限制不恰当。从 2019 年的第一名,逐年降到 2023 年的第 17 名,下降了 17 名。
CWE-200:将敏感信息暴露给未经授权的参与者。从 2019 年的第 4 名,逐年降到 2023 年的 30 名,下降 26 名。各国隐私保护法的实施起到了很大的推动作用。
CWE-732:关键资源的权限分配不正确。从 2019 年的 15 名,逐步降到 2023 年的 31 名,下降 16 名。也是一个访问控制问题。
CWE-522:凭据保护不足。从 2019 年的 28 名,在 2020 年上升到 18 名后,逐步下降到 2023 年的 35 名。也是一个访问控制问题。
CWE-400:不受控制的资源消耗。从 2019 年的 20 名,降到 2023 年的 37 名,下降 17 名。属于 CWE-1416:资源生命周期管理问题。
CWE-668:将资源暴露在错误的领域。从 2022 年的 32 名,降到 2023 年的 40 名。属于 CWE-1403:资源泄露。
8. 总结
分析了 CWE TOP 25 从 2019 到 2023 年 CWE 的变动;
外部输入校验、访问控制问题、注入问题、内存安全是过去 5 年的主要安全问题,并会在今后的一段时间持续,特别需要注意在 5 年中一直都在 TOP 25 中的 16 类问题;
需要特别关注快速增长的安全问题:CWE-918:服务端请求伪造(SSRF)、CWE-362:使用共享资源的并发执行不恰当同步问题(竞争条件);
由于代码生成的快速应用,需要重点关注:CWE-94:对生成代码的控制不恰当(代码注入);
9. 参考
Weaknesses in the 2023 CWE Top 25 Most Dangerous Software Weaknesses
Weaknesses in the 2022 CWE Top 25 Most Dangerous Software Weaknesses
Weaknesses in the 2021 CWE Top 25 Most Dangerous Software Weaknesses
Weaknesses in the 2020 CWE Top 25 Most Dangerous Software Weaknesses
Weaknesses in the 2019 CWE Top 25 Most Dangerous Software Errors
评论