gisstw/refine-mcp

GitHub: gisstw/refine-mcp

基于tree-sitter事实提取与LLM红蓝队对抗分析的代码漏洞发现工具,通过MCP协议编排多Agent协作完成从结构化代码分析到漏洞验证的闭环。

Stars: 0 | Forks: 0

English | [繁體中文](README_zh-TW.md) # refine-mcp **别再让 AI 瞎猜 Bug 了 —— 让它基于结构化事实进行推理。** Tree-sitter 从你的代码中提取事实(事务、锁、变更操作、catch 块)。LLM 红队(Red Team)基于这些事实进行推理,以发现真实的漏洞。蓝队(Blue Team)进行交叉分析并过滤误报。所有这些都通过 [Model Context Protocol](https://modelcontextprotocol.io/) 进行编排。 ## 工作原理 ``` Source Code LLM Red Teams (2-4) │ │ ▼ ▼ ┌─────────────┐ fact tables ┌───────────────┐ raw findings │ tree-sitter │──────────────▶│ RT-A RT-B │─────────────┐ │ extractor │ │ RT-C RT-D │ │ └─────────────┘ └───────────────┘ │ ▼ Plan File ─────────────────────────────────────▶ ┌─────────────────┐ │ Synthesize │ │ dedup + validate │ │ + rank + score │ └────────┬────────┘ │ ▼ ┌─────────────────┐ │ Blue Team │ │ cross-analysis + │ │ false positive │ └────────┬────────┘ │ ▼ Final Report ``` **核心洞察**:LLM 擅长对代码进行*推理*,但*阅读*代码的成本很高。Tree-sitter 负责读取代码(免费、100% 准确),然后 LLM 仅需针对结构化事实进行推理(输入少、输出聚焦)。这使红队的 Token 消耗减少了约 66%,蓝队减少了约 80%。 ## 为什么选择这种方法? 大多数 AI 代码审查工具(CodeRabbit、Sourcery 等)将代码视为散文 —— 将原始 diff 喂给 LLM 并指望它发现问题。这会导致幻觉、遗漏并发 Bug 以及浪费 Token。 **refine-mcp 走了一条不同的路:** | 方面 | 传统 AI 审查 | refine-mcp | |--------|----------------------|------------| | LLM 输入 | 原始代码 / diff(数千行) | 结构化事实表(事务、锁、变更操作、catch 块) | | 分析依据 | “阅读并猜测” | 基于 AST 提取的事实 | | 并发 Bug | 经常遗漏(需要多步推理) | 拥有锁/事务事实的专用 RT-B 团队 | | 误报 | 高(无过滤) | 蓝队交叉分析 + 持久化状态跟踪 | | Token 成本 | 约 100% 的代码作为输入 | 约 34%(红队)/ 约 20%(蓝队) | | 多轮跟踪 | 无 | `.state.json` —— 已修复/误报的发现不会重复出现 | ### 智能红队调度 红队不会盲目地投入到代码中。每个团队都有一个针对特定漏洞类的**专用 Prompt 模板**,并且团队会**基于事实信号动态激活**: ``` Facts extracted by tree-sitter │ ├─ Mutations without transaction? ──────► Activate RT-C (data integrity) ├─ External calls inside transaction? ──► Activate RT-C ├─ Auth/permission in file paths? ──────► Activate RT-D (auth boundary) └─ Always ──────────────────────────────► RT-A (single-op) + RT-B (multi-op) ``` 这意味着调度决策本身零 LLM 成本 —— tree-sitter 事实驱动路由。 当省略 `red_count` 时,`prepare_attack` 会返回一个 `dispatch` 字段,解释**为什么**每个团队被激活或跳过: ``` { "dispatch": { "activated": ["RtA", "RtB", "RtC"], "reasoning": [ "RT-A (single-op): always active", "RT-B (multi-op): always active", "RT-C (data integrity): 3 mutations without transaction in PaymentService.php::transferFunds", "RT-D (auth boundary): skipped (no signals)" ] } } ``` ### 两个正交维度 1. **红队角色** = *攻击什么*(Prompt 模板专业化) 2. **模式** = *模型有多智能*(opus/sonnet/haiku) 这两者是独立的。你可以使用 haiku 运行 RT-A 到 RT-D 进行快速筛选,或者使用 opus 进行深度分析。 ## 支持的语言 | 语言 | 提取器 | 语法 | |----------|-----------|---------| | PHP | `extract_php_facts` | tree-sitter-php 0.24 | | Rust | `extract_rust_facts` | tree-sitter-rust 0.23 | | TypeScript/JavaScript | `extract_ts_facts` | tree-sitter-typescript 0.23 | | Python | `extract_python_facts` | tree-sitter-python 0.23 | 每个提取器生成一个包含逐函数分析的 `FactTable`: - **Transactions(事务)** —— 数据库事务边界和 lock-for-update 用法 - **Locks(锁)** —— 并发锁(DB 锁、缓存锁、共享锁) - **Catch blocks(Catch 块)** —— 异常处理及动作分类(重抛、日志、静默吞掉) - **External calls(外部调用)** —— API/网络调用,尤其是事务内部的调用 - **State mutations(状态变更)** —— 带目标的 Create/Update/Delete 操作 - **Null risks(空值风险)** —— 潜在的空指针解引用 / unwrap / panic 点 - **Parameters(参数)** —— 带类型提示和可空性的函数参数 ## 安装 ### 从源码安装 ``` git clone https://github.com/gisstw/refine-mcp.git cd refine-mcp cargo build --release # 目标/release/refine-mcp 下的 Binary ``` ### 使用 cargo 安装 ``` cargo install refine-mcp ``` ## 快速开始 ### Claude Code MCP 配置 添加到你的 Claude Code MCP 设置中: ``` { "mcpServers": { "refine": { "command": "/path/to/refine-mcp" } } } ``` ### 基本工作流 典型的优化流程包含 5 个步骤(或使用组合工具为 4 步): ``` 1. discover_plan → Find plan file, extract file references 2. extract_facts → Run tree-sitter on referenced files 3. prepare_attack → Generate red team prompts from facts (run 2-4 LLM agents with the generated prompts) 4. synthesize_findings → Parse red team output, dedup, rank, generate blue prompt (run 1 LLM agent with the blue prompt) 5. finalize_refinement → Append findings to plan file ``` 或者使用 `discover_and_extract` 将步骤 1+2 合并为单次调用。 ## MCP 工具 ### discover_plan 查找最近修改的计划文件并提取源文件引用。 | 参数 | 类型 | 必需 | 描述 | |-----------|------|----------|-------------| | `plan_dir` | string | No | 要搜索的目录(默认:`.claude/plans/`) | ### extract_facts 在源文件上运行 tree-sitter 分析。 | 参数 | 类型 | 必需 | 描述 | |-----------|------|----------|-------------| | `file_paths` | string[] | Yes | 源文件的绝对路径 | | `diff_only` | bool | No | 如果为 true,仅分析 git 变更的文件 | ### discover_and_extract 在单次调用中合并发现 + 提取。 | 参数 | 类型 | 必需 | 描述 | |-----------|------|----------|-------------| | `plan_dir` | string | No | 要搜索的目录 | | `diff_only` | bool | No | 仅分析 git 变更的文件 | ### prepare_attack 根据计划内容和事实表生成红队 Prompt。 | 参数 | 类型 | 必需 | 描述 | |-----------|------|----------|-------------| | `plan_path` | string | Yes | 计划文件的路径 | | `facts_json` | string | Yes | 来自 extract_facts 的 JSON 编码事实表 | | `mode` | string | No | `default` (opus), `lite` (sonnet), 或 `auto` (haiku) | | `red_count` | u8 | No | 红队数量 (2-4)。如果省略,则根据事实自动选择 | ### synthesize_findings 解析红队 Markdown 输出,进行去重、验证、排名并生成蓝队 Prompt。 | 参数 | 类型 | 必需 | 描述 | |-----------|------|----------|-------------| | `raw_reports` | string[] | Yes | 来自每个红队 Agent 的原始 Markdown 输出 | | `plan_path` | string | No | 计划文件路径(用于持久化状态) | | `plan_summary` | string | No | 简短的计划摘要,用于蓝队上下文 | | `mode` | string | No | 蓝队模型推荐的成本模式 | ### finalize_refinement 备份计划文件并追加带有发现的优化部分。 | 参数 | 类型 | 必需 | 描述 | |-----------|------|----------|-------------| | `plan_path` | string | Yes | 要追加的计划文件 | | `blue_result` | string | No | 蓝队分析输出 | | `findings_json` | string | Yes | 来自 synthesize 的 JSON 编码发现 | | `mode` | string | No | 成本模式 | ### expand_blast_radius 搜索被修改函数的调用者以评估变更影响。 | 参数 | 类型 | 必需 | 描述 | |-----------|------|----------|-------------| | `symbols` | string[] | No | 要搜索的函数名。如果省略,则从 git diff 自动检测 | | `search_paths` | string[] | No | 要搜索的目录(默认:`["app/", "routes/"]`) | | `exclude_files` | string[] | No | 要从结果中排除的文件 | | `plan_files` | string[] | No | 用于自动检测变更符号的计划文件 | | `max_per_symbol` | number | No | 每个 symbol 的最大 grep 结果数(默认:20) | ### extract_migration_facts 从迁移文件中提取数据库架构以提供红队上下文。 | 参数 | 类型 | 必需 | 描述 | |-----------|------|----------|-------------| | `migration_dir` | string | No | 迁移路径(默认:`database/migrations`) | | `table_filter` | string[] | No | 仅包含匹配的表名 | ## 红队角色 | ID | 名称 | 聚焦点 | 自动选择时机 | |----|------|-------|--------------------| | RT-A | Single-Op | 静默失败、类型安全、幂等性 | 总是 | | RT-B | Multi-Op | 并发竞争、TOCTOU、行为变更 | 总是 | | RT-C | Data Integrity | Schema 漂移、约束违规、部分写入 | 无事务的变更操作、TX 中的外部调用、静默吞掉异常 | | RT-D | Auth Boundary | 权限检查、IDOR、权限提升 | 文件路径包含 auth/permission/middleware/login/session/guard/policy/role/access/token | 当从 `prepare_attack` 中省略 `red_count` 时,该工具会根据提取事实中的信号自动选择运行哪些红队。RT-A 和 RT-B 始终运行;仅当事实表明它们能发现真实问题时,才会添加 RT-C 和 RT-D。 ## 模式 | 模式 | 红队模型 | 蓝队模型 | 用例 | |------|---------------|-----------------|----------| | `default` | opus | opus | 最高准确率 | | `lite` | sonnet | sonnet | 成本与质量的良好平衡 | | `auto` | haiku | haiku | 快速筛选,成本最低 | ## 去重与评分 发现通过以下方式去重: - **相同文件 + 重叠的行范围** → 合并 - **相同文件 + 相似的标题**(≥85% Levenshtein 相似度) → 合并 影响分数 = `severity_weight × domain_weight / 10 + source_bonus` - 严重性:Fatal=100, High=60 - 领域权重:Payment/Billing (30) > Services (20) > Controllers (15) > Models (12) > Default (10) > Views (5) > Config/Test (3) - 来源加成:如果被多个红队确认,则 +20 ## 许可证 根据以下任一许可证授权 - Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE)) - MIT License ([LICENSE-MIT](LICENSE-MIT)) 由你选择。
标签:ASN解析, CISA项目, DevSecOps, DLL 劫持, IPv6支持, LLM, MCP, MS17-010, SQL查询, TLS抓取, Tree-sitter, Unmanaged PE, 上游代理, 事实提取, 代码推理, 可视化界面, 大语言模型, 对抗规划, 模型上下文协议, 自动化渗透测试, 误报过滤, 软件安全, 通知系统, 错误基检测, 防御框架, 静态代码分析