2025 年 11 月 6 日,OWASP 基金会发布了 Top 10 的第八版。这是自 2021 年以来的首次重大更新,基于超过 175,000 条 CVE 记录、589 个 CWE 以及 280 万应用的测试数据。表面看,这只是一份排名刷新;但从工程视角审视,两个全新类别进入前十——A03 Software Supply Chain Failures 和 A10 Mishandling of Exceptional Conditions——传递了一个明确信号:应用安全的边界正在从"我写的代码"扩展到"我依赖的生态系统"和"代码出错时的行为"。
这不是列表的平移,而是安全关注点的结构性迁移。
从 2021 到 2025:什么变了,什么没变
OWASP Top 10 2025 保留了 2021 版的 8 个类别,新增 2 个,合并 1 个,排名发生显著调整。理解这些变化的最好方式不是背诵新列表,而是追问:为什么某些风险上升,某些下降,又有哪些全新的风险被识别出来。
| 2021 排名 | 2021 类别 | 2025 排名 | 2025 类别 | 变化 |
|---|---|---|---|---|
| A01 | Broken Access Control | A01 | Broken Access Control | 保持第一,SSRF 并入此类 |
| A02 | Cryptographic Failures | A04 | Cryptographic Failures | 下降 2 位 |
| A03 | Injection | A05 | Injection | 下降 2 位 |
| A04 | Insecure Design | A06 | Insecure Design | 下降 2 位 |
| A05 | Security Misconfiguration | A02 | Security Misconfiguration | 上升至 #2 |
| A06 | Vulnerable and Outdated Components | A03 | Software Supply Chain Failures | 扩展为新类别 |
| A07 | Identification and Authentication Failures | A07 | Authentication Failures | 保持 #7,名称精简 |
| A08 | Software and Data Integrity Failures | A08 | Software or Data Integrity Failures | 保持 #8,名称微调 |
| A09 | Security Logging and Monitoring Failures | A09 | Security Logging and Alerting Failures | 保持 #9,强调告警 |
| A10 | Server-Side Request Forgery (SSRF) | — | — | 跌出前十,并入 A01 |
| — | — | A10 | Mishandling of Exceptional Conditions | 全新类别 |
三个最值得工程团队关注的趋势:
第一,Security Misconfiguration 上升到 #2。这不是因为漏洞变多了,而是因为现代应用的"行为"越来越多地由配置决定——Feature flags、IAM policies、网络策略、中间件参数、云资源标签。代码没变,配置错了,系统就暴露。这个排名变化直接对应了"配置即代码"(Configuration as Code)运动的双刃剑效应。
第二,Injection 从 #3 降到 #5。这不是说注入漏洞消失了,而是说标准化框架(ORM、参数化查询、模板引擎)的普及确实降低了发生率。但 2025 版的数据也提醒我们:注入仍然是测试覆盖率最高的类别,拥有最多的 CVE 关联——从 XSS(高频低影响)到 SQL 注入(低频高影响),这个类别依然需要持续投入。
第三,供应链和异常条件进入前十。这两个类别有一个共同特征:它们都不是传统意义上的"漏洞",而是系统性风险——一个在代码之外(依赖生态),一个在代码的隐含路径中(错误处理)。
A03:Software Supply Chain Failures——从"已知漏洞"到"完整生态系统"
A03 是 2025 版中最特殊的类别:它在社区调查中被 50% 的受访者列为 #1 关切,但在实际测试数据中却仅有 11 个直接关联的 CVE。这个矛盾本身就说明了问题——供应链风险的可见性远低于其真实影响。
为什么是"Failures"而不是"Vulnerabilities"
2021 版的 A06 叫"Vulnerable and Outdated Components",关注的是已知 CVE 的组件。2025 版的 A03 将其扩展为"Software Supply Chain Failures",范围覆盖:
- 存在已知漏洞的第三方组件
- 被恶意篡改的依赖包(如 typosquatting、恶意发布)
- 不安全的构建系统(CI/CD 管道权限过宽、缺乏隔离)
- 未及时更新的平台、框架、运行时环境
- IDE 插件、扩展、沙箱等开发工具链的供应链风险
- 不可更新的组件(CWE-1329: Reliance on Component That is Not Updateable)
这个命名变化不是文字游戏,而是承认了一个事实:现代应用的攻击面已经超出了应用本身的代码边界。一个 Node.js 项目平均有 1,000+ 个间接依赖,一个 Python 项目的依赖树深度可达 10 层以上。攻击者不需要找到你的代码漏洞,只需要在你的依赖链中插入一个恶意包——或者等待你延迟安装一个已发布的安全补丁。
数据背后的工程含义
OWASP 2025 的数据揭示了几个关键数字:
| 指标 | A03 数值 | 解读 |
|---|---|---|
| CWEs 映射 | 6 | 范围集中但影响深远 |
| 平均发生率 | 5.72% | 十大类别中最高 |
| 最大发生率 | 9.56% | 部分场景接近 1/10 |
| 平均覆盖率 | 27.47% | 测试覆盖严重不足 |
| 平均加权利用难度 | 8.17/10 | 一旦被利用,影响严重 |
| 平均加权影响 | 5.23/10 | 高于多数类别 |
| 总 CVE 关联 | 11 | 数据严重低估 |
5.72% 的平均发生率意味着,每 17 个应用中就有 1 个存在供应链层面的安全问题。而 27.47% 的平均测试覆盖率则说明,大多数组织甚至不知道自己的供应链风险在哪里。11 个 CVE 的统计更是明显低估——Log4j(CVE-2021-44228)这样的单个漏洞影响了数百万应用,但在 OWASP 的统计方法论中,它只被计为一个 CVE。
工程落地的关键矛盾
A03 的"How to prevent"建议中有一个容易被忽视的点:CI/CD 管道的安全性不能低于它构建和部署的系统。这是一个反直觉但现实的问题——许多组织给生产环境配置了严格的访问控制和审计,但 CI/CD 服务器却使用共享凭证、缺少双因素认证、允许直接从 main 分支推送到生产。
OWASP 明确建议的"最小可行"清单包括:
- 生成和管理完整的 SBOM:不仅是直接依赖,还包括传递依赖(transitive dependencies)。OWASP Dependency Track 是开源选择之一。
- 移除未使用的依赖和功能:攻击面最小化原则同样适用于依赖树。
npm prune、pip-autoremove或go mod tidy应成为构建流程的一部分。 - 持续漏洞扫描:不是月度或季度的"补丁日",而是集成到 CI/CD 中的持续扫描。Dependabot、Snyk、Trivy 等工具可以实现自动化。
- 变更管理和职责分离:没有人能独自将代码从提交推到生产。这个看似流程化的要求,实际上是防止供应链攻击(如 SolarWinds 式攻击)的最后一道防线。
- 验证组件来源:使用私有仓库、签名验证(Sigstore/cosign)、哈希校验,拒绝来自不可信来源的组件进入生产环境。
A10:Mishandling of Exceptional Conditions——当"出错"成为攻击面
如果说 A03 是应用安全边界的横向扩展(从代码到生态),A10 则是纵向深入(从正常路径到异常路径)。这个全新类别包含 24 个 CWE,是 2025 版中 CWE 映射最多的类别之一,其核心命题是:程序在不可预测的情况下如何表现,决定了它的安全边界。
异常条件为什么危险
OWASP 对 A10 的定义包含三个层次的失败:
- 未预防异常:输入验证缺失、边界检查不足、资源限制未设置,导致异常条件可以被外部触发。
- 未识别异常:异常发生了,但程序没有检测到——例如空指针解引用(CWE-476)、未检查返回值(CWE-252)、超时未处理。
- 未妥善响应异常:异常被捕获了,但处理方式错误——例如失败开放(failing open,CWE-636)、错误消息泄露敏感信息(CWE-209)、事务部分提交后未回滚。
一个典型的 A10 攻击场景是:攻击者故意构造一个触发超时的请求,安全控制(如认证检查、权限验证)在超时路径中被跳过,最终访问到本应被拒绝的资源。这不是注入漏洞,也不是访问控制缺陷——它是异常处理路径中的逻辑漏洞。
A10 的 CWE 映射与工程映射
A10 包含的 24 个 CWE 可以按工程场景分类:
| 场景 | 代表性 CWE | 典型表现 |
|---|---|---|
| 信息泄露 | CWE-209 | 错误消息暴露堆栈跟踪、数据库结构、内部路径 |
| 空值/指针 | CWE-476 | 空指针解引用导致崩溃或不可预测行为 |
| 安全控制绕过 | CWE-636, CWE-274 | 异常时失败开放、权限降级 |
| 参数处理 | CWE-234 | 缺失参数未验证,导致逻辑错误 |
| 资源管理 | CWE-400, CWE-770 | 未限制资源分配,导致 DoS |
| 事务完整性 | CWE-691 | 异常时未回滚,导致数据不一致 |
这些数据揭示了 A10 的本质:它不是一个单一的漏洞类型,而是一类系统性的可靠性缺陷,在安全语境下被放大为可利用的攻击面。
"Fail Closed" vs "Fail Open"
A10 预防建议中最重要的原则是 fail closed(安全失败)。当异常发生时,系统应该回到最安全的状态,而不是最方便的状态。
| 场景 | Fail Open(危险) | Fail Closed(安全) |
|---|---|---|
| 认证服务超时 | 允许匿名访问 | 拒绝访问,返回 503 |
| 权限检查异常 | 授予默认权限 | 拒绝操作,记录审计日志 |
| 数据库连接失败 | 使用本地缓存(可能过期) | 拒绝请求,触发告警 |
| 加密操作失败 | 回退到明文传输 | 终止连接,记录错误 |
| 输入验证库崩溃 | 跳过验证继续处理 | 拒绝输入,返回验证错误 |
实现 fail closed 的工程实践包括:
- 在异常发生点捕获和处理:不要在高层统一捕获所有异常然后静默处理。OWASP 明确建议在"异常发生的函数"处处理,而不是依赖顶层的全局 catch 块。
- 全局异常处理作为兜底:在底层处理的基础上,设置全局异常处理器作为最后一道防线——记录日志、返回标准化错误响应、触发监控告警。
- 事务回滚:任何部分完成的操作(数据库事务、文件写入、网络请求)在异常时都应该回滚,而不是试图"恢复"。
- 监控和可观测性:重复的错误模式可能是攻击信号。通过日志聚合和异常检测,识别针对错误处理弱点的自动化攻击(如扫描器、爬虫)。
一个代码层面的对比
以下是两种异常处理风格的对比。假设一个用户权限检查函数:
不安全的模式(Fail Open):
def check_permission(user, resource):
try:
policy = load_policy(resource)
return policy.evaluate(user)
except Exception:
# 权限服务异常时,默认允许访问
return True安全的模式(Fail Closed):
def check_permission(user, resource):
try:
policy = load_policy(resource)
return policy.evaluate(user)
except PolicyNotFound:
# 明确的已知异常:策略不存在 = 拒绝访问
return False
except NetworkTimeout:
# 超时:拒绝访问,记录审计日志
audit_log.warning(f"Permission check timeout: user={user}, resource={resource}")
return False
except Exception as e:
# 未知异常:记录详细信息,拒绝访问,触发告警
audit_log.error(f"Unexpected permission check failure: {e}")
alert_security_team(resource, user, e)
return False这个对比展示了 A10 的核心工程要求:异常处理必须是显式的、分层的、有审计的,而不是一个 catch-all 的便利设施。
排名变化背后的结构性趋势
OWASP Top 10 2025 的排名调整不是随机波动,而是反映了软件工程和安全实践的结构性变化。理解这些趋势,有助于安全团队分配资源时做出更准确的判断。
配置驱动安全(A02 上升)
Security Misconfiguration 从 #5 上升到 #2,与"配置即代码"的普及直接相关。Kubernetes manifests、Terraform plans、AWS IAM policies、Feature flags——现代应用的行为越来越多地由配置决定,而非代码逻辑。这意味着:
- 安全审查必须覆盖配置仓库,而不仅仅是源代码。
- 配置变更需要与代码变更同等级别的审查和审计。
- 配置漂移(configuration drift)是一种持续性的安全风险,需要自动化检测(如 Terraform drift detection、OPA/Gatekeeper 策略检查)。
框架标准化降低了注入风险(A05 下降)
Injection 从 #3 降到 #5,部分原因是 ORM、参数化查询、模板自动转义等标准化实践的普及。但这不意味着可以放松警惕:
- NoSQL 注入、GraphQL 注入、LDAP 注入等变体在特定技术栈中仍然常见。
- 自定义查询构造(如动态 SQL 拼接)在复杂业务场景中难以完全避免。
- XSS 作为注入的一个子类,仍然是测试数据中最频繁出现的漏洞之一——高频但通常低影响。
供应链风险被系统性低估
A03 的数据矛盾(社区 #1 关切 vs 数据中的低 CVE 数量)揭示了一个根本问题:当前的安全测试方法论不善于发现供应链风险。SAST 和 DAST 主要扫描应用自身的代码,对依赖树的深度分析、对 CI/CD 管道安全性的评估、对构建时篡改的检测,都需要专门的工具和流程。
这要求安全团队将供应链安全从"依赖扫描"升级为一个独立的工程领域,涵盖 SBOM 管理、签名验证、构建隔离、来源追溯等能力。
异常处理成为新的质量-安全交叉点
A10 的出现标志着安全社区开始关注代码质量与安全性的交叉地带。传统上,异常处理被视为"可靠性工程"或"代码质量"的问题;但 2025 版明确将其纳入安全风险框架。这个变化呼应了现代系统的复杂性——微服务架构中,一个服务的超时可能级联影响整个调用链,而在超时路径中跳过的安全检查可能正是攻击者寻找的突破口。
工程落地:从清单到流程
OWASP Top 10 的价值不在于背诵列表,而在于将其转化为可执行的工程实践。以下是基于 2025 版变化的重点落地建议,按优先级排序。
1. 供应链安全:从扫描到治理
| 成熟度阶段 | 实践内容 | 工具/方法示例 |
|---|---|---|
| 基础 | 生成并维护 SBOM | Syft, Trivy, npm sbom, pip-licenses |
| 基础 | 持续漏洞扫描 | Dependabot, Snyk, Trivy, OWASP Dependency Track |
| 进阶 | 依赖签名验证 | Sigstore/cosign, npm provenance, GPG 签名 |
| 进阶 | 私有仓库与来源控制 | Nexus, Artifactory, verified publishers |
| 高级 | CI/CD 管道隔离与加固 | 最小权限 runner、隔离构建环境、不可变制品 |
| 高级 | 供应链可观测性 | 制品溯源、构建日志审计、SBOM 版本追踪 |
关键工程原则:CI/CD 的安全级别 ≥ 生产环境。如果攻击者能控制你的构建管道,他就不需要攻击你的生产环境。
2. 异常处理:从代码规范到架构设计
| 实践 | 具体要求 | 验证方法 |
|---|---|---|
| 分层异常处理 | 底层捕获 + 全局兜底,避免 catch-all 静默处理 | 代码审查:检查空的 catch 块和泛化的 Exception 捕获 |
| Fail Closed 设计 | 所有安全控制异常时默认拒绝 | 故障注入测试:模拟依赖超时/崩溃,验证访问被拒绝 |
| 信息泄露防护 | 错误消息不包含堆栈、路径、内部结构 | 自动化测试:触发错误,检查响应体 |
| 事务完整性 | 异常时显式回滚,不依赖隐式行为 | 单元测试:模拟中断,验证数据一致性 |
| 异常监控 | 聚合错误模式,识别攻击信号 | SIEM/日志平台:配置异常阈值告警 |
一个可操作的检查点:在代码审查中,将"异常处理是否安全"作为独立审查项——不仅仅是"有没有 try-catch",而是"异常时系统是否回到安全状态"。
3. 配置安全:从人工检查到策略即代码
Security Misconfiguration 的上升要求将配置审查纳入安全流程:
- 静态配置分析:使用 Checkov、tfsec、KICS 等工具扫描 IaC 配置。
- 运行时策略执行:使用 OPA/Gatekeeper(Kubernetes)、AWS Config Rules、Azure Policy 阻止不合规配置进入生产。
- 配置变更审计:所有配置变更通过版本控制(Git)管理,与代码变更一样需要审查和审批。
- 配置漂移检测:定期比对运行配置与基线,发现未授权的变更。
4. SAST/DAST 规则映射更新
如果团队使用 SAST 工具(如 Semgrep、SonarQube、Checkmarx),需要确认工具已更新到 OWASP Top 10 2025 映射。以 Semgrep 为例,其 4,000+ 条规则已更新映射,可以直接在扫描报告中看到发现对应哪个 2025 类别。
更新映射的意义不仅是标签对齐,更是确保新类别(A03、A10)有对应的检测规则覆盖。如果现有工具不支持 A10 的异常处理检测,需要评估是否需要补充自定义规则或引入专门的代码质量工具。
结论:边界迁移与工程响应
OWASP Top 10 2025 的变化可以归纳为一句话:应用安全的边界正在从代码本身向上下游延伸。
- 向上游,是供应链——你写的代码只占最终运行系统的极小比例,其余是框架、库、运行时、构建工具、CI/CD 管道。A03 的存在提醒我们,信任链必须从代码提交一直追溯到依赖来源。
- 向下游,是运行时行为——代码在异常条件下的表现与其正常路径同等重要。A10 的存在提醒我们,安全控制不能只在"一切正常"时有效,必须在故障、超时、资源耗尽时依然保持。
- 向内,是配置——越来越多的安全属性由配置而非代码决定。A02 的上升提醒我们,配置错误与代码漏洞具有同等的安全影响。
对于工程团队而言,这些变化意味着:
- 安全左移需要继续左移:从代码扫描扩展到依赖扫描、构建管道审计、SBOM 管理。
- 安全右移需要关注异常路径:从功能测试扩展到故障注入、混沌工程、异常处理审查。
- 安全不再是单一团队的职责:开发人员需要理解供应链风险,运维人员需要理解配置安全,安全团队需要理解工程约束。
OWASP Top 10 2025 不是一份待办清单,而是一面镜子——它反映的不是"我们应该修复什么",而是"我们的工程实践在哪个层面还有盲区"。
