4. 镜像供应链威胁模型:依赖混淆攻击、恶意镜像注入、中间人攻击场景
在镜像供应链中,从开发者编写代码到最终部署运行,整个链路涉及多个环节:代码仓库、构建系统、镜像仓库、镜像分发网络以及运行时环境。每个环节都可能成为攻击者的目标。本章聚焦三种最具代表性的供应链攻击场景:依赖混淆攻击、恶意镜像注入和中间人攻击,并分析其攻击原理、危害及防御思路。
4.1 依赖混淆攻击(Dependency Confusion Attack)
依赖混淆攻击的核心原理是利用包管理器的优先级解析机制。当镜像构建过程中使用 pip install 或 npm install 等命令时,包管理器会按照预定义的源顺序查找依赖包。攻击者通过向公共仓库上传与内部私有包同名的恶意包,且版本号更高,即可诱使构建系统从公共源下载恶意包,而非从内部私有源获取。
攻击前提:内部项目使用了私有包名,但该包名在公共 PyPI / npm 上未被注册;或者构建配置中公共源优先级高于私有源。
4.1.1 攻击流程
- 侦察:攻击者通过分析公开的 Dockerfile、requirements.txt、package.json 或 CI 日志,获取内部使用的私有包名。
- 注册:攻击者在公共 PyPI / npm 上注册同名包,并设置一个极高的版本号(如 9999.0.0)。
- 投毒:恶意包中包含后门代码(如反弹 shell、窃取环境变量、植入挖矿程序)。
- 触发:内部 CI/CD 流水线执行
pip install或npm install时,包管理器优先从公共源拉取高版本恶意包。 - 感染:恶意代码在构建阶段被执行,污染镜像层,并可能横向移动至生产环境。
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 图展示了恶意镜像注入的典型攻击树结构,从攻击入口到最终影响路径。
4.3 中间人攻击(Man-in-the-Middle, MITM)
在镜像拉取和推送过程中,数据流经网络传输层。如果传输通道未加密或证书验证不严格,攻击者可以在客户端与镜像仓库之间实施中间人攻击,拦截、篡改或替换镜像数据。
4.3.1 攻击场景分类
| 攻击类型 | 攻击位置 | 典型手法 | 危害等级 |
|---|---|---|---|
| HTTPS 降级攻击 | 客户端与仓库之间 | 强制使用 HTTP 回退,拦截明文流量 | 高 |
| 证书伪造攻击 | 代理服务器或网关 | 部署伪造 CA 证书,劫持 TLS 连接 | 严重 |
| 镜像层替换攻击 | 镜像分发 CDN 节点 | 篡改镜像层 tar 文件,植入恶意层 | 严重 |
| 镜像索引篡改 | 镜像仓库 API 响应 | 修改 manifest 文件,指向恶意镜像层 | 严重 |
4.3.2 攻击链路示意
以下 SVG 图展示了从客户端到镜像仓库的完整传输链路,以及中间人攻击的介入点。
4.4 三种威胁模型对比
| 威胁模型 | 攻击阶段 | 攻击目标 | 检测难度 | 典型防御 |
|---|---|---|---|---|
| 依赖混淆攻击 | 构建阶段(依赖解析) | 包管理器解析逻辑 | 中 | 源锁定 + 哈希校验 + SBOM |
| 恶意镜像注入 | 构建/推送阶段 | 镜像层数据 | 高 | 镜像签名 + 准入控制 + 扫描 |
| 中间人攻击 | 传输阶段 | 网络通道 | 中 | TLS + 证书固定 + 签名验证 |
安全水位巡检提示:在权限审计中,应重点检查以下配置项:
• 构建流水线是否使用了
• 镜像仓库是否启用了 Cosign / Notary 签名验证策略;
• 客户端 Docker 配置是否启用了
• 构建流水线是否使用了
--extra-index-url 且未锁定源优先级;• 镜像仓库是否启用了 Cosign / Notary 签名验证策略;
• 客户端 Docker 配置是否启用了
tlsverify 并指定了 CA 证书路径。
4.5 综合防御架构建议
针对上述三种威胁模型,推荐在镜像供应链中建立分层防御体系:
- 第一层(构建前):依赖源锁定、哈希校验、SBOM 生成与比对。
- 第二层(构建中):镜像签名(Cosign)、构建缓存隔离、最小权限 CI 令牌。
- 第三层(传输中):TLS 双向认证、证书固定、镜像层完整性校验。
- 第四层(运行时):镜像扫描(Trivy / Grype)、运行时行为监控(Falco)。