跳到正文
sobolewski.pro今日 AI,每晚送达订阅

每天一封,一键即可退订。 隐私政策

Claude Code 密钥泄露:“Yes, and don’t ask again”惹的祸

Claude Code 密钥泄露:“Yes, and don’t ask again”让 GitHub 上 1122 个公开文件留下密钥。看看你是否受影响。

1 分钟阅读

本文的其他语言版本:العربيةDeutschEnglishEspañolFrançaisItaliano日本語Polski

本文内容
  1. Claude Code 密钥泄露是怎么发生的?
  2. 既然文件在本地,怎么会跑到 GitHub 上?
  3. 规模有多大?
  4. 为什么这件事这么受关注?
  5. 今后要注意什么?
  6. 常见问题

11 月 5 日,Apiiro 的研究人员 Shmulik Cohen 和 Matan Giladi 发布了一份报告,披露了 Claude Code 密钥泄露到 GitHub 的问题。他们在 .claude/settings.local.json 文件的 104,185 个公开副本中,发现 1122 个文件至少含有一个密钥,合计 1379 个不同的密码、API 密钥和令牌。

Claude Code 密钥泄露是怎么发生的?

当 Claude Code 请求在终端运行某条命令时,我们可以选择“Yes, and don’t ask again”。根据 Claude Code 文档,这个授权会作为一条 allow 规则写入项目中的 .claude/settings.local.json 文件。

问题在于,这条规则会保存整条被批准的命令,包括我们在命令里输入的所有内容。如果命令里带了密码,比如 PGPASSWORD=… psql …,或者在请求头里带 API 密钥的 curl,这个密码就会以明文形式留在文件里。

有意思的是,这并不是新发现。2025 年 8 月,就有人在 issue #5544 中报告了一模一样的问题(还附了 API 密钥和 Jira 令牌的例子)。2026 年 1 月 3 日,这个 issue 因 60 天无活动被机器人以“not planned”关闭,没有任何修复。

既然文件在本地,怎么会跑到 GitHub 上?

按设计,这个文件是私有的。Claude Code 第一次写入它时,会把 **/.claude/settings.local.json 加进 git 的全局排除文件,避免它进入提交(文档就是这么描述的)。

但这层保护有几个漏洞:

  1. 全局排除只在一台电脑上生效,不会跟着仓库走。
  2. 如果文件是我们手动创建的,Claude Code 不会排除它,需要我们自己把它加进 .gitignore。
  3. 忽略规则对 git 已经跟踪的文件无效,所以一旦提交过,这个文件就会继续进入之后的提交。
  4. 从仓库里删除文件,并不会把它从历史记录和 fork 中移除。

据 iTWire 报道,在追踪的 1105 个仓库中,有 539 个仓库里修改这个文件的提交是由 Claude 共同署名的。

规模有多大?

报告中的数字(11 月 1 日至 3 日从公开 GitHub 收集的数据):

  1. settings.local.json 共有 104,185 个公开副本,其中 1122 个(约 1.1%)至少含有一个密钥。
  2. 这些文件中有 1379 个不同的值。
  3. 加上 git 历史、共享的 .claude/settings.json 文件以及保存的智能体对话,总计 1994 个仓库中有 2539 个密钥。
  4. Apiiro 在 11 月 2 日和 3 日通知了相关公司,其中一家确认泄露的密钥当时仍然有效。

需要说明一点:Apiiro 并没有验证找到的凭据能否使用。它是用误报过滤器和语言模型评估来筛选候选项的,所以其中一部分可能早已失效。

为什么这件事这么受关注?

报告在周六晚上登上了 Hacker News 首页。“don’t ask again”的用意是让智能体别一遍遍问同样的事,所以人们很容易忘记实际保存了什么。

这也再次说明,如今密钥泄露不只来自应用代码,也来自智能体的配置文件(和 OpenCode 泄露事件类似)。截至目前,媒体报道中还没有 Anthropic 的回应。

今后要注意什么?

  1. 先吊销并更换所有曾经出现在公开仓库这个文件里的密码和密钥,然后再清理历史记录。
  2. 检查文件是否被跟踪:git ls-files .claude。如果是,就停止跟踪(git rm --cached .claude/settings.local.json),并把它加进仓库本身的 .gitignore,而不只是全局配置。
  3. 同时检查历史记录(git log --all -- .claude/settings.local.json)、共享的 .claude/settings.json 以及保存的智能体对话。
  4. 不要把密码直接写进命令。 最好通过环境变量或密钥管理工具传递,并在 allow 规则中使用通配模式,比如文档里的 Bash(npm run test *)。

关于如何让 API 密钥远离智能体,我在 AI 智能体安全指南中写得更详细;这款工具的基础用法见 Claude Code 教程。

常见问题

Claude Code 会自己把我的密码发到 GitHub 吗?

不会。settings.local.json 文件留在我们自己的硬盘上。只有当这个文件进入提交并被推送到公开仓库时,才会发生泄露。

怎么检查我的 settings.local.json 是否在仓库里?

在项目目录下运行 git ls-files .claude 即可。如果列表里有 settings.local.json,说明 git 正在跟踪它。也建议打开文件本身,在 allow 规则里查找密码、令牌和密钥。

从仓库里删除这个文件就够了吗?

不够。文件仍然留在 git 历史和 fork 中,所以最重要的是吊销并更换已经暴露的凭据。

  • AI
  • Claude Code
  • Anthropic
  • 安全

今日 AI,每晚送达

每晚送上当天最重要的 AI 新闻和博客新文章。简明扼要,附有来源。

每天一封,一键即可退订。 隐私政策