一个容易被忽略的地方
最近几起供应链事件(比如 LiteLLM 1.107.0 被投毒)之后,大家都在忙着轮换 API key、SSH key 和云凭证。@supportapp3_lab 补了一句很实用的提醒:如果你用 Claude Code,还要看一眼 ~/.claude/projects/ 里的会话记录。Claude 读过的 .env、命令输出里显示过的密钥,都会原样留在那里。
官方 Data usage 文档写得很明确:Claude Code 客户端会把会话记录以明文形式保存在 ~/.claude/projects/ 下,默认保留 30 天,目的是支持恢复会话;保留天数可以用 cleanupPeriodDays 调整。另外,在 Claude Desktop 或 Cowork 里开始或最近继续过的会话,默认不受这个期限限制。
这意味着:一台机器如果中过窃密程序,攻击者拿走的可能不只是 .env 本身,还有一个月内所有会话里出现过的密钥副本。
排查和轮换时多做三步
- 先搜一遍。 用你实际使用的密钥前缀在会话目录里搜索,例如
grep -rl "sk-ant-" ~/.claude/projects/,再按需换成其他服务的前缀。搜到的文件说明这些 key 曾经进过会话。 - 出现过的 key 一并轮换。 如果机器有被入侵的可能,凡是在会话记录里出现过的密钥,都按已泄露处理,在对应服务后台删除并重新生成,而不是只换
.env里那一份。 - 轮换完再决定是否删除记录。 新 key 生效后,含旧 key 的会话文件就只剩风险、没有价值了。确认不再需要恢复这些会话,再删除对应文件。
从源头少留一点
- 别让 Claude 读密钥文件。 在项目的
.claude/settings.json里加Read(./.env)这类 deny 规则。官方权限文档说明,Read 的 deny 规则也会拦截同一路径上的 Edit 和 Write,并覆盖cat、head等它能识别的 Bash 读文件命令;但像 Python 脚本自己打开文件这种间接读取不在范围内,需要沙箱来兜底。 - 缩短保留期。 不需要长期恢复会话的机器,可以把
cleanupPeriodDays调小。 - 分享会话前想清楚。 文档提到,在满意度调查后选择分享会话,会上传会话记录和原始日志,已知的 key 和 token 格式会先被脱敏,但源代码和文件内容是原样上传的。
小结
密钥泄露后的清单里,除了 .env、shell 配置文件和 CI 变量,再加一项 ~/.claude/projects/。它是明文的、默认保留一个月,也最容易被忘掉。
如果你想把 Claude Code 放在一台常开、整机独享的新加坡 Mac mini 上长期运行,可以了解 Zumac.Ai,咨询 Telegram @singatao。
