3、镜像供应链威胁模型
镜像供应链安全是 K8s 准入控制的核心防御场景。攻击者不再直接攻击运行时容器,而是将恶意代码注入镜像构建、分发或部署的任意环节。理解威胁模型是设计准入规则的前提。
3.1 软件供应链攻击(Supply Chain Attack)
攻击者通过污染上游依赖、构建工具或镜像仓库,使合法镜像携带恶意载荷。这类攻击隐蔽性强,影响范围广。
| 攻击阶段 | 典型手法 | 影响范围 |
|---|---|---|
| 源码依赖 | 篡改 npm/PyPI/Maven 包,植入后门 | 所有引用该包的项目 |
| 构建环境 | CI/CD 凭证泄露、恶意构建插件 | 该流水线产出的所有镜像 |
| 镜像仓库 | 未授权访问、镜像标签覆盖、中间人攻击 | 拉取该镜像的所有集群 |
| 基础镜像 | 使用被污染的官方或第三方基础镜像 | 所有基于该基础镜像构建的镜像 |
案例:2021 年 Codecov 事件中,攻击者篡改了 Bash Uploader 脚本,导致所有使用该工具的 CI 流水线凭证泄露,进而污染了数千个下游镜像。
3.2 镜像投毒(Image Poisoning)
攻击者将恶意镜像推送到公开或私有仓库,诱使或迫使 K8s 集群拉取并运行。投毒方式包括:
- 标签劫持:将恶意镜像推送到与合法镜像相同的仓库和标签(如
nginx:latest),利用缓存失效或拉取策略覆盖。 - 名字相似:注册与知名镜像名称极其相似的仓库(如
kubnernetes而非kubernetes),利用拼写错误。 - 层注入:在合法镜像的中间层插入恶意文件,保留原始标签和摘要,但实际内容已被篡改。
- 元数据伪造:伪造镜像签名、SBOM(软件物料清单)或漏洞扫描报告,绕过准入控制器的校验。
注意:仅依赖镜像标签(tag)进行信任决策是危险的。必须使用摘要(digest)或签名(signature)作为准入控制的唯一标识。
3.3 依赖混淆(Dependency Confusion)
当镜像构建过程中同时引用私有包和公开包时,攻击者在公开仓库上传与私有包同名的恶意包。包管理器优先选择版本号更高的公开包,导致恶意代码被引入镜像。
| 维度 | 私有包 | 恶意公开包 |
|---|---|---|
| 名称 | internal-auth-lib |
internal-auth-lib |
| 版本 | 1.0.0 |
99.0.0(更高) |
| 来源 | 私有 npm 仓库 | 公开 npm 仓库 |
| 包管理器行为 | 被忽略 | 被优先选择 |
防御措施:在构建阶段使用
.npmrc、pip.conf 等配置文件强制指定私有仓库作用域;在准入控制中增加对镜像 SBOM 的校验,检测是否存在非预期的公开依赖。
3.4 运行时恶意行为(Runtime Malicious Behavior)
即使镜像在部署时是安全的,攻击者仍可通过以下方式在容器运行时触发恶意行为:
- 文件篡改:挂载宿主机敏感目录(如
/etc、/var/run),修改系统配置或替换二进制文件。 - 网络滥用:建立反向 Shell、挖矿通信、数据外传或发起 DDoS 攻击。
- 进程逃逸:利用内核漏洞或错误配置(如 privileged 容器)突破容器隔离,控制宿主机。
- 凭证窃取:读取环境变量、挂载的 Secret 或 ServiceAccount ,横向移动至其他命名空间或集群。
3.5 威胁模型总结
镜像供应链威胁覆盖从代码提交到容器运行的全生命周期。准入控制器必须针对每个阶段设置对应的校验规则:
| 威胁类型 | 攻击阶段 | 准入控制校验点 |
|---|---|---|
| 软件供应链攻击 | 构建前 / 构建中 | 基础镜像签名、SBOM 校验、依赖来源白名单 |
| 镜像投毒 | 分发 / 拉取 | 镜像摘要校验、签名验证、仓库来源白名单 |
| 依赖混淆 | 构建中 | SBOM 依赖来源审计、私有仓库强制作用域 |
| 运行时恶意行为 | 部署 / 运行 | Pod 安全标准(PSS)、SecurityContext、Seccomp/AppArmor |
核心原则:镜像供应链安全不是单一工具或策略能解决的。需要将构建时验证(签名、SBOM)、部署时准入(摘要、策略)和运行时监控(异常检测)三层能力集成到 K8s 准入控制体系中。