编程 Agent 密钥泄露怎么防:团队 6 项安全护栏

Apiiro 在近两千个公开 GitHub 仓库中发现了 2,539 个由编程 Agent 配置文件泄露的真实密钥。本文拆解永久放行规则导致密码外泄的路径,并提供涵盖权限模式、CODEOWNERS、变量引用、gitleaks 规则与轮换机制的 6 项团队安全护栏。

Bob

Bob

2026-11-11

编程 Agent 密钥泄露怎么防:团队 6 项安全护栏

简短结论:安全机构 Apiiro 在 1,994 个公开 GitHub 仓库中发现了 2,539 个由编程 Agent 配置文件泄露的真实密钥,多数保存在逐字记录已批准命令的本地配置中。工程团队的防范核心是把 6 道防线逐一落实到人:管控共享配置、双人审查永久放行规则、用环境变量引用传参、写入仓库级忽略规则、升级命令内联密码扫描,并提前指定密钥轮换责任人。

为什么编程 Agent 正在频繁泄露密钥

编程 Agent 泄露密钥看似是个人疏忽,实则是团队流程缺失:开发者顺手点了一次批准、配置文件被一并提交、密钥就此公开,关键环节无人把守。

2026 年 11 月,Apiiro 发布的公开 GitHub 仓库调查报告统计了 104,185 份 Claude Code 项目级永久放行配置文件 .claude/settings.local.json,发现其中 1,122 份含有有效密钥;连同 Git 历史、共享配置与 Agent 对话记录,共计在 1,994 个仓库中检出 2,539 个独立密钥,波及 63 家企业组织,Hacker News 相关讨论热度超过 590 分。

单个 Agent 的权限边界设计可结合《编程 Agent 的权限:它该碰什么,不该碰什么》一起阅读;本文聚焦工程团队层面的职责分工与可复现排查步骤。

一条批准执行的命令是如何变成公开密钥的

永久放行规则(Standing Approval)允许 Agent 下次运行同类命令时不再弹窗询问。据 Claude Code 官方设置文档,当你在 Bash 权限提示中选择“Yes, and don’t ask again”时,系统会把完整命令字符串作为 allow 规则写入仓库的 .claude/settings.local.json。一旦当时执行的是 PGPASSWORD=<真实密码> psql -h db.example.com,明文密码就会原样落盘。

从本地配置文件中的密钥演变为公开提交的五个步骤:Agent 提议包含密码的命令、开发者永久批准、完整命令被保存为 allow 规则、最终随文件推送至远端仓库

官方文档指出,Claude Code 首次生成该文件时会把 **/.claude/settings.local.json 加入本机全局 Git 忽略列表;其负责人 Boris Cherny 也在 Hacker News 表示团队正开发含基础密钥扫描的修复原型。但 Apiiro 指出,全局忽略仅作用于单机,无法覆盖先运行 Agent 后执行 git init 的目录、其他机器的新克隆副本,或已被提交进版本库的文件。

报告中的三组数据直接决定了团队护栏的设计:

  • Agent 会自己提交该文件:溯源成功的 1,105 个仓库中,539 个由 Claude 共同署名(co-authored)提交。
  • 常规扫描器漏掉内联密码:gitleaks 与 TruffleHog 合计漏掉了 1,122 份含密钥文件中的 215 份。
  • 仅删文件无法消除历史记录:734 个密钥已不在最新分支,仍保留在 Git 历史提交中。

同类风险也出现在 Agent 聊天记录、记忆文件与交接笔记中:只要工具持久化命令历史,敲进命令行的密钥就会留存。

面向工程团队的 6 项安全护栏清单

无人认领的护栏注定失效,以下 6 项防线均需指定唯一责任人兜底。

六宫格团队护栏责任矩阵:技术负责人管理共享 Agent 配置、像审查代码一样审查永久放行规则、每位开发者用环境变量引用传递密钥、仓库管理员维护仓库级 gitignore、平台团队负责命令内联密码扫描、指定值班责任人负责密钥轮换

