别的类别装错了只是白花钱,安全类装错了会给你一种「已经防住了」的错觉。本榜十二条都真实可装/可读,但分成两拨:能硬挡住你的(退出码非零、系统调用被拦),和只会写份报告的。两拨都有用,混着当一回事用就会出事。
AI 写代码之后多出两个新战场——模型边写边扫,以及你装进来的 skill / MCP server 本身就是攻击面。本期把这两个和老三样(密钥扫描 / 依赖审计 / 越权检查)放进一张表,用一条判据排序:fail-closed 优先——不确定时默认拒绝,而不是默认放过。先给表和命令,判据放后半程。
# ①② 不用装,改配置就有。沙箱先看面板缺什么
/sandbox
# 要把沙箱当安全门禁而不是省事工具,这两个键必须显式写
{ "sandbox": { "enabled": true, "failIfUnavailable": true,
"allowUnsandboxedCommands": false,
"network": { "strictAllowlist": true, "allowedDomains": ["*.github.com"] } } }
# ③④⑤⑪ 确定性扫描器,装法都是一行
brew install gitleaks trufflehog zizmor
go install github.com/google/osv-scanner/v2/cmd/osv-scanner@latest
gitleaks git --report-path gitleaks-report.json # 有发现 → 退出码 1
trufflehog git file://. --results=verified --fail # 有发现 → 退出码 183
osv-scanner scan source -r .
zizmor .github/workflows/ # 支持 SARIF 输出接 CI
# ⑥⑦ 官方插件;⑧ 内置命令,什么都不用装
/plugin marketplace add anthropics/claude-plugins-official
/plugin install security-guidance@claude-plugins-official
/plugin install claude-security@claude-plugins-official # 需要 python3 ≥ 3.9
/claude-security # 菜单三件事:扫全库 / 扫改动 / 出补丁
/security-review # 当前分支跑一遍,不用装任何东西
# ⑩ semgrep 的 MCP 现在是主仓的子命令(旧仓 semgrep/mcp 已归档)
claude mcp add semgrep -- semgrep mcp
# ⑫ 扫你自己装的那些 MCP server 与 skill;默认逐个问你才连
uvx snyk-agent-scan@latest scan
filesystem 管路径、network 管域名。最值得抄的设计:denyRead 在更宽的 allowRead 里依然成立(官方原话是「一条宽的 allow 不能悄悄把一个 secret 重新暴露出来」)。什么时候别用:你其实想要的是每条命令都问你——那用 permission 模式,别用沙箱。ask。--exit-code 可改),pre-commit 一行 - id: gitleaks 就拦在提交前。老仓库满屏告警的解法是 baseline:先出报告,再 --baseline-path 只看新增,个别误报进 .gitleaksignore。别装:托管方的推送保护已经够用。GetCallerIdentity)确认还活着。--results=verified 把噪音砍到「真能用的那些」,--fail 让有发现时退出码变 183。代价:验证要往外发请求,且 AGPL-3.0 不是所有公司能接。package.json / go.mod / pom.xml 这些清单跟 OSV.dev 的漏洞库对账,scan source -r . 递归扫。实验性的 osv-scanner fix 能按漏洞深度与严重度自动提升级方案,但官方标了红线:它在不可信项目上有风险,可能执行包管理器脚本。python3 ≥ 3.9):一队 agent 先摸架构、建威胁模型、分头找漏洞,每条发现都由独立 verifier agent 复核过才进报告。产出三份同源文件:CLAUDE-SECURITY-RESULTS.md / .jsonl / .sarif(SARIF 2.1.0,按 CWE 归类,能直接喂 GitHub code scanning),外加一份版本戳记下扫的是哪个 commit。三条必须知道的限制:扫描结果不确定(同一份代码两次扫可能给出不同发现)、补丁永不自动应用(写到 patches/F1.patch 等你 git apply)、一次扫描消耗的 token 可能很多且要开着会话跑完。contents: read + pull-requests: write。security_check / semgrep_scan / semgrep_scan_with_custom_rule 等),让 agent 自己去扫。名字上有坑:独立仓 semgrep/mcp 据其页面已于 2025-10-28 归档,现在是主仓的 semgrep mcp 子命令。别接:不需要模型调它,就在 CI 跑 semgrep ci,省下常驻 context。${{ }} 插值变成攻击者可控的代码执行)、凭据残留、runner 权限过宽、冒名 commit。「越权检查」里最容易漏掉的一格:多数人审代码权限,没人审那个能写仓库的 workflow token。支持 SARIF 接 CI。mcp.json、.claude/skills、.agents/skills,找 prompt injection、tool poisoning、可疑下载、硬编码密钥。它自己那条警告最说明这一类的处境:扫 MCP 配置本身就可能执行命令或发出网络请求,所以默认交互式扫描每连一个 server 都问你一次,非交互环境要显式给 --dangerously-run-mcp-servers。需要 SNYK_TOKEN。OnFailAction.EXCEPTION 正是 fail-closed 的写法——但它管的是你自己那个 LLM 应用的输入输出,不是你的编码 agent,放进本榜会误导人。protectai/llm-guard(MIT)的 input/output scanner 分类做得漂亮,但据其 GitHub 页已于 2026-07-09 归档、明示不再维护——当思路读可以,往新项目里引不行。右上角空着不是产品没做完,是设计取舍:模型审查有误报,一条误报硬挡提交,团队第二天就会把整个检查关掉——连报告都没了。所以正确读法是:左列负责「绝不许发生」,右列负责「你最好看一眼」,谁也别替谁。
三种常见的错配:
--fail 是 183,能直接进 CI。⑥⑦⑧⑨ 答案都是「不阻断」——记下来,别自我安慰。sandbox.failIfUnavailable: true(官方注明这是给「把沙箱当安全门禁」的部署用的)。dangerouslyDisableSandbox 重试,allowUnsandboxedCommands: false 关掉这条通道。⑫ 对应的键叫 --dangerously-run-mcp-servers。凡是名字里带 dangerously 的,先弄清它默认是开还是关。sandbox.network.strictAllowlist(把「问一下」变成「直接拒」)只有写在用户设置、托管设置或 --settings 里才生效,写进仓库的 .claude/settings.json 完全没用。安全配置放错层等于没放。.gitleaksignore、④ 的 --results=verified、⑨ 那份排除清单。没有治理机制的高误报工具,装上就是等着被关掉。fix 可能执行包管理器脚本。安全工具读的就是不可信输入,这三条警告是它们诚实,不是它们差。--results=verified 同理。~/.aws/credentials 和 ~/.ssh/ 都还能读——要挡住得显式配 sandbox.credentials 或把路径加进 denyRead。/security-review。 零安装零配置,先知道这个分支大概什么水位。- id: gitleaks,性价比最高的一条 fail-closed。git apply,至今是人的活。先装这三个:① gitleaks 进 pre-commit(brew install gitleaks,一行 - id: gitleaks,有发现退出码 1)——唯一「今天装、今天就有牙」的。② /security-review——零安装,先摸清分支水位。③ /plugin install security-guidance@claude-plugins-official——边写边复审,但记住它不阻断。
按需再加:claude-security@claude-plugins-official(要 SARIF 报告与可 git apply 的补丁,接受 token 开销)· trufflehog --results=verified --fail(③ 误报多到没人看,且法务能接 AGPL)· osv-scanner scan source -r .(依赖多、语言杂)· zizmor .github/workflows/(仓里有 workflow,这格最常空着)· anthropics/claude-code-security-review(要 PR 级评论,且只审可信 PR)· uvx snyk-agent-scan@latest scan(装了第三方 skill / MCP server)· claude mcp add semgrep -- semgrep mcp(要 agent 自己能调 SAST)。
明确别做:把「有报告」当成「有门禁」 · 在老仓库上不出 baseline 就开密钥扫描门禁 · 让模型的安全判断直接否决提交 · 只审代码不审 .github/workflows/ 和装进来的 skill · 开了沙箱却不写 failIfUnavailable 与 allowUnsandboxedCommands · 把 strictAllowlist 写进仓库的 .claude/settings.json(不生效)· 往新项目里引 llm-guard(已归档)· 以为星数高就更安全。
--settings 里生效。/security-review 的位置(2026-09)failIfUnavailable / allowUnsandboxedCommands / strictAllowlist / credentials;denyRead 在宽 allow 里仍成立;默认读权限覆盖整机(2026-09)claude-security 三件事;三份报告文件与版本戳;扫描不确定性;补丁永不自动应用(2026-09).gitleaksignore(MIT,2026-09)--fail 退出码 183(AGPL-3.0,2026-09)scan source -r;实验性 fix 的参数与「不可信项目上有风险」提示(Apache-2.0,2026-09)semgrep mcp 子命令与暴露的工具;旧独立仓 semgrep/mcp 据其页面 2025-10-28 归档(LGPL-2.1,2026-09)--dangerously-run-mcp-servers(Apache-2.0,2026-09)OnFailAction.EXCEPTION 这种 fail-closed 写法(Apache-2.0,2026-09)