
AI 技能AI 插件应用安全网络安全AI 评测【免费下载链接】skillsTrail of Bits Claude Code skills for security research, vulnerability detection, and audit workflows项目地址https://gitcode.com/gh_mirrors/skills8/skills点击查看免费下载本篇文章围绕 Trail of Bits Claude Code skills 仓库中plugins/insecure-defaults插件的核心命令 audit.md 展开系统讲解/insecure-defaults:audit命令的调用约定、返回状态契约并结合 workflows/audit.js、六类检测语料与 seed-coverage.js 测试源码还原整条「收集候选 → 反驳验证 → 汇总报告」审计流水线的底层实现。读完本文你将掌握如何在 Claude Code 中正确调用该审计命令、如何按status字段解读每一次运行结果并理解每一条 finding 背后经历了怎样的验证逻辑。一、命令是什么一段只能由 Agent 执行的审计契约plugins/insecure-defaults是 Claude Code 的一个插件用于审计代码仓库中的不安全默认配置——包括回退密钥fallback secrets、默认凭据default credentials、fail-open 安全开关、弱加密默认值、宽松访问权限以及调试信息泄漏。其整体定位与安装方式记录在 README.md 中/plugin install insecure-defaults # marketplace 安装 /plugin install ./plugins/insecure-defaults # 本地 checkout 安装安装后即可通过命令形式使用/insecure-defaults:audit # 审计整个仓库 /insecure-defaults:audit src/ # 审计子树 /insecure-defaults:audit src/config/app.py # 审计单个文件参数可以是文件或目录可选缺省为.。值得注意的是 README 的明确约定你用命令指定什么什么就是审计目标——即使它看起来像测试代码例如把 scope 限定到tests/就会审计测试目录本身。而exclude_paths测试、fixtures、docs、vendor 代码的排除规则只对指定 scope 之外的路径生效绝不能排除用户点名要审的路径本身audit.js 中 recon agent 的指令对此有明确表述。而 commands/audit.md 这份文件正是该命令的行为契约它告诉调用方Claude Code 会话中的 Agent如何一步步执行并收尾这次审计。它的核心是一条三步骤执行序列缺一不可。二、命令执行三步曲校验、运行、按状态输出步骤 1确认语料库存在命令的第一步是检查插件语料目录是否完整ls -1 ${CLAUDE_PLUGIN_ROOT}/references输出必须列出*.md文件。如果该命令报错或一个文件都没列出必须立即停止并向用户说明——不允许到别处继续搜索、不允许猜测、更不允许在语料缺失的情况下强行运行审计。这条前置校验是有深层原因的语料文件references/category.md中写明了每个类别「Report when / Skip when」的判定规则和成对的脆弱/安全代码示例它们是验证 Agent 判断候选是否成立、剔除误报的依据。README 对此的措辞非常严厉「If the corpus cant be found, the run aborts rather than continuing without it.」——语料不可读运行就直接中止而不是在没有它的情况下继续。步骤 2通过 Workflow 工具运行第二步是调用Workflow工具启动审计流水线name: insecure-defaults:audit-pipeline args: { scope: $1 or ., pluginRoot: ${CLAUDE_PLUGIN_ROOT} }scope用户传入的目标路径未传则用.pluginRoot必须使用终端打印出的${CLAUDE_PLUGIN_ROOT}实际值——它就是插件的真实路径直接照抄即可。需要特别强调的是README.md 明确警告应该使用命令/insecure-defaults:audit而不是直接调用 workflow。audit.js的meta.description写得很直白「Invoke the command, not this.」在 workflows/audit.js 中audit-pipeline的入口有一段守卫逻辑如果pluginRoot参数缺失会立即返回status: missing-plugin-root并提示「Run /insecure-defaults:audit instead」。也就是说绕过命令直接调流水线只会立刻停下不会有任何回退。步骤 3按 status 字段决定如何收尾运行结束后必须依据返回的status决定如何向用户呈现结果。这是 audit.md 中最关键、也最容易被忽略的契约部分可整理为下表status取值含义输出方式findings审计完成存在确认后的发现直接打印reportno-findings-confirmed审计完成候选全部被反驳无确认发现直接打印reportno-candidates六路 sweep 全部执行完毕但一个候选都没匹配到没有report打印note并包含其要点这是「未发现模式匹配」不是「不存在风险的证明」report-failed审计流水线跑完了但汇总报告 Agent 没能产出 Markdown打印note然后由调用方自行呈现findings、refuted和coverage其他任何值审计没有完整执行不是干净结果打印note并明确说明本次运行失败这套「状态驱动收尾」的设计本质上是在约束 Agent 的汇报行为绝不允许把一次失败的运行、一次零匹配的运行包装成「审计通过」。从 workflows/audit.js 的源码看实际可能出现的状态比命令文档列出的还要丰富调用方会看到的有missing-plugin-root缺少pluginRoot参数无法定位语料L44-L52recon-failedRecon 阶段没有任何产出L201-L206scope-missing指定的 scope 在磁盘上不存在scope_exists: false直接中止L208-L213因为「缺失的路径绝不能报告为干净」corpus-unreadable有 sweep 读不到自己的category.json或category.md整次运行中止L308-L321search-failed所有 sweep 扫描的文件总数为 0这是搜索失败而非干净结果L324-L336no-candidates零候选L395-L409verify-failed没有任何候选被裁决全部候选仍是未判定状态L616-L627report-failed审计完成但报告 Agent 返回空L694-L705findings/no-findings-confirmed正常收官L707-L713。可以看到audit.md 中「anything else: 运行失败」这一分支实际上覆盖了上述所有异常状态它们共同保证一个不完整的结果永远不会被误读为一个干净的审计结论。三、六类检测类别语料即判定标准命令文档本身没有展开六类检测的具体内容但这些内容正是语料库要表达的判定规则。插件把「不安全默认配置」细分为六个类别每个类别由三份必须互相一致的文件定义见 README.md 的表格与 audit.js 中的CATEGORIES常量类别典型示例判定语料Fallback secrets回退密钥SECRET env.get(KEY) or devfallback-secrets.mdDefault credentials默认凭据种子的admin/admin123default-credentials.mdFail-open security switchesgetenv(REQUIRE_AUTH, false)fail-open-security.mdWeak crypto弱加密默认值hashlib.md5(password)weak-crypto.mdPermissive access宽松访问ACLpublic-read、0o666、CORS*permissive-access.mdDebug leakage调试泄漏响应中返回traceback.format_exc()debug-features.md每个类别的语料id.md都以固定的「Report when:/Skip when:」二元规则开头并附上多语言的脆弱/安全成对示例。以 fallback-secrets.md 为例Report when环境变量缺失时提供的默认值被用于签名、加密、会话或令牌机制Skip when每次启动随机生成的默认值只用作缓存键或关联 ID 的值。其核心判据原文是「The decisive question is not whether a literal exists. It is whether the apprunswith it.」——env.get(X, Y)会让应用带着默认值跑起来脆弱而env[X]会直接崩溃fail-secure安全。这一条判据贯穿了整个插件的方法论。fail-open-security.md 则强调「Read the default, not the flag name」REQUIRE_AUTH这个名字听起来很安全但如果它默认回退到false就等价于默认不要求认证。而 weak-crypto.md 强调算法本身从来不是结论——hashlib.md5用在缓存键上没问题用在密码哈希上就是漏洞必须追踪到使用现场sink才能判定。四、流水线四阶段Recon → Discover → Verify → Report命令背后的audit-pipeline是一个四阶段 Agent 流水线README 与 audit.js 的meta.phases给出了完整分工阶段Agent 数模型职责Recon侦察1Sonnet判定 scope 是否存在、刻画技术栈与部署清单Discover发现6Sonnet每个类别一路并行扫描只收集候选、不裁决Verify验证NOpus按类别分批的反驳式验证 Agent每批最多 16 条候选Report报告1Sonnet严重度分级、修复建议与覆盖率说明模型分配在源码MODELS常量audit.js中与 meta 完全一致只有承担最终裁决的 Verify 阶段使用 Opus体现「扫描求广、裁决求严」的取舍。各阶段之间的数据契约也由audit.js中的 JSON Schema 严格约束Recon输出RECON_SCHEMA[L112-L131]scope_exists、languages、frameworks、config_locations、config_accessors、deploy_manifests、exclude_paths。其中config_accessors记录本项目自己封装的配置读取函数及其supplies_default标记——这直接决定了 fail-open 藏在哪里Discover输出CANDIDATES_SCHEMA[L133-L149]corpus_read、patterns_loaded、files_scanned、seed_patterns_run、derived_patterns、candidatesVerify输出VERDICTS_SCHEMA[L151-L173]每条候选给出refuted、refuted_at_step1-5 步中哪一步反驳了它、shapeconfigurable / unconditional、sink、deployment_supplies_var、severity、exploitation与rationale。一个值得注意的实现细节是contextFor()[L69-L74]每个阶段只会看到它被允许使用的字段子集Recon 遗漏的字段会被补成空数组而不是消失从而保证「Agent 看到的输入形状不依赖 Recon 是否产出」也防止 Verify 阶段的 Agent 拿到 accessor 清单后去猎取新候选[L237-L242] 的注释明确说明了这一点。五、候选收集与去重category:file:lineDiscover 阶段六路并行 sweep 之后候选要经过一次跨类别去重。去重键是category:file:lineaudit.js同一类别内的两个模式命中同一行 → 折叠为一条候选先到者胜不同类别命中同一行 → 保留为两条独立候选各自按自己的语料与判别规则裁决。README 用一个例子解释了为什么不能合并hashlib.md5(k)可能同时是真实的 weak-crypto 发现又是 permissive-access 类别的误匹配一个合并后的裁决无法同时覆盖这两种解读。同样地去重必须在 Verify 之前完成因为「先折叠再验证」能避免为重复候选重复付费而按类别分批也需要完整的候选集合。六、Verify 阶段默认反驳五步裁决这是整个插件方法论的灵魂。Verify 阶段的每个 Agent默认答案是refuted: true。原因在于模式扫描产生的大多数匹配并不是漏洞只有能引用代码证明其可利用性时才应确认audit.js 的 prompt 原文按类别分批每批上限 16 条候选MAX_FINDINGS_PER_BATCH 16[L427]并优先按目录打包——同一目录下的文件通常共享 import、配置模块与框架惯例Agent 追踪过第一个之后可以复用所学[L435-L481] 的打包算法每批只读本类别的一个语料文件应用同一条判别规则。每一条候选都要按顺序走完以下五步在第一步反驳它时就立即停止并记录refuted_at_step该文件在生产中是否可达位于exclude_paths、死代码、仅 dev 分支可达、从未被打包的脚本 → 反驳不安全的值是否就是实际运行的值先给候选分类Configurable可配置值来自带回退的配置查询。当配置缺失时若进程停止raise 型查询、启动校验器、拒绝缺值的 schema→ fail-secure → 反驳带着字面量继续启动 → fail-open继续往下走Unconditional无条件没有任何配置参与不安全值直接写在代码里。这一步无法反驳此类候选——不安全值就是唯一的值不存在 fail-secure 路径也不存在「缺失的变量」可以推理。README 指出约一半的发现属于这种形态该值是否真的不安全以语料的「Skip when」行为准SECURE 示例展示良性匹配长什么样该值是否到达安全决策点sink签名、加密、认证、授权、凭据比较、传输校验。一个被读取但从未在强制点被消费的配置值 → 反驳必须引用file:line部署是否总是提供该变量仅针对 Configurable 候选逐一检查deploy_manifests中的每个清单报告deployment_supplies_var的四种取值audit.jsalways代码级缺陷仍在但可利用性大大降低 → 确认但降级严重度neverCRITICAL 情形生产跑的就是回退值sometimes按完整严重度视为可达并点名那些没设置该变量的清单unknown确实查过但无法确定视为可达并在 rationale 中说明哪些清单解析不了。这一步没有「反驳」选项任何答案都只移动严重度不反驳候选。另外若 Agent 无法完成追踪必须返回refuted: true并注明trace incomplete: 原因遗漏一条候选会被记为未裁决unadjudicated在报告中体现为覆盖率缺口——这比带着理由的反驳更糟糕。七、模式种子与派生模式种子是下限不是搜索的全部Sweep 的模式策略在 README 的「Patterns」一节与 Discover 阶段的 promptaudit.js中有完整交代种子seeds写死在references/id.json的seeds数组里是通用兜底模式。例如 fallback-secrets.json 中的(getenv|environ\.get|get_config|get_setting|getOrDefault|GetString|LookupEnv)\([^)]*,[[:space:]]*[]以及 fail-open-security.json 中的InsecureSkipVerify[[:space:]]*:[[:space:]]*true派生模式derived patterns每个 sweep 根据 Recon 给出的 profile 为本项目现场编写模式从config_accessors推出项目自己的get_setting(X, default)封装从frameworks推出 DjangoSECRET_KEY/DEBUG、Springserver.ssl.*等框架键从languages推出ENV.fetch、System.getProperty(k, d)、${VAR:-default}等语言惯用法从deploy_manifests推出 HCL 的default 、values.yaml字面量、Dockerfile 的ENV行等配置形态的 bug。种子与派生模式分开汇报seed_patterns_run/derived_patterns。任何derived_patterns为空的 sweep 只搜了通用惯用法会被点名记为一个覆盖率缺口coverage gap——这类代码库可能根本不使用任何种子模式。此外种子模式被强制要求是POSIX ERE必须用[[:space:]]和[0-9]严禁\s、\d、\b。原因记载在 tests/seed-coverage.js 的检查逻辑里某些grep构建会对这些简写静默匹配失败而一个匹配不到任何东西的模式与一次干净的结果在外观上完全无法区分。八、三类文件的强制一致性与测试保障一个类别的定义散落在三处运行时没有任何机制能验证它们一致workflow 没有文件系统访问权读不了这两个文件因此一致性检查被前置到了测试里。tests/seed-coverage.js承担了这个职责README 中给出了运行方式node tests/harness.js workflows/audit.js node tests/harness.js workflows/audit.js --self-test node tests/seed-coverage.js .seed-coverage.js会校验workflows/audit.js 中的{ id, title }行、references/id.json、references/id.md三者一一对应孤儿文件与缺失文件都算错误.json的id/title与audit.js的类别行完全一致sweep prompt 用的是audit.js里的 title.md中每个 VULNERABLE 示例至少被本类别的一个种子模式匹配到。测试文件头注释记录了一段真实教训曾经 18 个文档化示例中有 8 个匹配不到任何种子包括 Python 中最常见的getenv(K, default)形态——而因为「匹配不到任何东西」与「仓库干净」返回相同结果这种漂移在运行时根本不会被发现种子模式不使用\s/\d/\b用grep -E而非 JS RegExp 做实际匹配模拟 Agent 运行grep -rE的方式每条语料都有**Report when:**与**Skip when:**规则行、有标题、有脆弱示例。这个测试的深意在于语料里的反例SECURE 示例是剔除误报的关键而一个匹配不到任何东西的模式会伪装成「零命中」。README 明确说「Seeds are a floor, not the search」种子只是下限。九、判定形状Configurable 与 UnconditionalREADME 用一个独立小节总结了候选的两种形态及其不同裁决方式这是理解整个验证逻辑的钥匙Configurable可配置带回退的配置查找。只有当应用真的带着它运行时才是 bug。env.get(K, x)会运行env[K]会崩溃所以后者没问题Unconditional无条件任何地方都没有配置代码原样即不安全约占全部发现的一半。「环境变量缺失」不是反驳这类候选的理由——无条件候选不存在「缺失的变量」可推理第五步部署是否提供变量也不适用于它因为没有任何部署层面的东西能缓解它。Verify prompt 中专门警告audit.js不要以「没有找到配置」为由反驳无条件候选也不要把它记录为trace incomplete。这正是该审计存在的意义之一——大约一半的发现根本没有任何配置回退。十、什么时候不该用这个命令README 明确列出了两条「不适配」场景帮助使用者判断工具边界Semgrep 或 linter 更合适时固定模式、无需回答可达性问题的场景用静态分析工具更省力需要大规模密钥检测时已提交的凭据检测应使用 gitleaks / trufflehog 这类专用工具。换言之/insecure-defaults:audit的价值不在于「找出所有硬编码密钥」而在于把每个模式匹配逐条追踪到它影响的安全决策只报告那些「应用真的会带着它运行」的默认配置缺陷。结语从 commands/audit.md 这份命令契约出发可以看到insecure-defaults插件的完整设计哲学命令层用三步固定流程保证「先验语料、再跑流水线、按状态收尾」杜绝把失败当干净流水线层audit.js用「扫描不裁决、验证默认反驳」的四阶段分工与category:file:line去重把模式匹配与安全裁决彻底分离语料层references/下六个类目的 md/json 对以「Report when / Skip when」二元规则加上成对示例为每一条裁决提供可复用的判别标准测试层seed-coverage.js则在离线环境下锁死三类文件的对应关系与种子的 POSIX ERE 合规性。对安全研究者与 Claude Code 插件开发者而言这不仅是一个可用的审计命令更是一份「如何让 Agent 输出可信安全结论」的高质量参考实现。赞分享AI 技能AI 插件应用安全网络安全AI 评测【免费下载链接】skillsTrail of Bits Claude Code skills for security research, vulnerability detection, and audit workflows项目地址https://gitcode.com/gh_mirrors/skills8/skills点击查看免费下载相关推荐Claude Code 的 /auto-mode-setup 命令提案与审核应用双阶段工作流的数据契约详解Claude Code 的 /auto mode setup 命令提案与审核应用双阶段工作流的数据契约详解 /auto mode setup 是 Claude文档提示工程人工智能VS Code 接入 NuGet MCP Serverdnx 命令、mcp.json 配置与 VS Code 源码级实现解析VS Code 接入 NuGet MCP Serverdnx 命令、mcp.json 配置与 VS Code 源码级实现解析 本文以 VS Code 仓库中开发工具代码编辑器基于 Claude Code 的差分安全审查深入解析 differential-review 命令与 Phases 0-6 审查流程基于 Claude Code 的差分安全审查深入解析 differential review 命令与 Phases 0 6 审查流程 导读 本文是 TraiAI 技能AI 插件应用安全网络安全AI 评测上一篇3dsconv完整指南如何快速把.3ds游戏转成CIA格式并成功安装下一篇3dsconv 手把手使用教程5分钟把 .3ds 游戏转成可安装的 CIA 文件创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考