软件供应链安全(依赖库投毒、构建链攻击)的教训,行业用 SolarWinds、XZ Utils 这些案例学了很多年;而 AI 时代多了一个全新的供应链环节——模型本体:一个从 Hugging Face 这类模型市场下载的权重文件,直接被 torch.load() 加载进生产进程。这个环节的攻击面,正在被安全研究者以软件供应链的同款剧本逐一演示:反序列化代码执行、假冒模型、后门权重。本篇把模型供应链的攻击面、真实案例与防御清单讲清楚——这是每一个「pip install + from_pretrained」的团队都需要的安全课。

攻击面一:反序列化即代码执行(pickle 问题)
最经典也最现实的攻击面来自模型文件格式本身。PyTorch 的传统权重格式 .pt/.pth 基于 pickle——Python 的对象序列化协议,而 pickle 的安全特性人尽皆知:反序列化一个恶意构造的 pickle 文件 = 执行任意代码。权重文件在 pickle 流程里可以嵌入任意可执行 payload:你以为是加载模型参数,实际是运行攻击者的命令。这个风险不是理论——安全厂商多次在 Hugging Face 等平台上扫描出携带恶意 payload 的 pickle 文件(伪装成热门模型的权重、藏在组织账号下的投毒版本),平台方的应对包括自动扫描与安全告警机制。工程上的防御已经成熟且零成本:优先使用 safetensors 格式(Hugging Face 推出的安全序列化格式——只存张量数据、不执行代码,从格式层面消灭了 pickle 的代码执行面);必须加载 pickle 格式时,用 weights_only=True(PyTorch 提供的安全加载模式)与隔离环境(容器、无网络权限的加载进程);对来源不明的权重文件,先扫描后加载(平台提供的扫描工具与社区的 pickle 扫描器)。
攻击面二:假冒与「重新发布」
模型市场的开放性带来了第二个攻击面:身份与完整性问题。攻击模式有几种变体:热门模型的假冒版本——用相似名称发布携带后门的「微调版」(比如某个知名开源模型的「增强汉化版」,实际是投毒重打包);账号劫持与组织仿冒——接管或仿冒有声誉的组织账号发布恶意权重;「模型更新」的投毒——在良性模型发布数月后推送带毒的「新版本」。这类攻击的防御核心是把软件供应链的完整性思维平移过来:固定来源(信任的组织与作者、校验发布者的签名或身份)、锁定哈希(下载权重后校验已知的 SHA 哈希,而不是「从这个链接拿到的就是对的」)、审查模型卡与提交历史(突然的作者变更、无说明的重新上传都是红旗)。行业层面的机制也在生长:模型平台的签名与验证工具、企业级的模型来源审计(把「模型清单」纳入软件物料清单 SBOM 的 AI 扩展——AIBOM 的概念与实践正在成型)。
攻击面三:权重里的后门(backdoor)
前两类是「加载即中招」的供应链攻击;第三类更隐蔽——权重本身干净加载,但行为带毒:模型在训练(或被微调)时被植入后门触发器——正常输入下表现完全正常,输入中出现特定触发模式(特定短语、特定像素图案、特定水印)时输出被操控(输出恶意内容、泄露上下文、执行注入指令)。学术研究(后门攻击在语言模型上的系列论文,包括 Anthropic 的「Sleeper Agents」式构造)证明了这类后门的可行性:几十条恶意微调数据就可能植入持久的行为后门,且常规的评测与安全训练难以察觉(本库《欺骗性对齐》讨论过「装好」的行为机制,后门是它的供应链变体)。防御的难点在于后门检测是开放研究问题:行为触发扫描(用已知的触发模式库测试)、激活分析(观察特定输入下的内部激活异常)、以及最务实的来源纪律——微调权重时只用自己的数据或在可信基座上操作、对第三方微调权重保持「未经审计不上生产」的纪律。
防御清单:从个体到组织的分级
把防御压缩成可执行的清单,按资源分级。个人/小团队(零成本版):只用 safetensors 格式、weights_only=True 加载、只从可信任作者下载、平台的安全告警别无视。生产团队(标准版):上述全部,加上——模型的 SBOM 记录(哪个模型、什么哈希、从哪来、谁批准的)、隔离的加载环境(模型加载进程无网络权限)、上线前的行为评测(基线评测加触发器扫描)、以及依赖与模型的版本锁定。企业级(纵深版):内部模型仓库(生产模型一律走内部仓库,不直连外部市场)、模型来源的签名验证、第三方的安全扫描接入 CI、以及把「模型供应链」写入安全策略与审计范围(与依赖库、容器镜像同级管理)。一句话版本:把模型文件当作「可能携带任意代码的可执行物」来对待——它事实上就是。软件供应链安全的全部纪律(最小信任、来源验证、哈希锁定、SBOM、隔离加载)在模型供应链上原样适用,唯一的新功课是:这个供应链的货物,现在还会自己说话。
模型市场的治理:从货架到海关
模型市场(Hugging Face 等)的安全治理正在经历「从货架到海关」的升级——把这场升级讲清楚,能看到平台责任的成型过程。货架时代的默认:早期模型市场的定位是「开放货架」(人人上传、人人下载,平台不审查内容——像早年的应用商店之前的时代),安全机制只有社区举报与零星的扫描。海关化升级的三步:第一步:自动扫描的强制化——上传时的恶意代码扫描(pickle 的反序列化负载检测)、 secrets 泄漏检测(权重文件里嵌的 API key)、以及已知恶意模型的黑名单比对——扫描从可选变为上传的强制关卡。第二步:安全告警与下架的响应机制——安全研究者向平台报告恶意模型的通道、对已下载量的告警(「你下载的这个模型被确认恶意」的推送)、以及确认后的下架与标记。第三步:来源与签名的体系化——发布者的身份验证、模型的签名与完整性校验、以及(在讨论中的)「发布者声誉」体系(把软件包生态的 npm/PyPI 治理经验平移)。企业与平台的分工:平台的扫描是「广度防线」(覆盖所有上传者),企业的内部审计是「深度防线」(覆盖自己要用的模型)——两条防线互补而非互替;企业不能因为「平台会扫」就跳过自己的审计(平台的扫描针对已知模式,定制化的后门是它的盲区)。这条升级路径的更大意义:模型市场正在从「社区」变成「关键基础设施」——它的治理规格,决定了整个开源模型生态的安全水位。
safetensors 之外:格式安全的更深一层
safetensors 格式解决了 pickle 的代码执行问题,但格式安全的更深一层值得再讲:权重文件作为「数据」的隐写与投毒面。safetensors 只存张量数据(不执行代码),但张量数据本身可以被构造——本库《数据投毒》讲的后门可以藏在权重里(发布者自己训练的带后门模型,格式完全干净)。格式安全与行为安全因此是两道不同的闸门:格式闸门(防「加载即执行」——safetensors 已关闭)与行为闸门(防「使用即触发」——仍是开放问题)。两道闸门之间还有一个中间地带:元数据与附属文件——模型仓库里的 config、tokenizer、示例脚本同样是攻击面(config 里指向恶意远程资源的路径、示例脚本里的下载执行),「只检查权重文件」的审计会漏掉整个仓库的其余部分。工程上的完整清单因此是:格式白名单(safetensors only)、整个仓库的文件审查(不只权重)、加载环境的隔离(无网络)、加载后的行为基线评测(本库正文的触发器扫描)——四件套的任何一件缺失,都是供应链攻击的候选入口。这一篇的完整防御观可以压缩为:格式安全是及格线,行为安全是毕业考,仓库审查是平时作业。
模型供应链的「验证层级」:信任但分层验证
模型供应链安全的防御清单再往深推,需要一个「验证层级」的心智模型——不同信任级别的模型,走不同深度的验证。层级一:外部市场的探索性使用(个人研究、原型试验)——验证要求最低:safetensors 格式、平台告警确认、隔离环境加载(本篇正文的个人清单)。层级二:内部开发的使用(产品原型、内部工具)——增加:来源与哈希的登记(进 SBOM)、仓库全文件审查、加载后的行为基线评测。层级三:生产环境的部署——再增加:完整的供应链审计(训练数据的来源可查、微调数据的授权可证——本库《数据投毒》的关口前移)、触发器扫描与红队行为测试、签名验证、以及「内部仓库直连」的外部隔离(生产模型一律从内部仓库分发)。层级四:关键基础设施的部署(金融、医疗、能源场景)——最高档:第三方的独立安全评估、持续的运行时行为监测、供应商的合同责任与审计权、以及应急预案(模型被证实有问题时的回滚路径)。验证层级模型的两个价值:其一,它把「安全成本」与「风险暴露」对齐——探索性使用不需要生产级审计(成本有效率),关键部署不能省任何一道(风险对齐);其二,它给了「模型分级」一个清晰的操作语义——团队讨论「这个模型能不能用」时,先问「用在第几层」,验证要求自动明确——层级模型把安全讨论从「要不要防」推进到「防到哪一层」,这是所有安全清单落地为制度的方式。
小结
模型供应链安全收成四条:pickle 反序列化是「加载即代码执行」的现实攻击面——safetensors 与 weights_only=True 是零成本的防御起点;假冒与重新发布攻击的核心是身份与完整性——固定来源、锁定哈希、审查历史,软件供应链的完整性思维平移即用;权重后门是加载干净但行为带毒的隐蔽形态——行为触发扫描与「未经审计不上生产」的纪律是当前最务实的防御;分级清单——个人守格式纪律、生产建 SBOM 与隔离加载、企业走内部仓库与签名验证——把模型当「会说话的可执行物」对待。模型市场的繁荣不会倒退,供应链安全不会是它的对立面,而是它成熟的必经一站。
参考资料
- Hugging Face 官方安全文档(pickle 风险、safetensors 格式与扫描机制)
- 《Safetensors: 保存与加载大模型的安全格式》—— 格式设计的原始说明
- 本库前篇:《AI 生成代码的安全审查》《欺骗性对齐》《一篇读懂模型隐私攻击》
读者留言
COMMENTS 暂无还没有留言,来说第一句?