Laucked-Security/claude-oswe

GitHub: Laucked-Security/claude-oswe

一款 Claude Code 白盒安全审计插件,通过追踪 source→sink 数据流链并独立验证,自动发现和报告 Web 应用中可导致未授权 RCE 的高危漏洞链。

Stars: 1 | Forks: 0

# 🛡️ claude-oswe ### Claude Code 的白盒安全审计插件 **[Laucked Security](https://github.com/Laucked-Security) 项目** [![ci](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/4ef29b7670031532.svg)](https://github.com/Laucked-Security/claude-oswe/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE) ![Tests: 120 passing](https://img.shields.io/badge/tests-120%20passing-brightgreen) ![Node ≥ 20](https://img.shields.io/badge/node-%E2%89%A520-339933?logo=node.js&logoColor=white) ![Stacks: PHP · Node · Python · Java · .NET](https://img.shields.io/badge/stacks-PHP%20%C2%B7%20Node%20%C2%B7%20Python%20%C2%B7%20Java%20%C2%B7%20.NET-blue) ![Claude Code plugin](https://img.shields.io/badge/Claude%20Code-plugin-d97757)
**从你的编辑器中运行深度的、OSWE 风格的白盒 Web 应用安全审计。** 在你有权测试的 repo 中输入 `/oswe:audit`;该插件会追踪从 **source → sink** 的攻击者输入,将发现的问题链接以实现 **未经身份验证的 RCE**,在证明合约下**验证**每个链,并撰写一份有证据支撑的报告(Markdown **+** 一份独立完整的可视化 HTML 报告,你可以将其保存为 PDF)。 ## 它解决的问题 询问 LLM “这段代码中有漏洞吗?”会给你一堵充满自信但全是不确定性的墙:对安全代码的误报,没有漏洞利用链,没有证明,没有可复现性。那是噪音,而不是审计。`oswe` 的构建初衷就是**不这样做**: - **关键之处的确定性。** 严重性、去重以及“这是否是一个严重的未授权 RCE?”的决策**不**依赖于模型——它们在经过测试的、无依赖的 Node 辅助函数中运行,并有 **120 个单元测试**。模型负责*发现*;辅助函数负责*决策*。 - **会反驳的验证器。** 每个候选链和高严重性发现都会被独立的验证器重新检查,该验证器可以**降级或拒绝**——它不会盲目给分析器盖章。 - **基于 Schema 的 I/O。** 每个 agent 的响应在被信任之前,都会根据 JSON Schema 进行验证;格式错误的响应会被拒绝并重新运行,绝不会静默地用于捏造数据。 - **低噪音,经得起检验。** 在干净、真实的 [Flask 教程](docs/examples/python-safe.md)中,它报告了 **0 个可利用的发现**。在真实的易受攻击代码(OWASP NodeGoat)上,它找到并验证了一个真实的 RCE 链。请参阅[在真实代码上得到验证](#proven-on-real-code)。 这是一个用于发现和修复 Bug 的 **OSWE 风格审计助手**——**不是**渗透测试,也不是安全保证。请参阅[诚实的局限性](#honest-limits)。 ## 安装 要求 **Node.js ≥ 20**(验证器和测试以此为目标;如果没有它,审计会提前中止)。 ``` # 使用从本地 checkout 加载的 plugin 运行 Claude Code: git clone https://github.com/Laucked-Security/claude-oswe.git claude --plugin-dir ./claude-oswe ``` 就这样——*使用*它不需要 `npm install`。运行时验证器作为一个独立完整、零依赖的文件被提交(AJV 是一个仅用于**开发**的工具,用于重新生成它们)。 ## 用法 ``` /oswe:audit # audit the whole project /oswe:audit src/api # restrict to a sub-path (kept inside the project root) ``` 审计**绝不自动运行**(`disable-model-invocation: true`)——它仅在明确的命令触发时运行。带有时间戳的报告会被写入 `.oswe/reports/oswe-report-YYYY-MM-DD-HHMM.{md,html}`。 ### 运行示例(已精简) ``` /oswe:audit test-fixtures/python/vulnerable Verdict: unauthenticated RCE — Critical (strong static proof) CHAIN-1 POST /login { "is_admin": true } → session["admin"] mass-assignment (OSWE-1) └─► /render?tpl={{ … }} → Jinja2 SSTI via render_template_string (OSWE-2) → RCE entry: unauthenticated · 2 transitions, both accepted Findings: 2 High (accepted) · Coverage: 2/2 partitions · no gaps Report: .oswe/reports/oswe-report-2026-06-16-1600.md (+ .html) ``` 📄 **完整的报告示例**(真实输出,公开的测试固件,无秘密信息):[`docs/examples/`](docs/examples/) — [Python](docs/examples/python-vulnerable.md) · [Java](docs/examples/java-vulnerable.md) · [.NET](docs/examples/dotnet-vulnerable.md) · [一个干净的“安全”运行结果](docs/examples/python-safe.md)。 ## 支持的技术栈 | 技术栈 | 框架 | 检测到的示例 sink 类 | |---|---|---| | **PHP** | Laravel, Symfony, vanilla | type-juggling/magic-hash 验证绕过、无限制上传、SQLi、命令注入、PHP 对象注入 | | **Node.js** | Express, Nest | NoSQL 操作符注入、SSJI (`eval`)、原型链污染、命令注入、SSRF | | **Python** | Flask, Django | SSTI (`render_template_string`)、`pickle`/`yaml.load` 反序列化、批量赋值、SQLi | | **Java** | Spring | SpEL/OGNL 注入、Java 反序列化 gadget 链、命令注入、XXE | | **.NET** | ASP.NET (Core & 经典版) | 伪造/未签名的 auth cookie、`BinaryFormatter` 反序列化、命令注入、XXE | 每个技术栈在 [`skills/audit/references/`](skills/audit/references/) 下都有一个精选的 source→sink 参考。多语言 repo 会加载所有相关的参考,并按技术栈对审计进行划分。 ## 工作原理 ``` recon → partition (by module / framework / auth boundary) → analyze (parallel read-only oswe-analyzer subagents, max 4) → aggregate/dedupe (deterministic Node helper, stable OSWE-N ids) → build chains → verify (independent oswe-verifier, bound batches) → apply verdicts (deterministic Critical gating) → report (.md + .html) ``` - **只读 agent。** 分析器/验证器子 agent 无法修改你的代码。 - **受限范围。** 路径参数由经过测试的约束辅助函数进行规范化,该函数会拒绝任何逃离项目根目录的内容(`../`、符号链接、兄弟前缀欺骗)。 - **关键性门控。** 只有当验证器端到端接受该链、每个成员发现都被接受、入口是 `unauthenticated`(未授权)且影响是 `unauth-rce`(未授权 RCE)时,该链才是 `Critical`(严重)的。 - **秘密永远不会外泄。** 发现的秘密值会被 `[REDACTED]`(脱敏);仅引用 `file:line`。中间的 `.oswe/tmp/` 文件会在开始、结束或任何中止时被清除。 七个 JSON Schema 位于 [`skills/audit/schemas/`](skills/audit/schemas/);确定性辅助函数及其测试位于 [`skills/audit/scripts/`](skills/audit/scripts/)。 ## 在真实代码上得到验证 针对 [OWASP NodeGoat](https://github.com/OWASP/NodeGoat) 运行——这是一个真实的多模块 Express + MongoDB 应用,而不是玩具固件——`/oswe:audit` 找到并**验证**了一条端到端的 RCE 链: ``` Verdict: effectively-unauthenticated RCE — Critical (strong static proof) CHAIN-1 POST /signup (open self-registration → instant authenticated session) └─► eval(req.body.preTax) on POST /contributions → server-side RCE 24 findings across 6 partitions · 7 High accepted ``` 是什么让这个结果值得信赖而不是噪音: - **验证器降级了 4 个过于激进的 `High`(高危)发现**(例如,一个被 `marked sanitize:true` 中和的“存储型 XSS”),而不是接受它们; - **schema 网关拒绝了一个格式错误的分析器响应**,并重新运行了该分区一次——没有为了填补空白而捏造数据; - 标题链被报告为**“实际上是未经验证的”**,并说明了开放注册的注意事项,没有夸大其词。 对照控制组:针对干净的 [Flask 教程 `flaskr`](docs/examples/python-safe.md),同一个 pipeline 报告了 **0 个可利用的发现**(一个 Info 级别的安全加固建议,没有被夸大)。在真实的易受攻击代码上找到真实的链;在干净的代码上保持安静。 ## 诚实的局限性 - **OSWE 风格的助手,而不是渗透测试。** 这是**静态**白盒源代码分析。“已验证”= **强有力的静态证明**(在证明合约下的 source→sink),**而不是**在运行的目标上发起的实时漏洞利用。没有动态执行、模糊测试或运行时确认。 - **“没有通往 RCE 的路径” ≠ 安全。** 它的意思是*在分析的覆盖范围内没有发现*。预算受限的分区、不支持的技术栈和跳过的路径会在每份报告的**Coverage(覆盖范围)**部分列出——请仔细阅读。 - **验证器同样具有模型的盲点。** 它是通过严格的合约进行的独立验证,而不是绝对真相。在采取行动之前确认发现;自行对 `not-requested`(未请求)的项目进行分类。 - **范围/规模受限。** 每次审计最多 12 个分区;超大型 monorepo 会出现覆盖盲区(会被报告,绝不隐藏)。依赖/gadget 分析按需读取,并非详尽无遗。 - **五种技术栈**,每种都有一个精选的参考页面——广泛的 sink 覆盖,而不是详尽无遗的 SAST 规则集。请将输出视为**带有证据的高质量线索**,交由工程师进行确认和修复。 ## 开发 运行时验证器 [`skills/audit/scripts/validators.mjs`](skills/audit/scripts/validators.mjs) 是一个**独立、零运行时依赖**的 ESM 文件(AJV 生成的验证器内联了一个运行时辅助函数)。运行测试套件(仅限 Node ≥ 20,无需安装): ``` ( cd skills/audit/scripts && node --test ) # 120 tests node .github/scripts/check-structure.mjs # stacks / references / fixtures-markers gate ``` 在更改任何 schema 后重新生成 `validators.mjs`(AJV 仅用于开发,仅用于生成): ``` ( cd skills/audit/scripts && npm install && npm run build && node --test ) ``` **CI** ([`.github/workflows/ci.yml`](.github/workflows/ci.yml)) 在 Node 20 和 22 上运行单元测试,运行结构网关,并验证已提交的 `validators.mjs` 与 schema 同步。`claude plugin validate . --strict` 作为发布前的**本地门禁**运行(它需要 Claude Code CLI,而这在 CI 运行器上不可用)。 ## 授权与道德 仅出于**防御性**目的,对您拥有或被允许测试的代码进行**已授权**的白盒审查。**切勿**审计不受信任、带有敌意或未经授权的仓库。敌意仓库的注释和字符串会被视为不受信任的数据,绝不会被当作指令执行。有关完整的使用规范以及如何报告插件本身的漏洞,请参阅 [SECURITY.md](SECURITY.md)。 ## License [MIT](LICENSE) © 2026 [Laucked](https://github.com/Laucked-Security)
标签:JS文件枚举, MITM代理, 代码安全, 多人体追踪, 大语言模型插件, 安全审计报告, 对称加密, 漏洞枚举, 白盒代码审计, 自动化审计, 自定义脚本, 逆向工具