2、镜像供应链安全基础:镜像生命周期、供应链攻击面分析、常见威胁模型
2.1 镜像生命周期全景
容器镜像并非静态的二进制文件,而是一个从构建到运行再到归档的动态制品。理解其完整生命周期,是定位安全风险的前提。
| 阶段 | 关键活动 | 安全关注点 |
|---|---|---|
| 1. 构建 | Dockerfile 编写、基础镜像拉取、层叠加、依赖安装 | 基础镜像来源、构建缓存污染、恶意依赖注入 |
| 2. 分发 | 镜像推送至仓库、镜像签名、镜像同步 | 仓库访问控制、镜像篡改、中间人劫持 |
| 3. 部署 | 镜像拉取、运行时配置、容器启动 | 镜像验证缺失、密钥泄露、运行时逃逸 |
| 4. 运行 | 容器进程、网络通信、存储挂载 | 漏洞利用、横向移动、数据泄露 |
| 5. 归档/退役 | 镜像清理、版本冻结、审计追溯 | 残留敏感数据、未清理的旧版本漏洞 |
关键认知: 镜像供应链安全不是“构建时一次性扫描”就能解决的。每个阶段都可能引入新的攻击面,且攻击效果会沿生命周期向下游传递。
2.2 供应链攻击面分析
攻击者可以在镜像生命周期的任意环节植入恶意载荷。以下按攻击面类型进行结构化梳理:
- 上游依赖攻击面
- 基础镜像投毒:攻击者篡改官方或第三方基础镜像,植入后门。
- 软件包仓库劫持:PyPI、npm、Maven 等仓库中的恶意包。
- Git 子模块/源码依赖:被篡改的源码仓库或 commit。
- 构建过程攻击面
- CI/CD 管道注入:恶意修改构建脚本或 Dockerfile。
- 构建缓存污染:利用缓存层持久化恶意内容。
- 多阶段构建泄露:中间产物未清理,残留密钥或证书。
- 分发与存储攻击面
- 镜像仓库未授权访问:公开仓库或弱认证仓库。
- 镜像签名缺失:无法验证镜像完整性和来源。
- 镜像标签篡改:利用
latest标签覆盖合法镜像。
- 运行时攻击面
- 特权容器滥用:容器逃逸至宿主机。
- 挂载敏感目录:宿主机文件系统被容器内进程访问。
- 网络策略缺失:容器间横向移动。
实战警示: 2023 年某知名云厂商的镜像仓库因未启用签名验证,导致攻击者通过中间人替换镜像层,在数千个生产容器中植入挖矿程序。该事件从构建到发现历时 47 天。
2.3 常见威胁模型
为了系统化评估风险,业界通常采用以下三种威胁模型对镜像供应链进行抽象:
2.3.1 STRIDE 模型映射
| 威胁类型 | 镜像供应链场景 | 风险等级 |
|---|---|---|
| S 身份欺骗 | 攻击者伪造镜像签名或仓库身份 | 高 |
| T 篡改 | 镜像层内容被中间人替换 | 高 |
| R 抵赖 | 无签名审计日志,无法追溯镜像来源 | 中 |
| I 信息泄露 | 镜像层残留密钥、密码或 | 高 |
| D 拒绝服务 | 恶意镜像耗尽仓库存储或节点资源 | 中 |
| E 权限提升 | 容器内漏洞导致宿主机 root 权限 | 极高 |
2.3.2 攻击树模型(Attack Tree)
攻击树以“最终目标”为根节点,逐层分解攻击路径。以下为镜像供应链攻击树的典型结构:
根目标:在目标集群中运行恶意容器
├── 1.0 植入恶意镜像
│ ├── 1.1 篡改基础镜像(上游投毒)
│ ├── 1.2 在 CI 管道注入恶意层
│ └── 1.3 利用仓库漏洞上传恶意镜像
├── 2.0 绕过镜像验证
│ ├── 2.1 禁用镜像签名校验
│ ├── 2.2 利用标签覆盖合法镜像
│ └── 2.3 伪造镜像签名证书
└── 3.0 触发恶意负载
├── 3.1 容器启动时执行恶意 entrypoint
├── 3.2 利用运行时漏洞逃逸
└── 3.3 通过挂载卷泄露宿主机数据
2.4 镜像供应链攻击面全景图
下图将生命周期、攻击面和威胁模型整合为一张全景视图,便于在复测复核中快速定位风险节点:
2.5 复测复核中的风险控制要点
基于上述攻击面和威胁模型,在复测记录复核中应重点关注以下风险控制点:
- 镜像来源验证:确认所有基础镜像均来自受信仓库,且具有可验证的签名。
- 构建过程审计:检查 CI/CD 管道日志,确保无未授权的构建步骤或层注入。
- 镜像层扫描:对每一层进行漏洞扫描和敏感信息检测,不遗漏中间层。
- 签名与完整性校验:部署前强制验证镜像签名,拒绝未签名或签名失效的镜像。
- 运行时基线检查:对照 CIS Benchmark 检查容器运行时配置,关闭特权模式和非必要挂载。
复测复核提示: 在复测记录中,如果发现某个阶段缺少对应的威胁模型覆盖(例如仅检查了构建阶段漏洞,未检查分发阶段的签名验证),应标记为“测试覆盖缺口”,并提升风险等级。