安全领域必须关注每年发布一次“最危险的25种软件弱点”清单 —— CWE Top 25(内附2024 CWE Top 25清单详情)
什么是CWE
CWE 是 Common Weakness Enumeration 的缩写,中文译为 “通用弱点枚举”。我们可以把它理解为一个软件和硬件安全漏洞的“标准化分类词典”或“百科全书”。它不是记录某一个具体的漏洞(比如“Windows 10 的某个补丁”),而是对导致安全漏洞的根源性编程错误、设计缺陷或架构问题进行系统性的分类和定义。
详情可以参考文章:
以下是针对 CWE Top 25 2024(2024年最危险的25种软件弱点)的详细中文解析。该榜单由美国国土安全部资助的CWE项目联合MITRE、网络安全界专家共同评选,聚焦于最容易被利用、造成危害最严重、且广泛存在于现实系统中的安全弱点。
榜单中的条目分为:
- Base(基础型):单一、具体的漏洞类型。
- Class(类别型):更广泛的漏洞大类,可能包含多个具体形式。
- Composite(复合型):由多个基础或类别型弱点组合而成的复杂问题。
CWE Top 25 - 2024 年最危险软件弱点详解
1. CWE-79: 跨站脚本(XSS)
类型:Base
中文名:在网页生成过程中未正确中和输入(跨站脚本)
解析: 攻击者将恶意脚本(通常是JavaScript)注入到网页中,当其他用户浏览该页面时,脚本在其浏览器中执行。
危害:
- 窃取用户Cookie、会话令牌
- 劫持用户会话
- 伪造操作(如转账、发帖)
- 挂马传播恶意软件
常见场景:
- 搜索框、评论区、用户资料页未对输入进行过滤或转义。
- 富文本编辑器允许执行脚本。
防范:
- 输入验证 + 输出编码(HTML、JS、URL编码)
- 使用CSP(内容安全策略)
- 框架自带XSS防护(如React自动转义)
2. CWE-787: 越界写(缓冲区溢出)
类型:Base
中文名:越界写
解析: 程序向缓冲区写入数据时,超出其分配的内存边界,覆盖相邻内存区域。
危害:
- 崩溃系统(DoS)
- 执行任意代码(RCE)
- 提权或绕过安全机制
常见语言: C/C++ 等不自动管理内存的语言最易受影响。
防范:
- 使用安全函数(如
strncpy
替代strcpy
) - 启用编译器保护(Stack Canaries、ASLR、DEP)
- 使用内存安全语言(Rust、Go、Java)
3. CWE-89: SQL注入
类型:Base
中文名:未正确中和SQL命令中的特殊元素
解析: 攻击者通过输入恶意SQL代码,改变原有SQL语句逻辑,从而操控数据库。
危害:
- 窃取敏感数据(用户密码、身份证号)
- 修改或删除数据
- 绕过登录验证
- 甚至通过数据库执行系统命令
防范:
- 使用参数化查询(Prepared Statements)
- ORM框架(如Hibernate)
- 输入验证 + 最小权限数据库账户
4. CWE-352: 跨站请求伪造(CSRF)
类型:Composite
中文名:跨站请求伪造
解析: 攻击者诱导用户在已登录状态下访问恶意页面,自动向目标网站发起请求(如转账、改密码),而用户不知情。
危害:
- 在用户不知情下执行敏感操作
- 常与XSS结合使用
防范:
- 使用CSRF Token
- SameSite Cookie 属性
- 检查
Referer
头(不完全可靠) - 敏感操作需二次验证(如短信验证码)
5. CWE-22: 路径遍历(目录穿越)
类型:Base
中文名:路径名未限制在受限目录内
解析: 攻击者通过构造 ../../../etc/passwd
类似路径,访问或下载系统任意文件。
危害:
- 泄露配置文件、密码、源码
- 获取服务器敏感信息
防范:
- 禁止输入中出现
..
或/
- 使用白名单限制可访问目录
- 文件路径规范化 + 根目录绑定
6. CWE-125: 越界读
类型:Base
中文名:越界读
解析: 程序读取缓冲区之外的内存数据,可能导致信息泄露。
危害:
- 泄露内存中的敏感信息(如密码、密钥)
- 著名案例:Heartbleed(心脏滴血)漏洞
防范:
- 边界检查
- 使用安全语言或库
- 静态分析工具检测
7. CWE-78: 操作系统命令注入
类型:Base
中文名:未正确中和命令中的特殊元素(OS命令注入)
解析: 程序将用户输入拼接到系统命令中执行,攻击者可插入 ;
、&&
、|
等符号执行任意命令。
危害:
- 远程代码执行(RCE)
- 完全控制服务器
防范:
- 避免直接调用系统命令
- 使用安全API替代(如
mkdir()
替代system("mkdir ...")
) - 输入白名单过滤
- 最小权限运行进程
8. CWE-416: Use After Free(释放后使用)
类型:Variant
中文名:内存释放后仍被引用
解析: 程序释放了内存后,仍继续使用指向该内存的指针,可能导致崩溃或执行恶意代码。
危害:
- RCE、提权
- 常见于浏览器、操作系统内核
防范:
- 释放后置空指针
- 使用智能指针(C++)
- 内存安全语言(Rust)
9. CWE-862: 缺少关键功能的授权
类型:Class
中文名:缺少授权
解析: 系统未对用户操作进行权限检查,导致低权限用户访问高权限功能。
危害:
- 越权访问(如普通用户查看管理员数据)
- 数据泄露、篡改
防范:
- 所有敏感接口都需服务端权限校验
- 基于角色的访问控制(RBAC)
- 最小权限原则
10. CWE-434: 危险类型文件的无限制上传
类型:Base
中文名:上传危险类型文件
解析: 系统允许用户上传可执行文件(如 .php
, .jsp
, .exe
),攻击者可上传Web Shell控制服务器。
危害:
- 服务器被完全控制
- 成为跳板攻击内网
防范:
- 文件类型白名单
- 存储路径不在Web目录
- 文件重命名 + 权限限制
- 杀毒扫描
11. CWE-94: 代码注入
类型:Base
中文名:代码生成控制不当
解析: 用户输入被当作代码执行,如PHP eval()
、JavaScript eval()
或模板注入。
危害:
- RCE
- 系统被控
防范:
- 避免动态执行用户输入
- 使用沙箱环境
- 模板引擎安全配置
12. CWE-20: 输入验证不当
类型:Class
中文名:输入验证不当
说明: 这是一个大类,涵盖所有未对输入进行充分验证的问题,是许多具体漏洞(如XSS、SQLi、命令注入)的根源。
防范:
- 白名单验证
- 长度、类型、格式检查
- 上下文相关过滤
13. CWE-77: 命令注入
类型:Class
中文名:命令中特殊元素未中和
说明: 比CWE-78更广,涵盖OS命令、Shell命令、数据库命令等注入。
防范: 同CWE-78,但需考虑更多命令解释器。
14. CWE-287: 认证不当
类型:Class
中文名:认证不当
涵盖:
- 弱密码策略
- 多因素认证缺失
- 凭证猜测防护不足
- Session管理缺陷
防范:
- 强密码策略 + MFA
- 登录失败锁定
- 安全的Session管理
15. CWE-269: 特权管理不当
类型:Class
中文名:特权管理不当
解析: 权限分配不合理,如普通用户可提权、服务账户权限过高。
防范:
- 最小权限原则
- 特权分离
- 定期审计权限
16. CWE-502: 不受信任数据的反序列化
类型:Base
中文名:反序列化不受信任数据
解析: 反序列化攻击者控制的数据,可能触发RCE。
危害:
- RCE(如Java Commons Collections漏洞)
- DoS
防范:
- 避免反序列化不可信数据
- 使用签名/加密验证数据完整性
- 使用JSON等安全格式替代
17. CWE-200: 敏感信息泄露
类型:Class
中文名:敏感信息暴露给未授权方
涵盖:
- 错误消息泄露路径、数据库结构
- 日志记录密码
- HTTP响应中包含敏感数据
防范:
- 自定义错误页面
- 敏感数据脱敏
- 安全日志策略
18. CWE-863: 授权不正确
类型:Class
中文名:授权不正确
与CWE-862区别:
- 862:完全缺失授权检查
- 863:检查逻辑错误,如角色判断错误
防范:
- 服务端严格校验权限
- 避免前端控制权限
19. CWE-918: 服务端请求伪造(SSRF)
类型:Base
中文名:服务器端请求伪造
解析: 攻击者诱导服务器向内部系统(如127.0.0.1、192.168.x.x)发起请求。
危害:
- 访问内网敏感服务(Redis、Metadata API)
- 绕过防火墙
- 数据泄露
防范:
- 禁止用户控制URL
- 黑名单/白名单校验
- 分离内外网请求
20. CWE-119: 内存缓冲区操作控制不当
类型:Class
中文名:内存缓冲区边界操作控制不当
涵盖:
- 越界读/写
- 缓冲区溢出
- 栈溢出
防范: 同CWE-787、CWE-125
21. CWE-476: 空指针解引用
类型:Base
中文名:空指针解引用
解析: 程序尝试访问空指针指向的内存,导致崩溃。
危害:
- 拒绝服务(DoS)
- 可能被利用执行代码(特定场景)
防范:
- 使用前检查是否为空
- 异常处理
22. CWE-798: 硬编码凭证
类型:Base
中文名:使用硬编码凭证
解析: 密码、API密钥等写死在代码中,易被泄露。
危害:
- 账户被滥用
- 系统被入侵
防范:
- 使用配置文件 + 环境变量
- 密钥管理系统(KMS)
- 代码扫描工具检测
23. CWE-190: 整数溢出/回绕
类型:Base
中文名:整数溢出或回绕
解析: 整数运算结果超出数据类型范围,导致意外行为。
危害:
- 缓冲区大小计算错误 → 溢出
- 内存分配失败或越界
防范:
- 使用安全数学库
- 溢出检测
- 边界检查
24. CWE-400: 资源消耗失控
类型:Class
中文名:资源消耗失控
涵盖:
- 内存耗尽
- CPU占用过高
- 文件句柄耗尽
危害:
- 拒绝服务(DoS)
防范:
- 限制请求频率(Rate Limiting)
- 设置超时
- 资源配额管理
25. CWE-306: 关键功能缺少认证
类型:Base
中文名:关键功能缺少认证
解析: 如管理接口、API端点未要求登录即可访问。
危害:
- 系统被任意操控
- 数据被删除或篡改
防范:
- 所有关键接口必须认证
- 默认关闭调试接口
- 网络隔离
总结:CWE Top 25 的核心启示
- 输入是万恶之源:绝大多数漏洞源于对用户输入的信任(XSS、SQLi、命令注入等)。
- 内存安全至关重要:C/C++项目必须重视缓冲区管理。
- 权限控制不能马虎:认证、授权、最小权限是安全基石。
- 默认安全配置:避免硬编码、开放接口、高权限运行。
- 纵深防御:单一防护可能被绕过,需多层防护。
建议:开发团队应将 CWE Top 25 作为安全编码培训的核心内容,并在代码审计、自动化测试中重点检查这些弱点。