AI安全案例分析|Claude Code 配置文件泄露密钥
原创 天元实验室 2026-11-09 18:00 北京

2026 年 11 月,安全公司 Apiiro 发现,Claude Code 在保存用户命令授权记录时,可能将命令中的敏感信息一并写入项目配置文件 .claude/settings.local.json。

概述
2026 年 11 月,安全公司 Apiiro 发现,Claude Code 在保存用户命令授权记录时,可能将命令中的敏感信息一并写入项目配置文件 .claude/settings.local.json。当开发者执行命令并选择“是,不再询问”(Yes, and don't ask again)后,Claude Code 会将该命令保存为允许规则。如果命令中包含数据库密码、API Token 或其他访问凭证,这些内容也可能以明文形式保存在配置文件中。
Apiiro 对公开 GitHub 仓库进行检索,共发现 103,617 个仓库包含这类配置文件,文件总数达到 104,185 份。其中,1,122 份文件包含敏感信息,涉及 1,379 项密钥或凭证。进一步检查还发现,部分配置文件曾被提交到 Git 仓库,相关内容也可能保留在 Git 历史记录和 Fork 仓库中。开发者即使删除了当前版本中的文件,也无法通过这一步清除此前已经提交的敏感信息。
开发者在日常使用 Claude Code 时,可能因为一次命令授权操作,将包含密码、API Token 等敏感信息的命令保存到项目配置文件中。如果该文件随后被提交到公开 GitHub 仓库,这些凭证就可能随代码一同泄露,并被他人获取和滥用。

图1:Claude Code 命令授权机制
01 攻击背景
Claude Code 是 Anthropic 推出的 AI 编程工具,可以通过命令行操作开发环境,执行代码构建、测试、文件操作和数据库连接等任务。
执行 Shell 命令前,Claude Code 通常会请求用户确认。用户选择“是,不再询问”后,对应的授权规则会保存到项目目录下的 .claude/settings.local.json,后续匹配的命令可以直接执行。
风险出现在命令包含敏感信息的情况。例如,开发者使用以下命令连接数据库:
`PGPASSWORD=MySecretPassword psql -h db.example.com -U admin`如果用户对这条命令选择“是,不再询问”,数据库密码也可能被完整保存到配置文件中。文件一旦提交到公开 GitHub 仓库,凭证就可能泄露。
Apiiro 对 16 款 AI 编程工具的文档进行了比较,研究人员称,Claude Code 是其中唯一被确认默认将完整授权命令保存到项目文件中的工具。
02 问题原理与泄露流程
2.1 关键配置文件
本次事件涉及的核心文件是:`.claude/settings.local.json`。
该文件用于保存 Claude Code 的本地项目设置,包括用户批准的命令权限规则。用户选择“是,不再询问”后,Claude Code 会将对应规则写入该文件,保存内容可能是命令模式,也可能是完整命令。
前者通常只记录命令匹配规则,后者则可能包含数据库密码、API Token 等敏感参数。这些信息会随授权规则一起写入 JSON 文件,并以明文形式保存在本地。
2.2 攻击与泄露链路
整个泄露过程可以分为以下几个步骤:
第一步:开发者在命令中使用敏感凭证。
开发者让 Claude Code 执行数据库连接、服务器登录或 API 调用等操作。为了完成任务,命令中可能包含数据库密码、SSH 登录凭证或 API Token。
第二步:用户批准命令并选择不再询问。
Claude Code 在执行命令前向用户请求授权。用户选择“是,不再询问”,允许后续匹配的命令不再重复确认。
第三步:完整命令被保存到项目配置文件。
Claude Code 将对应的授权规则写入 .claude/settings.local.json。如果保存的是完整命令,命令中的密码、Token 等敏感参数也会被一并记录。
第四步:配置文件进入 Git 仓库。
Claude Code 会尝试避免该文件被提交到 Git:首次在 Git 仓库中写入该文件时,会将其添加到当前用户的全局 Git excludes 配置中。
但这一保护存在局限:
全局 Git excludes 只作用于当前用户的本地 Git 环境,不会随项目仓库一起分发。
Claude Code 不会因此自动将该文件加入项目自身的 .gitignore。
如果文件已经被 Git 跟踪或提交,全局忽略规则无法撤销已有的跟踪关系。
在其他开发者的计算机、CI 环境或容器中,原有的全局忽略配置也不一定存在。
因此,一旦文件进入代码提交过程,就可能随着项目被推送到公开 GitHub 仓库。
第五步:敏感信息通过仓库历史和 Fork 持续传播。
即使开发者发现问题后删除 .claude/settings.local.json,已经提交的内容仍可能保留在 Git 历史记录中。
此外,其他开发者创建的 Fork 也可能保留原始文件及其中的凭证。删除当前分支中的文件,并不意味着历史版本和其他副本中的敏感信息已经消失。
2.3 Apiiro 研究发现
Apiiro 对公开 GitHub 仓库中的 Claude Code 配置文件进行了检索,披露了以下数据:
统计项目 | 数量 |
公开配置文件副本 | 104,185 |
涉及仓库 | 103,617 |
至少包含一项敏感信息的文件 | 1,122 |
不同敏感信息数量 | 1,379 |
涉及组织 | 63 |
在发现的敏感信息中,包括:
379 个数据库密码;
43 组公共服务器 SSH 登录凭证;
42 个 GitHub、GitLab 和 npm Token;
23 个 AWS 密钥。

图2:公开仓库中的敏感凭证泄露统计
研究人员还发现,部分敏感凭证具有较高权限,例如数据库供应商自身的管理级云密钥,以及医疗记录数据库的所有者密码。从历史记录来看,问题的影响范围并不局限于当前配置文件:
509 个仓库的历史版本中,还存在额外的 734 项敏感信息,这些信息已经不在当前文件中。
74 个仓库的 211 个 Fork 中,仍然保留着与原仓库相同的敏感信息。
将共享配置文件 .claude/settings.json、历史版本和保存的 Agent 对话日志纳入统计后,Apiiro 报告的总量达到 1,994 个仓库中的 2,539 项敏感信息。
在研究人员追踪的 1,105 个仓库中,有 539 个仓库存在 Claude 作为共同作者的提交记录,相关提交修改过该配置文件。Apiiro 没有逐一验证所有凭证是否仍然有效,也没有证据表明这些凭证已被攻击者利用。
2.4 常见密钥扫描工具为何会漏报?
本次事件还暴露出传统密钥扫描工具在检测命令行密码方面的不足。
研究人员使用 Gitleaks 和 TruffleHog 对包含敏感信息的文件进行扫描,结果如下:
扫描工具 | 命中的文件数量 |
Gitleaks | 564 |
TruffleHog | 643 |
两者均未命中 | 215 |
这里的统计是针对 1,122 份包含敏感信息的文件,研究人员未使用工具的凭证验证步骤。漏报的一个重要原因是:常见密钥扫描工具主要依赖已知密钥格式、特征字符串和规则进行识别,而开发者直接写在命令中的普通密码,可能不具备明显的密钥特征。
例如:
PGPASSWORD=example_password psql -h db.example.com
sshpass -p "example_password" ssh root@server.example.com
mysql -pExamplePassword -h db.example.com
这类密码可能只是普通字符串,缺少明显的密钥格式特征,常见扫描工具很难准确识别。企业即使部署了密钥扫描工具,也可能遗漏 Agent 配置文件、命令记录和对话日志中的敏感信息。
03 威胁与后果评估
3.1 开发环境凭证泄露
.claude/settings.local.json 可能包含数据库密码、SSH 凭证、云平台密钥和 API Token。一旦进入公开仓库,攻击者便可能利用这些信息访问数据库、服务器或云服务。尤其是具有管理权限的密钥,一旦泄露,影响范围可能从单个开发项目扩大到企业内部基础设施。
3.2 敏感信息长期残留
Git 的版本管理机制会保留历史提交。即使开发者删除当前文件,历史版本仍可能包含原始凭证。Fork、克隆仓库和其他代码分发渠道还会进一步扩大传播范围。因此,单纯删除文件或修改 .gitignore 并不能完成泄露处置。
3.3 Agent 本地数据成为新的敏感信息存储面
Apiiro 还在共享配置文件和保存的 Agent 对话日志中发现了敏感信息。Agent 执行任务时产生的授权记录、运行日志、上下文内容和记忆文件,都可能保存密码、Token 等敏感数据。
AI 编程工具逐渐获得代码仓库、数据库、云平台和 CI/CD 系统的访问权限。一旦这些本地数据泄露,攻击者可能利用其中的凭证访问相关系统,进一步扩大攻击范围。
3.4 传统密钥扫描存在检测盲区
如果企业仅依赖已知密钥格式进行扫描,可能无法识别嵌入普通命令中的数据库密码和登录凭证。尤其是 Agent 自动生成并保存的命令记录,其格式与普通开发配置和 Shell 命令相似,容易绕过只针对特定密钥格式设计的检测规则。
04 案例启示
4.1 将 Agent 配置文件纳入敏感信息管理
企业应将 AI Agent 的配置目录、授权记录、记忆文件和对话日志纳入敏感信息管理范围,重点关注:
.claude/
.cursor/
.gemini/
.specstory/
这些目录可能保存命令记录、权限规则和敏感上下文,需要做好本地保护和仓库管理。
4.2 避免在命令中直接填写真实凭证
数据库密码、API Token 和 SSH 密码应通过环境变量或密钥管理系统引用,例如使用 $DB_URL,避免将真实凭证写入命令。配置授权规则时,也应优先使用命令模式,减少完整命令中敏感参数的持久化。
4.3加强 Git 文件管理与提交检查 攻击与泄露链路
在组织级和项目级 .gitignore 中排除 Agent 本地配置文件,并通过 Pre-commit Hook 和 CI 检查敏感文件。
对于已经被 Git 跟踪的文件,可执行:
git rm --cached .claude/settings.local.json
该操作只停止跟踪当前文件,已提交到 Git 历史中的敏感信息仍需单独清理。
4.4 扩展敏感信息扫描范围
针对 Agent 配置文件、命令记录和对话日志补充扫描规则,重点识别:
PGPASSWORD= 等环境变量密码;
sshpass -p 等命令参数凭证;
数据库连接字符串中的账号密码;
HTTP 请求头中的 Bearer Token。
扫描范围应覆盖当前文件和 Git 历史。
4.5 建立凭证泄露处置流程
发现真实凭证泄露后,应优先轮换或撤销密码、Token 和密钥,再清理文件及 Git 历史。同时排查仓库 Fork、克隆副本、软件包和镜像中的残留信息。
Claude Code 事件暴露了 AI Agent 本地配置和运行数据中的凭证管理风险。随着 Agent 获得更多代码仓库、数据库和云平台权限,企业需要将其配置文件、执行日志和记忆数据纳入日常安全检查。
关于 AISS 安全智链社区
本案例已收录至 AISS 安全智链社区案例库,社区地址:https://aiss.nsfocus.com/#/
参考链接
[1] The Hacker News — Claude Code's “Don't Ask Again” File Exposes Passwords and Keys in 1,122 Public Copies on GitHub(2026-11)
https://thehackernews.com/2026/11/claude-codes-dont-ask-again-file.html
[2] Apiiro — Claude Code 配置文件敏感信息泄露研究
[3] Anthropic — Claude Code Settings Documentation
https://docs.claude.com/en/docs/claude-code/settings
[4] Git Documentation — gitignore
https://git-scm.com/docs/gitignore
[5] Gitleaks — Detect Secrets in Code Repositories
https://github.com/gitleaks/gitleaks
[6] TruffleHog — Find and Verify Secrets
绿盟科技天元实验室专注于新型实战化攻防对抗技术研究。
研究目标包括:漏洞利用技术、防御绕过技术、攻击隐匿技术、攻击持久化技术等蓝军技术,以及攻击技战术、攻击框架的研究。涵盖Web安全、终端安全、AD安全、云安全等多个技术领域的攻击技术研究,以及工业互联网、车联网等业务场景的攻击技术研究。通过研究攻击对抗技术,从攻击视角提供识别风险的方法和手段,为威胁对抗提供决策支撑。

M01N Team公众号
聚焦高级攻防对抗热点技术
绿盟科技蓝军技术研究战队

官方攻防交流群
网络安全一手资讯
攻防技术答疑解惑
扫码加好友即可拉群
本文转载自微信公众号「M01NTeam」,查看原文。版权归原作者所有,如有侵权请联系删除。