1. 由谁审批团队共享的 Agent 权限?

技术负责人(Tech Lead)负责管控提交到仓库的共享配置 .claude/settings.json。Apiiro 在这类主动共享的配置中也发现了 298 个真实密钥。编写权限规则时,应使用模式匹配(Pattern)而非完整字面量命令,避免把具体参数写进文件:

{
  "permissions": {
    "allow": ["Bash(npm run test:*)", "Bash(npm run lint)"],
    "deny": ["Read(./.env)", "Read(./.env.*)"]
  }
}

仅对任何参数下均无风险的操作放行模式规则;涉及生产环境或敏感凭证的命令一律保留按次弹窗确认。

2. 像审查业务代码一样审查永久放行规则

将 Agent 配置目录纳入仓库 CODEOWNERS,使任何触及这些目录的 Pull Request 自动触发双人审查:

/.claude/   @your-org/platform
/.cursor/   @your-org/platform
/.gemini/   @your-org/platform

这能直接拦截 Agent 自动提交的放行配置。关于在研发流程关键节点设置人工拦截的做法,可以参考我们关于编程 Agent 审批门禁的专题文章《编程 Agent 的审批关卡:在合并前把自动执行停下来》。

3. 密钥一律通过环境变量引用传递

每位开发者需确保不在命令行直接输入明文密钥。改用环境变量引用后,放行规则只会记录变量名而非真实密码:

# 错误示范:密码明文会被直接写进放行规则文件
PGPASSWORD=hunter2-prod psql -h db.example.com -U app

# 正确示范:只记录变量引用,真实密码永远不会进入规则文件
psql "$DATABASE_URL" -c 'select 1'

运行前通过密钥管理器或禁止 Agent 读取的本地 .env 注入 DATABASE_URL;curl 的 Bearer 令牌与 sshpass -p 命令同理。

4. 在仓库级 .gitignore 中忽略本地配置,而非仅靠单机全局配置

仓库管理员(Repo Owner)应将本地 Agent 配置写入项目 .gitignore 及组织新建仓库模板,让忽略规则随克隆自动生效:

echo '.claude/settings.local.json' >> .gitignore
git rm --cached .claude/settings.local.json 2>/dev/null
git commit -m "Stop tracking local agent settings"

取消追踪只能阻断后续误提交,无法清除 Git 历史、Fork 与本地克隆副本中的旧记录,已暴露凭证仍需配合第 6 项轮换。

5. 升级扫描规则以捕获命令内联密码

平台工程团队(Platform Team)负责在 pre-commit 与 CI 中配置密钥扫描。默认规则擅长识别带固定前缀的高熵 API 密钥,却容易漏掉 PGPASSWORD= 后的普通密码,需补充自定义 gitleaks 规则:

[extend]
useDefault = true

[[rules]]
id = "password-in-command"
description = "Password passed inline to a database or SSH client"
regex = '''(?:PGPASSWORD=|MYSQL_PWD=|sshpass\s+-p\s*)['"]?([^\s'"]{6,})'''
secretGroup = 1

[[rules]]
id = "bearer-in-command"
description = "Bearer token inside a curl command"
regex = '''(?i)authorization:\s*bearer\s+([A-Za-z0-9._\-]{20,})'''
secretGroup = 1

先用 gitleaks git . 扫描全量提交历史,再接入每次推送检查,并开启 GitHub Secret Scanning 与推送保护(Push Protection)。排查时优先处置同时暴露了公网主机地址的凭证。

6. 在泄露发生前指定密钥轮换责任人

团队需提前指定值班责任人(On-call Owner),严格执行“先轮换吊销、后清理文件”。排查组织内待轮换凭证时,可同时检索远端仓库与提交历史:

gh search code --owner your-org --filename settings.local.json
git log --all --oneline -- .claude/settings.local.json .claude/settings.json

