CI/CD 中的意图验证差距:为何身份验证在真实攻击下失败

发布: (2026年2月7日 GMT+8 15:56)
9 分钟阅读
原文: Dev.to

Source: Dev.to

概述

现代 CI/CD 流水线建立在一个看似简单的假设之上:

如果一个操作来源于有效的会话令牌,则它必定来源于有效的人类意图。

这个假设听起来直观。工程师使用 SSO 进行身份验证,获取会话令牌,而这些令牌授权将代码部署到生产环境。如果令牌有效且用户拥有正确的角色,系统就会继续执行。

SolarWindsCodecovLog4j 表明,这一假设在实践中是错误的。

在这三种情况下,系统从 授权 角度来看都表现“正确”:

  • 凭证是有效的
  • 令牌是合法的
  • 流水线按设计执行

然而,却导致了灾难性的后果。

Source:

意图验证缺口

本文介绍了我所称的 意图验证缺口:现代 CI/CD 安全模型在区分 凭证拥有权有意识的人类意图 时的结构性失效。该缺口并非理论上的概念——它正是现实世界高级持续性威胁(APT)所利用的攻击面。

随机信任模型

大多数 CI/CD 流水线遵循 随机信任模型

  1. 用户在某个时间点进行身份验证。
  2. 会话令牌会持续数小时。
  3. 在该时间窗口内执行的操作被视为反映持续的用户意图。

该模型是 概率性的。它假设在令牌有效期间,用户仍然控制着其设备、网络和执行环境。而现代威胁模型打破了这一假设。

一旦恶意软件入侵终端,系统就无法区分:

  • 人类有意部署代码
  • 恶意软件使用相同的令牌部署恶意制品

从流水线的角度来看,两者是不可区分的:签名有效、角色正确,授权检查通过。这 不是实现上的 bug——而是信任模型本身的缺陷。

身份验证 vs. 意图

在安全术语中,我们区分:

概念问题
Authentication (AuthN)你是谁?
Authorization (AuthZ)你被允许这么做吗?

AuthN 和 AuthZ 都没有回答第三个、更重要的问题:

人类是否在此时此刻有意识地打算执行此特定操作?

典型流水线流程

  1. 身份断言 – SSO / token
  2. 特权检查DEPLOY_PROD 角色
  3. 执行 – 生产变更

此顺序 证明了权限,而非意图。若恶意软件使用缓存的令牌执行部署,系统在“正确”运行的同时,从安全角度却灾难性地失败。这就是意图验证缺口。

真实案例

SolarWinds Sunburst

通常被描述为“构建系统被攻破”,更深层次的失误是 意图验证

  • 构建系统编译了恶意代码。
  • 它对产物进行了签名。
  • 它将产物分发给客户。

从 CI/CD 流水线的角度来看,似乎没有任何问题。缺失的关键问题从未被提出:

是否有人类有意识地打算部署这个特定的产物?

一旦构建服务器被入侵,密码学签名便失去了意义。服务器会像签署合法代码一样轻易签署恶意软件。

Codecov 违规

该违规持续了数月,因为 没有不可变的取证痕迹 能记录随时间在流水线中实际运行了哪些代码。从流水线的视角:

  • 脚本被下载。
  • 环境变量被导出。
  • 所有操作正常执行。

没有防篡改的记录,我们无法回答:

  • 哪些操作是被授权的?
  • 它们何时发生的?
  • 实际执行了哪些代码?

无法保留取证真相的安全系统,在遭受入侵后就无法重建真实情况。

The Dirty Laptop Hypothesis

现代开发者工作站是敌对领地。典型的笔记本电脑运行着:

  • Browser extensions
  • Background daemons
  • Package managers
  • Chat clients
  • Build tools
  • Remote‑access agents

这些都可能被攻陷。然而大多数安全系统默认同一台机器可以:

  • 显示批准 UI
  • 生成加密签名
  • 安全传递意图

Dirty Laptop Hypothesis: Any general‑purpose computing device used for development must be treated as compromised by default.

如果批准和签名在同一台开发设备上进行,恶意软件可以在用户看到的内容与实际签名的内容之间做手脚——从而打破信任边界。

为什么基于流程的控制会失败

行业对供应链攻击的响应通常是 程序化 的:

  • 更多审批
  • 更多政策
  • 更多合规检查清单
  • 更多培训

这些是 基于流程的控制。当底层执行环境被破坏时,它们会失效:

  • 被破坏的编译器不遵守同行评审。
  • 被破坏的构建服务器不遵守管理层签字。

基于物理的安全反论

安全必须根植于攻击者仅凭软件无法绕过的约束。 示例:

  • 物理存在
  • 硬件隔离签名(例如 HSM)
  • 空气隔离的审批通道
  • 不可变存储(例如 WORM 驱动器)

当安全依赖于物理属性时,攻击者必须跨域:digital → physical,从而显著提升攻击成本。

令牌如空白支票

  • 它们在数小时内保持有效。
  • 它们可以被重放。
  • 它们可能被外泄。
  • 它们可以被恶意软件代理。

令牌 消除时间上下文,将高风险操作转换为低熵信号。这就是在敌对端点假设下,基于令牌的部署授权 结构上不安全 的原因。

部署应要求新的意图证明,而不是继承自早前登录事件的授权。

转变焦点:从身份到意图

现代 DevSecOps 痴迷于回答:

这是谁?

但在受损的环境中,身份并不重要。真正关键的是:

这个人是否有意识地授权了此规范?

CI/CD 流水线中的意图验证

  • Intent(意图)是行为,而不是状态。
  • Identity(身份)是状态,而不是行为。

在现代 CI/CD 流水线中,安全系统如果仅验证身份而验证意图,就会对最关键的失效模式视而不见。

意图验证缺口

一旦接受了意图验证缺口,随之而来的有若干架构需求:

  • 批准必须基于每一次行为,而非每个会话
  • 签名必须在物理上与开发环境隔离
  • 授权必须通过加密方式绑定到特定的制品和环境
  • 日志必须天生不可篡改
  • 阻力应与风险成比例,而非统一

这些原则构成了意图验证架构的基础。

关键要点

  • Identity(身份)是便利层。
  • Intent(意图)是安全边界。

只有当 CI/CD 系统将人类意图视为一等的加密原语时,供应链攻击才会被阻止;否则它们将继续绕过控制,仍能通过所有合规检查。

CI/CD 安全的未来不是更多的仪表盘。
而是更少的信任假设

0 浏览
Back to Blog

相关文章

阅读更多 »

UX/UI 排版

Typography 是指什么?- 使用哪种字体 - 在什么位置多大 - 多粗 - 行间距 - …