ryanda9910/patdown

GitHub: ryanda9910/patdown

patdown 是一个 AI 编码代理安全审计技能,在代码提交前自动对 diff 进行安全检查并修复常见漏洞。

Stars: 0 | Forks: 0

patdown

patdown

在代码提交前对 diff 进行安全搜身。

🇺🇸 English · 🇮🇩 Bahasa Indonesia · 🇨🇳 简体中文

license skill harness install

patdown demo

为你的编码 agent 准备的技能(Claude Code — 也支持 Codex、Cursor、Gemini CLI、opencode 以及任何能读取规则文件的工具)。就在 agent 宣布任务**完成**之前,它会**对自己的 diff 进行安全搜身**,检查安全漏洞 —— 包括机密信息、注入、SSRF、损坏的 authz、路径遍历、不安全的 `eval`、弱加密 —— 修复其中安全的部分,将剩余的提交给你处理,并且**在存在未解决的真实漏洞时绝不签字确认。** AI 现在编写了大量代码。其中很多带着漏洞被发布出去。编写代码的 agent 是捕获这些漏洞成本最低的地方 —— 在代码审查之前,在 CI 之前,在攻击者发现之前。 ## 前后对比 **没有 patdown** —— agent 写完代码就继续下一步了: ``` const stripe = new Stripe("sk_live_51H8xQ2eZ..."); // hardcoded live key const res = await fetch(req.query.callbackUrl); // SSRF db.query("SELECT * FROM orders WHERE id=" + req.params.id); // SQL injection ``` **使用 patdown** —— 它会先对 diff 进行安全搜身: ``` patdown — 1 changed file ✗ critical payments.ts:1 hardcoded Stripe live key → moved to STRIPE_SECRET env [fixed] ✗ high payments.ts:2 SSRF: user callbackUrl fetched → added public-host allow-list [fixed] ⚠ high payments.ts:3 SQL injection on `id` — needs a parameterized query [escalated] ✓ rest clean (authz, paths, crypto) 1 issue needs your call before this is done. ``` 同样的代码。漏洞不会被带到线上。 ## 真实运行 这不是演示。这些是在植入漏洞的代码上**在 Claude Code 中实际运行 patdown 的结果**: - **案例 1 —— 支付:** 捕获了一个硬编码的 Stripe *live* key(严重)、一个 SSRF 和一个 SQL 注入 —— 并且注意到该密钥*已经存在于 git 历史记录中*,因此它告诉你需要轮换密钥,而不仅仅是移动它。 - **案例 2 —— 认证助手:** 八行代码中包含了四类漏洞 —— 路径遍历、使用 `Math.random()` 生成的重置 token、一个 IDOR(看起来像普通的数据库调用)以及一个 MD5 密码哈希。秘密扫描器无法捕获其中的任何一个。 完整的 diff 和逐字报告在 **[CASES.md](CASES.md)** 中。复现步骤:安装该技能,进行更改,运行 `/patdown`。 ## 安装 ``` # macOS / Linux / WSL curl -fsSL https://raw.githubusercontent.com/ryanda9910/patdown/main/install.sh | bash # Windows (PowerShell) irm https://raw.githubusercontent.com/ryanda9910/patdown/main/install.ps1 | iex ``` 查找你拥有的每一个编码 agent,并将该技能安装到每一个 agent 中。大约需要 10 秒钟,可以安全地重新运行。添加 `--project` 也可以将其安装到当前仓库的 `.claude/` 目录中。无需密钥,无需账号,无依赖。 手动安装:将 [`skill/SKILL.md`](skill/SKILL.md) 复制到你 agent 的 skills/rules 目录中(Claude Code:`~/.claude/skills/patdown/SKILL.md`)。 ## 它会检查哪些内容 ``` ┌──────────────────────────────────────────────────────────┐ │ SECRETS api keys · tokens · creds in code/logs │ │ INJECTION sql · shell · template/xss · eval · deser │ │ SSRF user-controlled urls · metadata · redirects │ │ AUTHZ missing owner check · idor · open routes │ │ PATHS traversal · zip-slip · symlink follow │ │ CRYPTO weak rng/hash · disabled tls · == on tokens │ │ DOS unbounded input · no timeouts · redos │ │ LLM/AI-APP prompt injection · model output → eval/sql │ └──────────────────────────────────────────────────────────┘ ``` 它**仅审计 diff** —— 即更改的行 —— 因此它能保持快速运行,并且不会对整个仓库喋喋不休。 ## 工作原理 它是一个技能(纯指令说明),而不是一个扫描器二进制文件 —— 因此它能在上下文中理解代码,而不是仅仅进行模式匹配。 1. 你完成了一项编码任务。在 agent 报告“完成”之前,该技能会介入(或者你运行 `/patdown`)。 2. 它读取 diff 并针对更改的行运行检查清单。 3. **安全、机械性的修复它会自行应用** —— 参数化查询、将机密信息移至 env、添加白名单、替换弱哈希。 4. **任何涉及意图的改动它都会提交给你** —— 批准、修复或跳过。 5. 如果存在未解决的严重/高危问题,它**不会**宣布任务完成。 没有误报垃圾信息:干净的代码行不会被标记。如果 diff 是干净的,它会用一行文字说明,然后不去打扰你。 ## 支持工具 Claude Code(原生技能),以及任何加载规则/技能文件的 agent —— **Codex、Cursor、Gemini CLI、opencode、Aider、GitHub Copilot CLI** 等。 安装程序会将其放入它发现的每一个 agent 中。 ## 文档 完整文档见 **[docs/](docs/)**: - **[用法](docs/usage.md)** —— 触发方式、`/patdown`、报告格式、硬性规则 - **[检查清单参考](docs/checklist.md)** —— 每个类别、示例、严重性模型 - **[安装](docs/install.md)** —— 每个 agent、全局与项目级对比、手动安装、卸载 - **[自定义](docs/customizing.md)** —— 编辑检查项、严重性门槛、范围、语言 - **[常见问题](docs/faq.md)** —— 对比 SAST/linters/CI、速度、隐私、语言 - **[真实运行](CASES.md)** · **[贡献](CONTRIBUTING.md)** · **[安全](SECURITY.md)** ## 为什么是技能,而不是 CI 扫描器 CI 在你推送代码后才会捕获它。Linter 只会进行模式匹配,并且会漏掉逻辑漏洞(IDOR 看起来就像普通的数据库调用)。patdown 寄生在刚刚编写代码的 agent 内部 —— 它拥有完整的意图和 diff,并在原地进行修复。 将它与你的扫描程序**配合**使用,而不是替代它。 ## 许可证 MIT。随意搜身。
标签:AI合规, AI编程助手, Cutter, 安全检查, 漏洞防御, 错误基检测, 防御加固, 静态代码分析