同时需清理开发机本地的放行文件:即便未推送至 GitHub,明文 JSON 仍可能被窃取凭证的恶意 npm 包从本地磁盘扫走。

HiFox 在这套安全体系中的定位

HiFox 是编程 Agent 外层的团队协作与管控层,不替代 Claude Code、Codex 等底层运行时,也不替代代码库密钥扫描器。它改变的是凭证配置方式与团队对执行过程的可见性。

在 HiFox 中,你可以在 Agent 设置里配置环境变量和启动参数(环境变量值默认隐藏),或通过连接器将第三方工具凭证授权给该 Agent,凭证只作用于授权它的 Agent 运行过程,不会出现在指令、任务描述或评论里。当任务派发到你自己的电脑(Computer)并由运行在电脑上的本地服务启动 Runtime 时,派单无需在命令行参数里填写明文密码。

同时,每次执行的运行记录都会保留状态、来源与进展,结果统一写回任务供团队验收。一旦某个 Agent 的提交触碰了 .claude/ 目录,变更会直接呈现在共享任务上,便于团队基于任务级证据链审查 AI 生成代码。

总结

Apiiro 的实测数据表明,编程 Agent 泄露密钥并非单次误操作所致,而是共享配置、永久放行规则、变量传参、仓库级忽略、内联密码扫描与应急轮换六个环节缺少明确责任人。建议本周内将这 6 项逐一指派到人,并优先完成全量 Git 历史排查。

如果团队正并行使用多个编程 Agent,现在就开始使用 HiFox,从接入第一台电脑和第一个 Agent 起步,让每次任务派发与代码变更都有迹可循。

常见问题

这是 Claude Code 的软件漏洞吗?

这是永久放行规则以完整命令落盘带来的设计隐患。尽管 Claude Code 会写入单机全局忽略列表,且官方正开发密钥扫描修复方案,但跨机克隆、历史提交与共享配置等团队协同盲区仍需工程护栏兜底。

团队应该把哪些 Agent 文件视作含敏感信息的受控文件?

不论在个人开发机还是代码库中,都应像管控 .env 一样管控 .claude/、.cursor/、.gemini/、.specstory/ 目录及各类 Agent 记忆文件与交接笔记。

我们应该彻底停用“不再询问”(don’t ask again)功能吗?

不必停用。只要改用 Bash(npm run test:*) 这类模式规则代替完整字面量命令,并通过环境变量引用传递密钥,规则文件里就不会出现真实凭证。

Explore more

Gemini 4 Carbon 上手:agent swarm 怎么用、什么时候别用

Gemini 4 Carbon 上手:agent swarm 怎么用、什么时候别用

Carbon 与 Argon 同价只到 12 月 1 日。/swarm 是 Antigravity 的编排功能,不是 API 开关。本文拆解触发方式、迁移清单和最小可降级示例。

2026-11-11

Fable 5.2 实测:$8/$40 别无脑开 max 档

Fable 5.2 实测:$8/$40 别无脑开 max 档

Claude Fable 5.2 与 Mythos 5.2 将标准价格降至 $8/$40 每百万 Token、提速 30%,但实测显示 max 档会耗尽 128,000 思考 Token 并返回空结果。本文拆解其底层机制,给出 Effort 档位锁死与 Opus 5.5 + Fable 5.2 分层路由方案。

2026-11-10

Gemini 撤回免审承诺:防后台拉取云盘邮件送人审

Gemini 撤回免审承诺:防后台拉取云盘邮件送人审

Google 悄然撤回 2023 年「Gmail、Docs 与 Drive 个人内容不经人工审阅」承诺,更新 Answer 16836988 警告审阅员看到的可能就是邮件或文件本身。实测显示开启 Connected Apps 后日常闲聊即按概率触发后台全文抓取。本文拆解四档抓取状态与脱敏盲区,给出四步自查与三层防外泄方案。

2026-11-10