乐于分享
好东西不私藏

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

【代码审计】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)

二者的核心区别可通过下表直观呈现:

名称
CVE
CWE
性质

漏洞实例的身份证号

缺陷类型的分类标准

内容
特定漏洞的描述信息
通用缺陷的模式定义
更新频率

每日新增(动态)

年度更新(相对静态)

应用场景

漏洞追踪与修复

安全设计与代码审计