4. 镜像供应链威胁模型:依赖混淆攻击、恶意镜像注入、中间人攻击场景

在镜像供应链中,从开发者编写代码到最终部署运行,整个链路涉及多个环节:代码仓库、构建系统、镜像仓库、镜像分发网络以及运行时环境。每个环节都可能成为攻击者的目标。本章聚焦三种最具代表性的供应链攻击场景:依赖混淆攻击、恶意镜像注入和中间人攻击,并分析其攻击原理、危害及防御思路。

4.1 依赖混淆攻击(Dependency Confusion Attack)

依赖混淆攻击的核心原理是利用包管理器的优先级解析机制。当镜像构建过程中使用 pip install 或 npm install 等命令时,包管理器会按照预定义的源顺序查找依赖包。攻击者通过向公共仓库上传与内部私有包同名的恶意包,且版本号更高,即可诱使构建系统从公共源下载恶意包,而非从内部私有源获取。

攻击前提:内部项目使用了私有包名,但该包名在公共 PyPI / npm 上未被注册;或者构建配置中公共源优先级高于私有源。

4.1.1 攻击流程

  1. 侦察:攻击者通过分析公开的 Dockerfile、requirements.txt、package.json 或 CI 日志,获取内部使用的私有包名。
  2. 注册:攻击者在公共 PyPI / npm 上注册同名包,并设置一个极高的版本号(如 9999.0.0)。
  3. 投毒:恶意包中包含后门代码(如反弹 shell、窃取环境变量、植入挖矿程序)。
  4. 触发:内部 CI/CD 流水线执行 pip install 或 npm install 时,包管理器优先从公共源拉取高版本恶意包。
  5. 感染:恶意代码在构建阶段被执行,污染镜像层,并可能横向移动至生产环境。

4.1.2 防御措施

防御层级 具体措施 说明
构建配置 锁定包管理器源 在 pip.conf 或 .npmrc 中显式指定私有源为唯一源,禁用公共源回退。
依赖锁定 使用哈希校验 在 requirements.txt 或 package-lock.json 中锁定每个依赖的哈希值,构建时验证完整性。
镜像扫描 SBOM 比对 构建后生成软件物料清单(SBOM),与预期依赖列表比对,发现未知来源的包。
命名空间 注册内部包名 即使不使用公共源,也主动在公共仓库注册内部包名(占位),防止被恶意注册。
巡检要点:在镜像供应链安全水位巡检中,应重点检查 requirements.txt 和 Dockerfile 中是否使用了 --index-url 或 --extra-index-url 参数,以及是否存在未锁定哈希的依赖项。

4.2 恶意镜像注入(Malicious Image Injection)

恶意镜像注入是指攻击者将包含后门、木马或漏洞利用代码的镜像,通过某种方式注入到目标组织的镜像仓库或构建流水线中。与依赖混淆攻击不同,恶意镜像注入直接作用于镜像层,而非构建时的依赖解析阶段。

4.2.1 常见注入场景

  • 上游镜像投毒:攻击者向 Docker Hub、Quay.io 等公共仓库上传包含恶意负载的镜像,并伪装成流行基础镜像(如 python:3.11-slim-backdoor)。
  • CI/CD 凭证泄露:攻击者通过泄露的 CI 令牌或仓库推送权限,直接向内部镜像仓库推送恶意镜像。
  • 镜像层替换:在镜像拉取过程中,通过中间人攻击替换镜像层数据(详见 4.3 节)。
  • 构建缓存投毒:攻击者利用 Docker 构建缓存机制,在共享构建环境中植入恶意缓存层,后续构建复用该层时引入恶意代码。

4.2.2 攻击树分析

以下 SVG 图展示了恶意镜像注入的典型攻击树结构,从攻击入口到最终影响路径。

恶意镜像注入攻击树 恶意镜像注入 上游镜像投毒 CI/CD 凭证泄露 构建缓存投毒 伪造基础镜像 恶意标签覆盖 令牌泄露 仓库权限滥用 共享缓存污染 缓存键碰撞 影响:镜像层污染 → 运行时后门 → 数据泄露

4.3 中间人攻击(Man-in-the-Middle, MITM)

在镜像拉取和推送过程中,数据流经网络传输层。如果传输通道未加密或证书验证不严格,攻击者可以在客户端与镜像仓库之间实施中间人攻击,拦截、篡改或替换镜像数据。

4.3.1 攻击场景分类

攻击类型 攻击位置 典型手法 危害等级
HTTPS 降级攻击 客户端与仓库之间 强制使用 HTTP 回退,拦截明文流量 高
证书伪造攻击 代理服务器或网关 部署伪造 CA 证书,劫持 TLS 连接 严重
镜像层替换攻击 镜像分发 CDN 节点 篡改镜像层 tar 文件,植入恶意层 严重
镜像索引篡改 镜像仓库 API 响应 修改 manifest 文件,指向恶意镜像层 严重

4.3.2 攻击链路示意

以下 SVG 图展示了从客户端到镜像仓库的完整传输链路,以及中间人攻击的介入点。

镜像拉取中间人攻击链路 Docker 客户端 docker pull 中间人代理 证书劫持 / 流量篡改 镜像仓库 Harbor / Docker Hub 攻击者操作 1. 拦截 TLS 握手,伪造证书 2. 替换镜像层数据(恶意层) 防御:TLS 双向认证 + 证书固定(Certificate Pinning)+ 镜像签名验证(Cosign / Notary) 确保客户端只信任特定 CA 签发的仓库证书,并对镜像层进行数字签名验证

4.4 三种威胁模型对比

威胁模型 攻击阶段 攻击目标 检测难度 典型防御
依赖混淆攻击 构建阶段(依赖解析) 包管理器解析逻辑 中 源锁定 + 哈希校验 + SBOM
恶意镜像注入 构建/推送阶段 镜像层数据 高 镜像签名 + 准入控制 + 扫描
中间人攻击 传输阶段 网络通道 中 TLS + 证书固定 + 签名验证
安全水位巡检提示:在权限审计中,应重点检查以下配置项:
• 构建流水线是否使用了 --extra-index-url 且未锁定源优先级;
• 镜像仓库是否启用了 Cosign / Notary 签名验证策略;
• 客户端 Docker 配置是否启用了 tlsverify 并指定了 CA 证书路径。

4.5 综合防御架构建议

针对上述三种威胁模型,推荐在镜像供应链中建立分层防御体系:

  • 第一层(构建前):依赖源锁定、哈希校验、SBOM 生成与比对。
  • 第二层(构建中):镜像签名(Cosign)、构建缓存隔离、最小权限 CI 令牌。
  • 第三层(传输中):TLS 双向认证、证书固定、镜像层完整性校验。
  • 第四层(运行时):镜像扫描(Trivy / Grype)、运行时行为监控(Falco)。