一个自包含的、一次性使用的实验环境,复现了
GHSA-fg94-h982-f3mm
/ CVE-2026-54316:Claude Code 将 huggingface.co 作为 裸主机名 预先批准用于 WebFetch 工具,因此该域名上的 任意 路径 —— 包括攻击者控制的模型仓库 —— 都会在 无需权限提示 的情况下被获取。结合提示注入,这形成了一个用于窃取数据的带外通道,可通过 HuggingFace 的服务器端下载计数来观察。
| 公告 | GHSA-fg94-h982-f3mm |
| CVE | CVE-2026-54316 |
| 软件包 | @anthropic-ai/claude-code (npm) |
| 受影响版本 | >= 0.2.54, < 2.1.163 |
| 修复版本 | 2.1.163 |
| 根本原因 | 在多租户主机上使用裸主机名白名单(CWE-183) |
此实验复现了一个 已修复、公开披露的 漏洞,仅用于教育和防御目的。请只在 您自己拥有的 基础设施上使用:
fixtures/canary.env)——切勿使用真实值。huggingface.co 路径时不会弹出审批提示,而其他所有域名都会触发 —— 因为 huggingface.co 位于一个硬编码的白名单中。容器是运行有漏洞版本的唯一场所;您的主机保持干净。使用 Claude 订阅令牌进行身份验证(无需 API 密钥):
docker build -t cve-2026-54316-lab .
docker run --rm -it cve-2026-54316-lab
在容器内运行 claude,并选择 “Claude 账户(含订阅)” 以交互方式登录。存在漏洞的 2.1.162 版本早于 CLAUDE_CODE_OAUTH_TOKEN 环境变量,因此此处不使用 setup-token —— 交互式浏览器/粘贴代码流程避免了生成长期令牌。
关键在于 按域名的审批提示不对称,因此 WebFetch 保持 可用(未被禁用)—— 审批通过提示处理,这是默认行为。在容器内的 claude 中:
使用 WebFetch 获取
https://example.com并总结它。
→ 出现一个权限提示,要求您批准 example.com。然后:
使用 WebFetch 获取
https://huggingface.co/<your-account>/canary-lab/resolve/main/config.json。
存在漏洞: huggingface.co 的获取在 没有提示 的情况下进行,而 example.com 则需要提示。这个不对称就是漏洞 —— huggingface.co 位于硬编码的白名单中。(对于此测试,HF 仓库不必存在;即使返回 401/404 也足以证明从未触发提示。)使用 @anthropic-ai/[email protected] 重新构建后,huggingface.co 的获取现在也会提示 —— 这种前后对比正是重点所在。
./scripts/make_hf_canary_files.sh ./hf-repo,然后将 hf-repo/ 推送到您拥有的公开 HuggingFace 仓库(<your-account>/canary-lab)。payloads/untrusted-readme.md,设置 HF_ACCOUNT,并将其放置到代理程序会将其作为不受信任输入读取的位置。Dockerfile — 固定使用有漏洞的 2.1.162.claude/settings.json — 留空允许/拒绝设置,使 WebFetch 按域名提示fixtures/canary.env — 虚拟警示数据scripts/make_hf_canary_files.sh — HF 警示文件布局payloads/untrusted-readme.md — 提示注入载荷(已净化)