点一次「不再询问」,密钥就进了公开仓库:Claude Code 这 1122 个文件是怎么漏的

作者:许棠

安全公司 Apiiro 称,开发者对 Claude Code 点过「不再询问」后,含密钥的命令被原样写进项目里的 .claude 设置文件,并随提交推上公开 GitHub,共扫到 1122 个公开文件。Hacker News 上的争论集中在:点这个按钮本身不泄密,泄密要三个条件叠加。要做的只有两件事——查提交历史,立刻轮换密钥。

许棠

11 月 7 日,安全公司 Apiiro 发博客称:一些开发者在 Claude Code 里对带密码、token 的命令点了「Don't Ask Again」(不再询问),这条命令连同里面的密钥被原样写进项目目录下的 .claude/settings.local.json,文件随后被提交、推到公开 GitHub 仓库。他们扫到 1122 个公开文件里躺着密钥 。同日文章上了 Hacker News,32 条评论里大半在跟作者吵归因 。

这个按钮是怎么变成一个泄露开关的

「不再询问」本来只是「这条命令别每次都问我」。问题在于它记住的方式:命令全文,包括里面的明文密码和 API token,一起落成项目目录里的一个文件 。

而按文章作者在讨论区的说法,Claude Code 只把这个文件加进你机器上的全局 gitignore,不动仓库自己的 .gitignore 。等于说,保护落在「这台机器上的这个用户」,没落在「这个仓库」上。三种情况就漏了:换一台新机器或新容器、把项目目录整个复制过去、文件已经被提交过——ignore 规则对已跟踪的文件不管用 。

数字先打上引号

HN 上第一波质疑就冲着标题来:点「不再询问」本身不泄密,要三个条件叠加才算——设置文件被提交进仓库、命令里明文带密钥、仓库是公开的 。泄密动作是用户自己 push,不是 Claude Code 发出去的 。

作者 shmulc 回应:1122 个文件确实全在公开仓库;私有仓库里只有有权限的人能读,但密码还是被写进了项目文件,随每次 clone 和 fork 扩散,仓库哪天转公开就一起公开 。他同时给出 1105 个含真实密钥的仓库、539 个有 Claude 署名提交动过这些文件 。

「新 clone 会带上这个文件」这句被当场驳倒——新 clone 本来就没有未提交的文件。作者承认说错,改口成上面那三种情形 。另有用户 cassianoleal 说在沙箱里复现过:新沙箱读不到全局 gitignore,密钥进了 .claude 就被提交推送 。这条是单人陈述,没给细节,信几分自己判断 。

还有一层尴尬:作者多条回应被 HN 自动标成疑似 AI 生成,靠别人担保才恢复可见 。

你该做什么

  1. 先查。 在 GitHub 搜自己账号和组织名下的 .claude/settings.local.json 和 .claude/settings.json。命中就是任何能读这个仓库的人都能打开的文件 。
  2. 先轮换,再清理。 密钥进过提交历史,删文件不等于删记录,历史会被爬、会被 fork。先去作废重发,再考虑清历史 。
  3. 别再手滑。 命令行里出现 token、密码、.env、生产库连接串时,别点「不再询问」。确有私有文件要提交,用 git-crypt 这类工具先加密 。
  4. 团队层面。 把 .claude/ 写进仓库的 .gitignore,push 前扫一遍密钥。讨论区有句话说得到位:文件名写着 local 的东西就不该提交,能提交上去说明这些仓库没有像样的代码审查 。

账还没结清

Apiiro 原文是 JS 渲染的动态页,抓取只返回导航框架,上面这些数字我只能在讨论串里交叉核对:1122 有两处一致——文章标题和作者自述;1105、539、以及「署名覆盖 Sonnet 4.5 到 Opus 5.5」都只有评论区转引 。密钥类型构成、扫描的时间范围和仓库范围、Anthropic 有没有回应,目前全是空白。当提醒够用,当定案太早——顺带说一句,一个把密钥写进项目目录的默认行为,也不该等第三方安全公司来发现。

转载说明

本文根据以下公开资料整理,原文及配图出处见下方。

0
游速速·硬件体验官发布在 # Software and AI · softwareintegration 圈 · 1 小时前

评论

还没有评论,来抢沙发。

游速速 · 游戏 / 软件 / AI / 硬件一站式下载站
当前页面:帖子详情