一个 AI 服务的攻击面,通常不只在推理接口,而在模型、数据集、依赖包、镜像和构建流水线。
只扫描容器镜像并不能证明模型安全:模型文件可能来自未验证的下载地址,数据集可能被投毒,生成式编码工具还可能把恶意依赖带进构建过程。
本文以 Kubernetes 上部署 AI 推理服务为例,说明如何用来源证明、软件物料清单和 Operator 准入策略,把“相信供应商”变成可以验证的工程流程。
一、真实场景:模型也是供应链制品
典型的 AI 服务交付链路如下:
数据集
↓
训练任务 / 微调任务
↓
模型权重与配置
↓
推理镜像
↓
镜像仓库
↓
Kubernetes 集群
↓
在线 API
每个环节都可能引入风险:
- 训练数据被加入后门样本,导致特定输入触发异常输出;
- 模型权重被替换,但文件名和版本标签保持不变;
- Python 或 Go 依赖包被投毒;
- 构建脚本下载未锁定版本的工具;
- AI 编程工具生成了未经审查的依赖、Shell 命令或 CI 配置;
- 推理镜像使用
latest标签,部署时无法确认实际运行的内容。
这里的重点是:AI 供应链安全保护的不是单一模型,而是从来源、构建到部署的完整证据链。
当团队出现以下需求时,就应该引入供应链控制:
- 多个团队从不同来源下载基础模型;
- 模型需要经过安全评测、偏见检测或后门扫描后才能上线;
- 生产集群要求所有制品可追溯、可回滚;
- 需要证明某个模型由哪次训练任务、使用哪些数据和依赖生成。
二、四个核心概念:不要把“扫描”当成“可信”
1. 软件物料清单:回答“里面有什么”
软件物料清单(Software Bill of Materials,SBOM)记录制品包含的组件、版本和依赖关系。常见格式包括 SPDX 和 CycloneDX,SPDX 2.3 是可验证的标准版本之一。
对于 AI 服务,SBOM 不应只描述容器中的操作系统包,还应覆盖:
- Python、Go、CUDA 相关依赖;
- 推理服务器及其插件;
- 模型文件的 SHA-256 摘要;
- tokenizer、配置文件和启动脚本;
- 数据集标识、处理代码和训练参数。
结论:SBOM 解决“内容可见性”,不直接解决“内容可信性”。
机制是构建阶段生成 SBOM,并把它作为 OCI 附件或构建产物保存。部署时通过摘要关联它,而不是依赖浮动标签。
例如,一个模型镜像不能只写:
image: registry.example.com/llm-server:v3
更可靠的引用方式是:
image: registry.example.com/llm-server@sha256:ab12...
例证是模型权重即使没有可执行权限,也可能影响推理结果;因此只扫描 ELF 文件和系统包,会漏掉模型本身的完整性问题。
2. 来源证明:回答“谁、用什么、如何构建”
来源证明(Provenance)描述制品的构建过程,包括源码、构建器、参数、输入材料和输出摘要。
SLSA(Supply-chain Levels for Software Artifacts)v1.0 定义了供应链完整性的一套通用模型。它不等同于“模型安全认证”,但可以证明某个制品是否由声明的流程构建。
结论:来源证明解决“制品从哪里来”,但不能证明训练数据没有毒。
机制通常是:
源代码提交
↓
不可变构建任务
↓
生成镜像 / 模型
↓
生成 Provenance
↓
签名并上传仓库
例证:如果生产环境发现模型输出异常,可以根据 Provenance 反查:
- 使用了哪个 Git 提交;
- 哪个构建任务生成;
- 使用了哪一个基础镜像;
- 模型权重和配置的摘要是什么;
- 构建过程中是否下载了额外文件。
3. 签名与验证:回答“部署的是否就是它”
Sigstore 提供了面向软件制品的签名生态,Cosign 可对 OCI 镜像及其关联制品进行签名和验证。其关键价值不是“加密很复杂”,而是让部署系统能够验证制品身份和完整性。
结论:签名必须靠近部署准入检查,否则只是仓库里的装饰性元数据。
机制包括:
- 构建系统为镜像和模型附件生成摘要;
- 使用工作负载身份或密钥完成签名;
- 签名记录进入透明日志;
- Kubernetes 准入组件校验签名、来源和策略;
- 不符合策略的工作负载直接拒绝。
例证:攻击者把 model:v3 指向新的恶意权重时,标签可能仍然正确,但摘要会改变;准入阶段校验签名,就能阻止未授权替换。
4. AI 安全评测:回答“它是否适合这个用途”
供应链安全不能只验证“文件没被改”,还需要验证模型行为是否满足用途。
评测范围可以包括:
- 后门触发测试;
- 越权指令和提示注入测试;
- 敏感信息记忆测试;
- 训练数据许可证检查;
- 输出拒答和安全边界测试;
- 模型与 tokenizer、配置是否匹配。
结论:完整性验证和行为安全验证是两个不同层次,不能互相替代。
例如,签名可以证明某个模型确实来自内部训练流水线,但如果训练数据本身被污染,签名不会自动发现问题。工程上应把评测报告也作为带摘要的制品,与模型绑定。
三、关键机制:用 Operator 把策略变成集群行为
仅靠文档约束开发者,通常会在紧急发布时失效。更稳定的做法是使用 Kubernetes Operator 管理 AI 制品的生命周期。
可以定义一个简化的自定义资源:
apiVersion: ai.example.com/v1alpha1
kind: VerifiedModel
metadata:
name: fraud-classifier
spec:
artifact: oci://registry.example.com/models/fraud-classifier
digest: sha256:ab12...
signer: workload-identity://ml-build/prod
provenance:
builder: https://ci.example.com/builders/ai
slsaLevel: 3
evaluation:
report: oci://registry.example.com/reports/fraud-classifier
maxRiskScore: 0.20
Operator 的控制逻辑可以拆成四层:
- 解析层:读取模型摘要、镜像摘要和评测报告;
- 验证层:验证 Cosign 签名、签名身份和 Provenance;
- 策略层:检查评测分数、允许的构建器和来源仓库;
- 执行层:生成 Deployment、Service 和 NetworkPolicy。
Go 1.24 中实现控制器时,重点不是写更多业务逻辑,而是保持验证过程幂等。下面是一个简化的策略检查函数:
package policy
import (
"errors"
"fmt"
)
type Artifact struct {
Digest string
Signer string
Builder string
SLSALevel int
RiskScore float64
}
type Rule struct {
AllowedSigner string
AllowedBuilder string
MinSLSALevel int
MaxRiskScore float64
}
func Validate(a Artifact, r Rule) error {
// 禁止使用 tag 作为身份;生产策略必须要求不可变摘要。
if len(a.Digest) < len("sha256:") || a.Digest[:len("sha256:")] != "sha256:" {
return errors.New("artifact must use sha256 digest")
}
if a.Signer != r.AllowedSigner {
return fmt.Errorf("unexpected signer: %s", a.Signer)
}
if a.Builder != r.AllowedBuilder {
return fmt.Errorf("unexpected builder: %s", a.Builder)
}
if a.SLSALevel < r.MinSLSALevel {
return fmt.Errorf("insufficient provenance level: %d", a.SLSALevel)
}
if a.RiskScore > r.MaxRiskScore {
return fmt.Errorf("evaluation risk score %.2f exceeds limit", a.RiskScore)
}
return nil
}
实际系统中,Validate 前面还应调用签名验证工具,并校验签名声明中的摘要是否与部署对象一致。Operator 负责持续对账:如果已部署模型的签名、来源或评测报告失效,应更新状态并阻止后续滚动发布,而不是静默修复。
四、工程选型:控制点应放在哪里
| 控制方式 | 主要解决的问题 | 优点 | 不适用条件 |
|---|---|---|---|
| 镜像扫描 | OS 包、依赖漏洞 | 接入简单,适合基础门禁 | 无法证明模型来源和行为 |
| SBOM | 制品内容可见 | 便于审计和漏洞追踪 | 不包含完整的可信来源结论 |
| Sigstore/Cosign | 摘要完整性和签名身份 | 可接入 OCI 与准入流程 | 密钥或身份管理薄弱时价值下降 |
| SLSA Provenance | 构建过程可追溯 | 便于定位构建和发布问题 | 不能替代数据质量与模型评测 |
| Kubernetes Operator | 持续执行领域策略 | 适合多团队、多模型平台 | 单一服务或临时实验可能过重 |
| AI 行为评测 | 后门、越权、输出风险 | 覆盖模型特有风险 | 评测集不足时容易产生假阴性 |
明确的落地结论是:
- 单团队、模型数量少:先做摘要固定、签名验证和基础 SBOM;
- 多团队共享模型平台:增加 Provenance、评测报告和 Operator;
- 高风险业务:把数据集版本、训练任务和行为评测纳入发布审批;
- 研究实验环境:可以放宽准入,但必须标记为非生产制品,不能混入生产仓库。
五、常见坑:签名正确,模型仍可能不安全
一个真实可行的错误流程是:
- CI 对镜像签名;
- 镜像中通过启动脚本下载模型;
- 模型下载地址使用固定域名而非摘要;
- 部署准入只验证镜像签名;
- 攻击者替换远程模型文件。
此时镜像本身没有改变,签名也有效,但运行时加载的模型已经不是构建时验证过的模型。
规避方式是:
- 模型作为镜像层或 OCI artifact 管理;
- 对模型文件固定 SHA-256 摘要;
- 禁止启动脚本从任意公网地址下载制品;
- Operator 验证镜像、模型和评测报告三者摘要;
- 运行时使用只读文件系统,并限制出站网络;
- 对模型仓库启用审计日志和不可变版本。
另一个 AI 特有的坑是过度依赖 AI 工具生成安全策略。AI 可以快速生成 Kubernetes YAML、OPA 规则或依赖升级建议,但它并不了解组织中的签名身份、信任边界和例外流程。AI 适合辅助发现和生成,不应成为最终的信任根。
六、学习与落地路径
建议按以下顺序建立能力:
第一阶段:理解制品与部署边界
先掌握 OCI 镜像摘要、Kubernetes Deployment、Admission Webhook、RBAC 和 NetworkPolicy。动手把一个模型镜像从 tag 改为 digest,并记录模型权重摘要。
第二阶段:建立可追溯链路
学习 SPDX 2.3、SLSA v1.0、Sigstore 和 Cosign。为构建流程生成 SBOM 与 Provenance,并在测试集群中验证签名。
第三阶段:编写领域策略
使用 Go 1.24 编写 Operator,定义模型来源、签名身份、评测报告和风险阈值。先实现“拒绝未签名制品”,再增加构建器、数据集和模型版本约束。
第四阶段:引入 AI 安全评测
建立与业务相关的测试集,而不是只运行通用基准。重点覆盖后门触发、提示注入、敏感数据泄露和工具调用越权,并把评测结果作为可验证制品保存。
第五阶段:用 AI 加速而不是替代判断
AI 工具可以帮助分析 SBOM、归并漏洞、生成策略草稿、解释 Provenance 和编写测试用例。但生产发布仍应由确定性的验证器、准入策略和人工审批共同完成。
AI 供应链安全的核心不是增加一个扫描器,而是建立“制品可见、来源可证、行为可评、部署可拒”的闭环。模型、数据集和推理镜像都应被当作可验证制品管理。
当团队开始部署多个模型或允许 AI 工具参与研发时,Operator 准入和来源证明会比单纯的镜像漏洞扫描更有价值。
你所在的团队会优先把模型评测报告纳入发布门禁,还是先从签名与 SBOM 开始?