3. 供应链攻击案例:典型镜像供应链攻击的技术原理与教训
镜像供应链攻击并非理论威胁,而是已多次在真实世界中造成巨大破坏。本节深入剖析两个最具代表性的攻击案例——SolarWinds 与 CodeCov,从技术原理、攻击链拆解、镜像供应链映射三个维度还原攻击全貌,并提炼出可直接指导信任边界配置的实战教训。
3.1 SolarWinds 攻击:上游污染引发的下游海啸
2020 年底曝光的 SolarWinds 攻击是迄今为止影响最广的软件供应链攻击。攻击者并未直接攻击 SolarWinds 的客户,而是通过污染其核心产品 Orion 平台的构建与分发流程,将恶意代码植入合法签名的更新包中,最终感染约 18,000 家组织。
3.1.1 攻击链技术原理
| 阶段 | 技术动作 | 镜像供应链映射 |
|---|---|---|
| 1. 初始入侵 | 攻击者通过密码喷洒、凭证窃取等方式进入 SolarWinds 内部网络,潜伏数月。 | 相当于攻击者获得了镜像仓库的 push 权限或 CI 系统的访问令牌。 |
| 2. 构建环境篡改 | 在 Orion 软件的构建服务器中植入后门代码 SolarWinds.Orion.Core.BusinessLayer.dll,该代码被编译进合法的数字签名流程。 |
相当于在 Dockerfile 构建阶段注入了恶意层,但基础镜像和签名均显示为合法。 |
| 3. 签名与分发 | 恶意 DLL 随正常构建产物一起被 SolarWinds 的私钥签名,上传至官方更新服务器。 | 镜像被 合法签名并推送至官方 Registry,客户端拉取时信任链完整。 |
| 4. 下游激活 | 客户通过自动更新机制拉取恶意更新包,后门 DLL 在内存中执行,建立 C2 通道。 | 相当于容器运行时拉取了带有恶意层的镜像,运行时扫描无法检测到静态恶意文件。 |
关键教训:SolarWinds 攻击的核心在于攻击者绕过了 构建阶段的信任验证。即使镜像经过签名、扫描无已知漏洞,只要构建环境被污染,最终产物就不可信。这直接催生了 “不可变构建” 与 “SLSA 框架” 的行业共识。
3.1.2 攻击链 SVG 图示
3.2 CodeCov 攻击:上游依赖篡改的镜像层污染
2021 年 4 月,代码覆盖率工具 CodeCov Bash Uploader 被攻击者篡改。攻击者利用 CodeCov 的 Docker 镜像构建流程中的漏洞,修改了上传脚本,窃取用户的环境变量、CI 令牌和私有仓库凭证。该攻击直接展示了 上游依赖镜像被污染后如何向下游扩散。
3.2.1 攻击技术细节
- 攻击入口:CodeCov 的 Docker 镜像构建过程中使用了 未锁定版本的基础镜像(
FROM ubuntu:latest),攻击者通过中间人攻击或镜像仓库劫持替换了基础层。 - 恶意载荷:篡改后的
uploader.sh脚本在收集覆盖率数据的同时,将CI_、AWS_ACCESS_KEY_ID等敏感环境变量外发至攻击者控制的服务器。 - 传播范围:任何在 CI 中引用该 Docker 镜像的项目,其构建环境中的凭证均可能被窃取。受影响组织包括 Twilio、Hashicorp 等数百家科技公司。
镜像供应链警示:CodeCov 攻击暴露了 “基础镜像版本锁定” 与 “镜像内容完整性验证” 的双重缺失。如果使用
latest 标签或未验证镜像摘要(digest),攻击者只需替换 Registry 中的镜像层即可完成供应链投毒。
3.2.2 攻击流程与信任边界 SVG 图示
3.3 从案例中提炼的信任边界配置教训
综合 SolarWinds 与 CodeCov 两个案例,可以归纳出以下直接指导镜像供应链信任边界配置的教训:
| 教训维度 | 具体教训 | 信任边界配置动作 |
|---|---|---|
| 构建环境 | 构建服务器被入侵后,所有产物均不可信 | 实施 SLSA Level 3+ 构建隔离;对构建环境进行硬件信任根验证 |
| 基础镜像 | 未锁定版本的基础镜像可被替换 | 始终使用 @sha256:... 摘要引用;配置 镜像内容信任(Notary / Cosign) |
| 签名验证 | 合法签名不代表内容未被篡改 | 签名必须绑定 构建元数据(来源、材料清单);验证签名链的完整性 |
| 运行时检测 | 静态扫描无法检测内存加载的后门 | 部署 运行时行为监控(Falco / Tracee);对异常网络连接告警 |
| 凭证管理 | CI 环境中的凭证是攻击者的首要目标 | 使用 短期令牌;对 CI 环境实施最小权限原则;禁止在镜像中硬编码凭证 |