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)作为准入控制的唯一标识。
镜像投毒攻击流程 攻击者 恶意镜像 镜像仓库 准入控制器 K8s 集群 投毒方式 • 标签劫持 / 名字相似 • 层注入 / 元数据伪造 • 利用缓存失效策略

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 ,横向移动至其他命名空间或集群。
运行时恶意行为分类 运行时恶意行为 文件篡改 挂载 /etc、/var/run 网络滥用 挖矿、数据外传 进程逃逸 内核漏洞、privileged 凭证窃取 Secret、SA 准入控制应对策略 禁止 privileged 容器 · 只读根文件系统 · 限制网络策略 · 强制 Secret 挂载 禁止 hostPath 敏感目录 · 限制 capabilities

3.5 威胁模型总结

镜像供应链威胁覆盖从代码提交到容器运行的全生命周期。准入控制器必须针对每个阶段设置对应的校验规则:

威胁类型 攻击阶段 准入控制校验点
软件供应链攻击 构建前 / 构建中 基础镜像签名、SBOM 校验、依赖来源白名单
镜像投毒 分发 / 拉取 镜像摘要校验、签名验证、仓库来源白名单
依赖混淆 构建中 SBOM 依赖来源审计、私有仓库强制作用域
运行时恶意行为 部署 / 运行 Pod 安全标准(PSS)、SecurityContext、Seccomp/AppArmor
核心原则:镜像供应链安全不是单一工具或策略能解决的。需要将构建时验证(签名、SBOM)、部署时准入(摘要、策略)和运行时监控(异常检测)三层能力集成到 K8s 准入控制体系中。