安全公司 Apiiro 研究员 Shmulik Cohen 与 Matan Giladi 于 2026-11-05 发布研究:在 Claude Code 中选「Yes, and don't ask again」时,若提示给的是整条命令,会把命令原文(含其中的密码/Token)明文写入项目内的 .claude/settings.local.json。公开 GitHub 上 104,185 份该文件中有 1,122 份含至少一个密钥;连同 git 历史、共享 settings.json 与 Agent 对话记录,合计 2,539 个密钥、1,994 个仓库。Apiiro 未测试密钥是否有效,建议先轮换再清理。

核心要点速览

  • ✓触发条件:「不再询问」保存的是整条命令时,命令里的密码/Token 会原样写进 .claude/settings.local.json
  • ✓规模(Apiiro 口径):104,185 份公开文件中 1,122 份(约 1.1%)含密钥,共 1,379 个;全口径 2,539 个密钥 / 1,994 个仓库
  • ✓类型:超三分之一可直连数据库(含 379 个数据库密码),另有 43 个 SSH 登录、42 个 GitHub/GitLab/npm Token、23 个 AWS Key
  • ✓扫描器盲区:gitleaks 命中 564、TruffleHog 命中 643,215 份两者都没发现,主要是命令里的明文密码
  • ✓处置:先轮换所有曾出现的密钥,再 git rm --cached 并写入项目 .gitignore;批准时优先用 npm test * 这类模式规则
🧭

Claude Code 高频使用:比较订阅额度与 API 账单

40 款主流编程套餐横向比价,支持输入/输出 Token 真实账单模拟

🔬

深度技术解析与实战评估

核心背景与行业痛点

编码 Agent 跑 shell 命令前要人点批准,「不再询问」能省掉重复确认,但它把批准过的规则存进项目目录。Apiiro 发现,当提示给出的是整条命令(而非 npm test * 这类模式)时,命令里顺手敲的数据库密码、Token 也被原样保存;文件一旦被提交推送,密钥就公开了。

架构亮点与底层机制

规则写在 .claude/settings.local.json。按 Apiiro 引述的文档,Claude Code 首次在 git 仓库写该文件时,会把它加进当前用户的全局 git excludes,但不写项目自己的 .gitignore,所以换台电脑克隆或文件早已提交时保护失效。研究者称用 Opus 5.5 与 Fable 5.1 均复现了该行为;删除文件也抹不掉 git 历史与 fork 中的副本。

权威 Benchmark 与实测跑分对比

数据来自 11 月 1–3 日 GitHub 代码搜索(默认分支):104,185 份文件、1,122 份含密钥、1,379 个不同密钥;历史版本另有 734 个(509 个仓库),74 个仓库的 211 个 fork 带着同样密钥;共享 settings.json 76,011 份中 298 份含密钥。合计 2,539 个密钥、1,994 个仓库。gitleaks / TruffleHog 分别漏掉约一半,215 份两者都没扫到。Apiiro 未验证密钥是否可用,但已通知相关组织,其中一家确认密钥当时有效。

开发者实战落地与开箱指南

1)在组织内搜索 .claude/settings.local.json 与 .claude/settings.json,并查 git 历史;2)先轮换文件里出现过的所有密码、Token、Key;3)git rm --cached .claude/settings.local.json 并加入项目 .gitignore;4)打开本机文件删掉含密钥的规则;5)以后批准时选模式规则,别把密钥直接写进命令,改用环境变量或密钥管理器。

实战指南准备好将技术转化为生产力?

即刻查看该技术对应模型与主流工具的实测差异,或一键测算团队 API 调用与 $20/月套餐盈亏平衡点。

接着读Cursor 扩展市场出现被篡改的 Claude Code 2.1.313 扩展:植入 SSH 后门,最多 5,000 名用户受影响
立即阅读→