FEATURED · 精选文章

从Hugging Face安全事件看ML供应链的秘密管理与应急响应

发布时间 / 2026/9/2 15:42:13
来源 / 创域科博编辑部
栏目 / 资讯中心
从Hugging Face安全事件看ML供应链的秘密管理与应急响应 2023 年 12 月Hugging Face 发布安全公告确认一个未授权方获得了其 Spaces 托管平台的访问权限并可能接触到存储在 Spaces 中的机密信息。这是机器学习基础设施领域少见的、由头部模型仓库平台主动披露的安全事件。对使用 Hugging Face 管理模型、数据集和推理应用的团队来说这次事件不只是“改一次密码”的提醒而是一堂涉及秘密管理、供应链信任、威胁建模和事件响应的完整安全工程课。这篇文章从安全工程视角拆解这次事件先回顾公开披露的事实再分析问题出在哪个环节然后讲清楚团队如何自查是否受影响、如何完成密钥轮换和最小权限整改最后落到机器学习场景里可以长期执行的供应链安全基线。文章会给出可执行的命令、检查清单和参数说明适合负责模型平台、算法工程、DevOps 和安全的开发者阅读。1. 事件回顾Hugging Face 安全公告到底披露了什么1.1 时间线和公开事实Hugging Face 在 2023 年 12 月通过官方渠道披露了这起安全事件。表述比较克制但核心信息是明确的某个未授权方取得了 Spaces 平台的访问权限并且可能访问到了存储在 Spaces 中的机密信息官方因此建议用户立即轮换访问令牌、密钥和 SSH 密钥并审视自己的账号活动记录。从安全工程的角度看有几个公开信息值得先固定下来公开信息说明受影响组件Spaces 托管平台涉及其中的机密信息和密钥官方建议动作轮换访问令牌、密钥、SSH 密钥检查账号活动事件性质未授权访问可能涉及秘密数据泄露对用户的直接要求尽快轮换凭据无法逐一排除受影响账号这里要特别注意一个容易误读的地方公告强调的是“可能存在未授权访问”而不是“已经确认所有模型和数据集被篡改”。但在安全事件处置中这种表述恰恰意味着不能只做形式检查而要按照“可能已经被访问”的最坏情况来处置凭据。1.2 为什么这个事件值得从安全工程角度复盘很多团队在第一次看到公告时的反应是“我没有在 Spaces 上部署东西和我没关系”。这个判断过于乐观。原因有三点。第一Hugging Face 的账号体系是统一的。用户可能没有直接创建过 Space但可能使用主账号登录过 CLI、申请过下载 token、在 CI 里配过读写令牌这些凭据和 Spaces 平台处于同一个信任域。第二模型和数据集下载本身也依赖账号认证私人仓库和 gated 数据集会要求 token泄露的 token 一旦被滥用可能触达这些受控资源。第三事件暴露的不只是某个具体业务而是整个平台在秘密处理上的薄弱环节这种薄弱环节同样可能存在于我们自己搭建的机器学习平台中。把这次事件当作“别人家的故障”没有价值。把它当作一次安全工程演练的输入才有实际意义。1.3 受影响面Spaces、托管模型、token 和 CI/CD要评估影响面需要先理解 Hugging Face 生态里哪些组件会涉及机密信息访问令牌分为读令牌和写令牌写令牌可以推送模型、仓库或触发 Space 构建。Spaces 应用环境变量在 Spaces 上部署推理应用时用户会把 API Key、数据库连接串写在环境变量或高级配置里。SSH 密钥通过 Git over SSH 方式访问仓库时会配置 SSH 公钥。CI/CD 凭据很多团队在 GitHub Actions、Jenkins 或自建流水线里保存HF_TOKEN用来推送模型或发布 Space。本地 huggingface 缓存~/.cache/huggingface/目录下可能保存登录凭据和下载缓存。这些资产分散在不同位置但对攻击者来说任何一个有效的写令牌都可能是进入模型仓库或云资源的跳板。所以安全工程视角的第一个动作不是“修改密码”而是“先摸清自己到底有多少和 Hugging Face 相关的秘密资产”。2. 从安全工程视角拆解事件问题出在哪个环节2.1 威胁模型ML 平台上的资产和攻击者传统 Web 系统的威胁模型通常围绕“用户账密、API 接口、数据库、云资源”展开。机器学习平台把威胁面扩大了因为平台上流动的不只是数据还有模型权重、推理代码和连接外部系统的密钥。对 Hugging Face 这类平台来说主要资产包括模型权重文件可被篡改或植入后门。数据集文件可能包含敏感信息或投毒样本。推理应用代码在 Spaces 上运行可能读取环境变量中的密钥。用户凭据访问令牌、SSH 密钥、OAuth 信息。构建和发布链路控制更新模型内容的 CI/CD 权限。攻击者的目标通常是凭据和供应链入口。拿到一个写令牌就可以往仓库里推送一个看起来正常的模型版本诱使下游用户下载拿到 Spaces 的应用密钥就可以进一步访问用户的外部数据库或云服务。事件发生后 Hugging Face 建议轮换全部密钥原因就在于此无法确认攻击者的访问深度就必须假设所有可能接触过的凭据都不再可信。2.2 Secrets 管理失败为什么会建议轮换所有 token这次事件暴露的核心问题不是“有攻击者”而是“有攻击者时系统无法快速隔离损失”。理想状态下如果平台能够做到每个服务使用独立的短生命周期凭据秘密集中存储并有访问审计泄露后可以按资源粒度撤销权限那么事件处置成本会低很多。但现实是大量用户习惯使用一个长期有效的 token 同时访问 Hub、Spaces 和模型仓库这类 token 一旦泄露攻击者就有足够的权限和时间横向移动。从秘密管理的角度可以总结出三条原则凭据必须能够单独吊销不能所有服务共用一个 token。凭据必须有生命周期不能一次创建永久有效。凭据必须可审计要知道它在哪个环境、哪个时间被使用过。2.3 供应链风险模型、数据集和应用之间没有传统信任边界传统软件供应链的信任边界相对清晰你依赖一个 npm 包或 pip 包代码经过仓库、打包、镜像扫描等环节。机器学习供应链目前还处于早期阶段大量团队直接从 Hugging Face 拉取模型权重然后直接加载到训练或推理流程中。问题在于模型文件不是普通代码pytorch_model.bin这类权重文件无法像源码那样被常规静态扫描。更复杂的是某些模型格式例如 pickle 序列化的 PyTorch 文件在torch.load时可能执行任意代码。即使是普通权重文件被人为篡改后也可能产生隐蔽的输出偏移。这意味着模型仓库的账号一旦被入侵供应链下毒的风险很高。因此安全工程视角必须把“模型和数据集镜像可信来源”纳入信任边界而不是默认“从官方平台下载就一定安全”。3. 如何确认自己是否受影响3.1 检查你在 Hugging Face 上注册过的凭据自查的第一步是盘点本机凭据。以 Linux 和 macOS 为例先看 huggingface 缓存目录ls -la ~/.cache/huggingface/如果目录下存在token文件说明至少通过huggingface-cli login或huggingface_hub登录过。不要直接打印 token 内容确认文件存在后记录修改时间即可stat ~/.cache/huggingface/token再检查环境变量和 shell 配置# 检查常用环境变量中是否暴露 HF_TOKEN env | grep -i hf_\|huggingface || true # 检查 shell 配置 grep -rn HF_TOKEN ~/.bashrc ~/.bash_profile ~/.zshrc 2/dev/null || true3.2 审计 token 权限和访问日志登录 Hugging Face 官网后进入个人设置中的 Access Tokens 页面。这一步要关注的不是“有哪几个 token”而是逐项确认每个 token 的名称是什么对应哪个环境或服务每个 token 的权限范围是 read 还是 write是否还有从不认识的 token 残留token 是否存在超过一年没轮换的情况。建议用表格记录本团队的 token 清单Token 名称权限范围使用环境创建时间是否还需使用处置动作ci-pushwriteGitHub Actions2023-06是已轮换local-readread本地训练2023-01是已轮换old-testwrite测试环境2022-11否已删除如果团队规模较大可以让每个成员都执行一遍同样的盘点汇总后统一处置。3.3 检查本地缓存、环境变量和 CI 配置中的密钥本地之外的凭据往往被忽略。重点检查三类位置第一是 CI/CD 平台。GitHub Actions 的 secrets、GitLab CI 的 variables、Jenkins 的 credentials 里是否保存着HF_TOKEN。如果保存的是长期 token风险面很大。# GitHub Actions 中不良示例 env: HF_TOKEN: ${{ secrets.HF_TOKEN }}第二是代码仓库历史。很多团队曾经把 token 直接写进脚本再提交即使后来删除了token 仍然会存在于 Git 历史中。可以用以下方式扫描当前工作区# 扫描当前代码中的 hf_ 前缀 token grep -rn hf_ --include*.py --include*.sh --include*.env --include*.json --include*.yaml .注意这条命令只是快速扫描结果会包含大量正常调用需要人工确认。第三是云环境的托管配置。如果通过 SageMaker、Vertex AI 或内部 K8s 运行训练任务检查 Secret、ConfigMap 和训练任务定义里是否有 Hugging Face 凭据。注意这类自查最大的价值不是“发现一个删一个”而是把“凭据分散在哪些地方”这个问题彻底梳理清楚。梳理不清轮换也无从谈起。4. 事件后的整改操作轮换、最小权限和密钥管理4.1 立即轮换所有与 Hugging Face 关联的凭据事件公告发布之初核心处置动作就是轮换。轮换不能只改某一个 token范围应当包括所有 Access Token无论 read 还是 writeSSH 密钥绑定到 Spaces 应用的环境变量和外部服务密钥CI/CD 中保存的HF_TOKEN。操作流程是先撤销旧 token再创建新 token。撤销后使用旧 token 的所有认证请求会立即失败这是验证撤销是否生效的最直接方法# 使用旧 token 请求 API应返回 401 curl -s -o /dev/null -w %{http_code} https://huggingface.co/api/whoami-v2 \ -H Authorization: Bearer 旧token新 token 创建后在本地重新登录。新版huggingface_hub推荐使用hf auth login旧版本用huggingface-cli login# 新版 CLI hf auth login --token hf_新token # 旧版 CLI huggingface-cli login --token hf_新token登录完成后验证身份python -c from huggingface_hub import whoami; print(whoami(tokenhf_新token))如果输出中包含用户名信息说明新 token 有效。4.2 用短期 token 和细粒度权限替代长期 token轮换只是第一步真正降低下次事件损失的是权限模型。Hugging Face 的 Access Token 支持权限范围选择。实践中推荐按环境拆分环境权限要求建议本地下载公开模型read使用 read token域名锁定到指定仓库CI 推送模型write使用该仓库专用的 write token生产推理read使用独立 token并在程序启动时注入日常开发不固定临时创建用完删除如果平台支持细粒度 token优先把 token 约束到指定仓库或指定 Space避免一个 token 拥有整个账号的写入权限。同时要定期检查 token 列表删除超过 90 天未使用的 token。4.3 把密钥移出代码、环境变量和配置文件环境变量比硬编码好但环境变量并不等于安全。很多团队的HF_TOKEN直接写在.env文件或 Docker Compose 里这类文件一旦提交到 Git 或进入镜像层就变成静态秘密。推荐做法是使用专业的秘密管理工具云环境使用云厂商的 Secrets Manager、Parameter Store 或 KMSKubernetes 环境使用 External Secrets Operator 把云上的秘密同步为 K8s Secret自建系统可以使用 Vault按需签发短期 token。在机器学习代码里理想方式是启动时从秘密管理服务读取 token并放入内存import os from huggingface_hub import login token os.environ.get(HF_TOKEN) if token: login(tokentoken)这个示例仍然依赖环境变量注入但真正的秘密来源是秘密管理服务而不是硬编码文件。生产环境还需要补上日志脱敏避免login(token...)这类调用把 token 打到 stdout 或日志系统里。5. ML 供应链安全模型和数据集下载时需要建立的检查点5.1 模型文件不是普通代码无法靠沙箱完全兜底在 Hugging Face 下载模型时大多数人直接执行AutoModel.from_pretrained(某模型)。这个调用背后会经历下载权重、加载配置、初始化模型等过程。如果模型文件是易受攻击的序列化格式加载过程就可能执行恶意代码。PyTorch 的torch.load历史上就出现过 pickle 反序列化漏洞。现代版本默认weights_onlyTrue可以缓解一部分问题但老代码、第三方加载逻辑和自定义 dataset 仍然存在风险。不要把“官方平台下载”当作安全保证要认为“任何模型文件都可能是恶意输入”。5.2 下载前检查仓库元数据、作者和签名在训练和推理脚本中加入下载前的检查点检查仓库名称是否精确避免通过模糊搜索下载仿冒仓库检查仓库作者和关联组织检查仓库的 commit hash固定版本而不是跟随 latest如果平台提供数字签名或哈希文件下载后先做完整性校验。from huggingface_hub import snapshot_download # 指定 revision不要使用默认分支 local_dir snapshot_download( repo_idowner/model-name, revisionv1.0.0, tokenos.environ.get(HF_TOKEN), )这里的关键是revision必须指定。不指定 revision 意味着每次拉取可能拿到最新内容而最新内容是谁推送的、是否经过审查无法保证。5.3 使用镜像或内部缓存时如何做完整性校验很多团队为了提高下载速度会使用镜像站点或内部模型缓存。镜像本身是合法且常见的工程手段但安全视角下必须回答三个问题镜像内容是否与官方仓库一致传输链路是否可信镜像是否引入了额外的中间人风险。完整性校验是解决第一个问题的关键。下载完成后计算文件哈希与官方仓库记录或发布方提供的 SHA256 对照# 计算已下载模型权重文件的哈希 sha256sum pytorch_model.bin # 假设官方发布信息中记录了文件哈希 echo 官方sha256 pytorch_model.bin | sha256sum -c -如果校验失败说明文件被修改或传输损坏不能继续使用。对内部缓存也要定期归档记录明确哪个镜像源、哪一次同步、由谁更新。6. 事件响应演练把这次事故变成可复用的排查清单6.1 检测阶段怎么发现异常如果团队已经使用了 Hugging Face事件响应要从“有没有可能被波及”开始。检测阶段建议执行从 Hugging Face 设置页面导出当前登录设备、token、活跃会话列表检查 GitHub 等平台的 Secrets 变更记录确认是否有人改动过包含HF_TOKEN的配置查看 Spaces 应用的运行日志检查是否有异常时间段的请求检查云账单看是否存在与 Hugging Face 服务相关的异常外部请求。这一阶段最重要的是时间线。把公告发布时间、token 创建时间、最后一次成功登录时间放在一张表里判断各凭据是否在暴露窗口内被使用过。6.2 遏制阶段怎么快速止血一旦确认某个 token 可能泄露不要先讨论“要不要删”先执行三个动作立即在 Hugging Face 设置中删除该 token找到所有引用该 token 的环境变量、CI 配置、本地缓存替换为新的临时唯一值如果 Spaces 应用中配置了外部云服务的 API Key同步轮换这些外部密钥。注意轮换顺序。先撤销旧凭据再创建新凭据否则新凭据可能被旧环境里的逻辑同步使用造成混乱。每个凭据轮换后用 API 调用验证一次记录验证结果。6.3 恢复和复盘阶段怎么避免重复发生恢复不只是“系统能跑了”而是“回到正常工作流并确认凭据已收敛”。恢复阶段的检查项包括新 token 是否只暴露在必要的环境中旧的.env文件和缓存是否被清理是否有成员仍然使用旧 token 在本地脚本里硬编码下载日志里是否残留了旧 token 的明文。复盘阶段要产出一份内部文档至少包含三个部分部分内容事件经过公告时间、团队发现时间、处置时间影响范围哪些 token、哪些环境、哪些仓库被波及改进措施权限拆分、轮换周期、检测手段、培训要求6.4 事件响应速查清单这份清单可以直接用于团队内部演练盘点 Hugging Face 账号下所有 token、SSH 密钥、Spaces 应用变量。以“所有凭据都可能泄露”为前提执行轮换。删除不再使用的 token撤销后验证返回 401 或 403。扫描 Git 历史、CI 配置、云 Secret、本地缓存中的hf_前缀凭据。更新内部文档标注轮换周期和责任人。对涉及模型下载的任务固定 revision 并记录文件哈希。7. 给机器学习团队的安全基线建议7.1 生产环境基线清单以下清单适用于所有要接入 Hugging Face 的团队项目基线要求凭据唯一性每个环境、每个任务使用独立 token凭据权限遵循最小权限能 read 就不给 write凭据生命周期90 天内轮换一次过期自动删除密钥存储使用 Secrets Manager 或 Vault禁止硬编码模型版本固定下载时指定 revision记录 commit hash完整性校验关键模型下载后计算 SHA256 并归档日志安全禁止打印 token、API Key 等敏感信息访问审计定期检查登录会话、token 列表和 CI secrets内部镜像使用镜像时先验证哈希记录镜像来源应急预案有 token 泄露后的轮换预案和责任人学习环境可以简化但至少也要做到“不用长期 token 推送生产仓库”和“不把 token 写进公共代码”。7.2 不要把 Hugging Face 当最终信任边界这次事件带来最核心的判断是Hugging Face、GitHub、内部制品库、云存储任意一个平台都可能成为供应链攻击的入口。信任不能建立在“它是个大平台不会出事”之上而应该建立在“即使平台被入侵我们的损失也是可控的”之上。实现这个目标需要三层结构第一层外部平台只负责存储和分发不承担安全边界职责。第二层内部下载服务做校验和审计记录谁在什么时候下载了什么模型。第三层训练和推理环境对模型加载做最小化禁止不必要的动态执行。7.3 下一步可以建立的工程能力事件之后团队应该把精力投入到三件事上一是建设模型工件的元数据管理。每次下载、复制、部署模型时自动记录来源、版本、哈希和责任人。二是建设凭据自动轮换机制。用脚本或平台能力定期轮换云服务密钥减少人工操作带来的遗漏。三是做一次供应链安全演练。故意模拟一个“模型仓库被入侵token 泄露”的场景训练团队在 30 分钟内完成检测、遏制和恢复流程。对刚开始学习安全工程的同学建议从这次事件中提取一个最小练习创建一个专用的 read token用它下载一个公开模型记录下载前后的检查步骤然后删除 token。把这个流程跑熟你就理解了凭据生命周期管理在真实机器学习项目中的基本形态。这次 Hugging Face 事件并不特殊它只是所有依赖第三方基础设施的团队终将面对的一种场景。真正重要的不是责怪某个平台没有做到完美而是通过一次公开事件把自己的账号体系、凭据策略和供应链检查点重新梳理一遍。能做到这一点这次事件对你团队的价值就远大于“赶紧改密码”。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