Sooua
登录
返回文章列表
应用安全··16 分钟阅读

OWASP Top 10 2025 变化拆解:供应链与异常条件进入前十的工程信号

OWASP Top 10 2025 的两个新类别——Software Supply Chain Failures 和 Mishandling of Exceptional Conditions——不仅刷新了风险排名,更传递了一个明确的工程信号:应用安全的边界正在从'我写的代码'扩展到'我依赖的生态系统'和'代码出错时的行为'。

2025 年 11 月 6 日,OWASP 基金会发布了 Top 10 的第八版。这是自 2021 年以来的首次重大更新,基于超过 175,000 条 CVE 记录、589 个 CWE 以及 280 万应用的测试数据。表面看,这只是一份排名刷新;但从工程视角审视,两个全新类别进入前十——A03 Software Supply Chain FailuresA10 Mishandling of Exceptional Conditions——传递了一个明确信号:应用安全的边界正在从"我写的代码"扩展到"我依赖的生态系统"和"代码出错时的行为"。

这不是列表的平移,而是安全关注点的结构性迁移。

从 2021 到 2025:什么变了,什么没变

OWASP Top 10 2025 保留了 2021 版的 8 个类别,新增 2 个,合并 1 个,排名发生显著调整。理解这些变化的最好方式不是背诵新列表,而是追问:为什么某些风险上升,某些下降,又有哪些全新的风险被识别出来。

2021 排名2021 类别2025 排名2025 类别变化
A01Broken Access ControlA01Broken Access Control保持第一,SSRF 并入此类
A02Cryptographic FailuresA04Cryptographic Failures下降 2 位
A03InjectionA05Injection下降 2 位
A04Insecure DesignA06Insecure Design下降 2 位
A05Security MisconfigurationA02Security Misconfiguration上升至 #2
A06Vulnerable and Outdated ComponentsA03Software Supply Chain Failures扩展为新类别
A07Identification and Authentication FailuresA07Authentication Failures保持 #7,名称精简
A08Software and Data Integrity FailuresA08Software or Data Integrity Failures保持 #8,名称微调
A09Security Logging and Monitoring FailuresA09Security Logging and Alerting Failures保持 #9,强调告警
A10Server-Side Request Forgery (SSRF)跌出前十,并入 A01
A10Mishandling 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 明确建议的"最小可行"清单包括:

  1. 生成和管理完整的 SBOM:不仅是直接依赖,还包括传递依赖(transitive dependencies)。OWASP Dependency Track 是开源选择之一。
  2. 移除未使用的依赖和功能:攻击面最小化原则同样适用于依赖树。npm prunepip-autoremovego mod tidy 应成为构建流程的一部分。
  3. 持续漏洞扫描:不是月度或季度的"补丁日",而是集成到 CI/CD 中的持续扫描。Dependabot、Snyk、Trivy 等工具可以实现自动化。
  4. 变更管理和职责分离:没有人能独自将代码从提交推到生产。这个看似流程化的要求,实际上是防止供应链攻击(如 SolarWinds 式攻击)的最后一道防线。
  5. 验证组件来源:使用私有仓库、签名验证(Sigstore/cosign)、哈希校验,拒绝来自不可信来源的组件进入生产环境。

A10:Mishandling of Exceptional Conditions——当"出错"成为攻击面

如果说 A03 是应用安全边界的横向扩展(从代码到生态),A10 则是纵向深入(从正常路径到异常路径)。这个全新类别包含 24 个 CWE,是 2025 版中 CWE 映射最多的类别之一,其核心命题是:程序在不可预测的情况下如何表现,决定了它的安全边界

异常条件为什么危险

OWASP 对 A10 的定义包含三个层次的失败:

  1. 未预防异常:输入验证缺失、边界检查不足、资源限制未设置,导致异常条件可以被外部触发。
  2. 未识别异常:异常发生了,但程序没有检测到——例如空指针解引用(CWE-476)、未检查返回值(CWE-252)、超时未处理。
  3. 未妥善响应异常:异常被捕获了,但处理方式错误——例如失败开放(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. 供应链安全:从扫描到治理

成熟度阶段实践内容工具/方法示例
基础生成并维护 SBOMSyft, 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 的上升提醒我们,配置错误与代码漏洞具有同等的安全影响。

对于工程团队而言,这些变化意味着:

  1. 安全左移需要继续左移:从代码扫描扩展到依赖扫描、构建管道审计、SBOM 管理。
  2. 安全右移需要关注异常路径:从功能测试扩展到故障注入、混沌工程、异常处理审查。
  3. 安全不再是单一团队的职责:开发人员需要理解供应链风险,运维人员需要理解配置安全,安全团队需要理解工程约束。

OWASP Top 10 2025 不是一份待办清单,而是一面镜子——它反映的不是"我们应该修复什么",而是"我们的工程实践在哪个层面还有盲区"。

分享

评论

登录 后参与讨论。

加载中…

相关文章