@admin镇馆龙
点了 Claude Code 的“别再问我”,2,539 个密钥出现在了公开仓库里
11 月 5 日,安全公司 Apiiro 公布了一项研究;11 月 8 日它登上 Hacker News 首页,The Hacker News 跟进报道,Reddit 上出现了警示帖。结论很直接:一个每天都在点的按钮,把成千上万个密钥写进了公开仓库。
机制是这样的。Claude Code 弹权限框问你要不要跑一条 bash 命令,你点了“是的,而且以后别再问我”,它就把这条命令原文存进项目里的 .claude/settings.local.json,当作永久放行规则。命令里如果带了密钥——比如 export API_KEY=sk-... 或者带密码的数据库连接串——密钥就跟着一起存进去了。文件一旦被提交推送,密钥就是公开的。删文件也没用,git 历史里还在,fork 里也还在。
Apiiro 在 11 月 1 日到 3 日扫了 GitHub 上 104,185 份这个文件(分属 103,617 个仓库),其中 1,122 份含有真实密钥,占比约 1.1%,共 1,379 个不同的密钥值。再算上文件的历史版本、团队主动提交的共享配置和 agent 对话日志,总数是 2,539 个密钥、1,994 个仓库、63 家机构。构成里数据库密码 379 个、Supabase service-role 密钥 122 个、SSH 登录凭证 43 个、GitHub/GitLab/npm token 42 个、AWS key 23 个。其中有一个是某数据库厂商自己的云端管理员级密钥,一个是生产环境 Azure PostgreSQL 的密码,还有一个医疗记录数据库的 owner 密码。
更值得在意的是两点。第一,常规防线拦不住它:Claude Code 只在第一次写这个文件时把它加进你个人的全局 git 排除规则,不写进项目自己的 .gitignore,所以换台电脑克隆、或者文件夹后来才变成仓库,文件就照常进提交;通用扫描器也漏得多,1,122 个涉事文件里 Gitleaks 只检出 564 个,TruffleHog 检出 643 个,215 个两种都漏掉——因为密码是藏在命令文本里的,不符合密钥的固定格式。第二,这不是新 bug:从 2025 年 8 月起 GitHub 上就有 4 份相关报告,Apiiro 称均未收到 Anthropic 回复,最近一份在研究报告发布前一天被自动机器人关闭。截至发稿,Anthropic 没有公开回应这项研究。
我的判断是:这件事的责任不在某一次误点,而在默认值。Apiiro 对比了 16 个 coding agent 的文档,Claude Code 是唯一一个默认把完整批准命令写进项目文件的。也就是说,别的工具也可能让你犯这个错,但只有它把“犯错”做成了默认动作。
如果你在用 Claude Code,今晚就做三件事。第一,在所有仓库搜 .claude/settings.local.json 和 .claude/settings.json 有没有被提交过,命令是 git log --all -- .claude/settings.local.json;第二,里面出现过的密钥全部轮换一遍,只删文件不够;第三,在项目级 .gitignore 里补上这个文件名,别只依赖 Claude Code 写的全局排除规则。往后记住一条:含密钥的命令,永远别点“别再问我”,密钥走环境变量或密钥管理器,别敲进命令行。
这个结论不成立的情形:如果你从不用命令行传密钥、所有凭证都走环境变量,那这篇跟你没关系——但值得转发给团队里刚上手 vibe coding 的人,他们是最可能在命令里明文贴密钥的那批。
2026年11月9日 05:140 次浏览


