【代码审计】0.2软件代码审计常见国际规则介绍
点击蓝字

关注我们
OWASP TOP 10
OWASP 通常指开放式 Web 应用程序安全项目(Open Web Application Security Project),这是一个专注于应用安全的国际非营利组织,致力于通过开源项目和社区教育提升软件安全性,其官方资源可通过 OWASP 官网 获取 。该组织由 Mark Curphey 于 2001 年启动,核心原则是所有材料免费公开,涵盖 Web应用、移动应用、物联网及生成式人工智能等多个领域,其发布的《OWASP Top 10》报告被全球开发者视为关键安全风险指南
OWASP Top 10 是一份标准意识文档,代表了开发人员和安全专家对 Web 应用程序最关键安全风险的广泛共识,2021 年版列出的十大风险类别如下 :
1. 访问控制失效:攻击者可绕过授权执行未授权操作,如更改 URL 访问他人账户 。
2. 加密失败:未使用加密技术保护敏感数据(如密码、财务信息),导致数据泄露或被窃取 。
3. 注入:不受信任的数据被发送到代码解释器,如 SQL 注入、跨站脚本(XSS)攻击 。
4. 不安全的设计:应用程序架构中存在弱点,如使用易猜的安全问题进行密码恢复 。
5. 安全配置错误:使用默认配置或显示过多详细错误信息,包括 XML 外部实体(XXE)攻击 。
6. 易受攻击和过时的组件:使用含有已知漏洞的库、框架或其他组件 。
7. 身份识别和身份验证失败:攻击者利用身份验证系统漏洞访问用户账户,如凭证填充攻击 。
8. 软件和数据完整性失败:依赖第三方插件或外部来源更新,未验证完整性导致恶意代码植入 。
9. 安全日志记录和监控故障:缺乏足够的日志记录和监控,导致数据泄露后无法及时发现和响应 。
10. 服务器端请求伪造(SSRF):攻击者诱导服务器向意外资源发送请求,获取内部数据 。
CWE Top 25
CWE(Common Weakness Enumeration,常见缺陷枚举)是一个由MITRE公司维护的软件与硬件安全弱点标准列表。它于2006年首次发布,旨在为安全弱点提供一个通用的描述语言和分类体系,作为识别、缓解和预防漏洞的基准。CWE通过为每种弱点分配唯一编号和详细描述,促进了不同安全工具、数据库和服务之间的数据共享与比对。其内容涵盖从软件代码缺陷到硬件设计漏洞,并每年发布“CWE Top 25”最具危险性弱点榜单。该标准被广泛用于安全开发、产品测试与评估,是网络安全领域重要的基础性资源。我们可以把它理解为一个软件和硬件安全漏洞的“标准化分类词典”或“百科全书”。它不是记录某一个具体的漏洞(比如“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 作为安全编码培训的核心内容,并在代码审计、自动化测试中重点检查这些弱点。
CVE
公共漏洞和暴露 (CVE) 是一组安全威胁,一个参考系统中列明了这些公开的已知风险。CVE 威胁列表由 MITRE Corporation 维护,后者是一家运营联邦政府资助的研发中心的非营利组织。CVE 由美国国土安全部国家网络安全部门 (NCSD) 资助。
CVE与CWE的区别
CVE 是已知网络安全漏洞的目录,其中,一个 CVE ID 特定于一个软件缺陷。通用弱点枚举 (CWE) 是一个 IT 社区项目,列出了不同类型或类别的硬件和软件的弱点,例如缓冲区错误、身份验证错误或 CPU 问题。这些弱点可能会导致漏洞。
理解CWE与CVE的本质区别,就像医生区分”疾病分类”与”病例编号”——前者告诉你病因类型,后者标记具体病例。这种认知差异直接影响漏洞修复效率,曾有企业因混淆概念导致补丁延迟应用,最终造成数百万损失。
本质定义:从基因库与身份证的差异说起(或者编程中的“类”与“实例的唯一标识名”)
CVE(Common Vulnerabilities and Exposures) 如同漏洞世界的身份证系统。每个被公开披露的漏洞都会获得唯一的CVE-ID,例如CVE-2023-24998。这个编号不包含任何技术细节,仅作为全球统一的标识符。
CWE(Common Weakness Enumeration) 则是缺陷类型的基因库。它将软件缺陷抽象为可复用的分类模式
CVE:漏洞的身份证
想象一下医院里的病历 系统 ,每个病人都有一个唯一的病历号。在网络安全领域,**CVE(Common Vulnerabilities and Exposures)**就是这个病历号系统。它为每个公开的漏洞分配一个唯一的 标识符 ,格式通常是CVE-年份-编号。
例如:CVE-2021-44228就是著名的Log4j漏洞
作用:标准化漏洞命名,方便全球安全团队交流
提示:当你看到一个CVE编号时,第一反应应该是去CVE官网或NVD数据库查询详细信息。
CWE:漏洞的”病根”
如果说CVE是病历号,那么**CWE(Common Weakness Enumeration)**就是疾病的分类编码。它不描述具体漏洞,而是描述导致漏洞的底层 代码 缺陷或设计问题。
常见CWE类型包括:
CWE-79: 跨站脚本(XSS)
CWE-89: SQL注入
CWE-352: 跨站请求伪造(CSRF)
二者的核心区别可通过下表直观呈现:
|
|
|
|
|
|
漏洞实例的身份证号 |
缺陷类型的分类标准 |
|
|
|
|
|
|
每日新增(动态) |
年度更新(相对静态) |
|
|
漏洞追踪与修复 |
安全设计与代码审计 |
夜雨聆风