把种子库变成 CodeQL/Semgrep 分析结果的“精准制导系统”。种子驱动 · 路径事实为本 · AST+SSA 数据流追踪 · P0 路径敏感 · P1 MVC 上下文敏感 · RL 反馈闭环 · Headless 浏览器验证
目录
- 1. 这是什么
- 2. V4 系统架构(10 阶段深度闭环流水线)
- 3. V4 核心技术
- 4. 快速开始
- 5. 靶场测试结果
- 6. 种子格式
- 配置说明
- 安全声明与合法使用
- 技术栈
TL;DR
- ChainForge:种子驱动的自动化漏洞发现与验证工具
- 10 阶段流水线:从侦察指纹到报告生成全自动闭环
- P0 Z3 路径敏感:约束求解过滤不可达路径,降低误报
- P1 MVC-k=3:跨 Controller→Service→DAO 三层追踪
- RL 反馈闭环:验证失败自动变异 Payload 并重试
- 靶场成绩:4 语言 64/64 漏洞点 100% 通过
1. 这是什么
ChainForge 是一款面向白帽安全研究者的自动化漏洞发现与验证工具。它将结构化的漏洞种子库与 CodeQL/Semgrep 的 AST+SSA 静态分析能力结合,实现从源码到可利用 PoC 的全自动流水线,最终通过动态 HTTP 请求确认漏洞可利用性。
V4 核心能力:给定目标源码 → 自动完成 10 阶段深度分析 → P0 路径敏感可达性验证 → P1 MVC-k=3 跨层数据流追踪 → RL 策略 Payload 生成 → 反馈闭环动态验证 → 输出带证据的漏洞报告。
设计原则:
- 种子驱动:所有分析逻辑和 Payload 生成源于种子的解析
- 路径事实为本:只信任 CodeQL/Semgrep 基于 AST+SSA 提取的代码路径
- 模块化:每个组件独立,可单独替换或升级
- 闭环驱动:验证失败自动变异 Payload 并重试,非开环线性
2. V4 系统架构(10 阶段深度闭环流水线)
Stage 1: 侦察指纹识别 (recon) → WAF 类型 + 框架指纹 + 技术栈 Stage 2: 种子解析 + 知识图谱增强 → seeds_db.json (50+ 种子 × 4 语言) Stage 3: 优化查询生成 (query_gen) → CodeQL .ql + P1 MVC-k=3 taint steps Stage 4: CodeQL 扫描 / Semgrep P1 降级 → SARIF 路径 + P1 精准确认 (12 条规则) Stage 5: CodeQL 深度分析 (deep_analyzer) → flow_steps 增强 + in_branch 标记 Stage 6: 符号约束匹配 (Z3 + 知识图谱) → P0 路径敏感可达性 + sanitizer 过滤 Stage 7: RL 策略 Payload 生成 → 种子模板填充 + Z3 约束求解示例输入 Stage 8: 反馈闭环 RL 验证 → 验证→失败分析→变异→再验证 (Headless 分流) Stage 9: 知识进化 + 报告生成 → 种子自学习 + Markdown 漏洞报告flowchart TD S1["Stage 1 侦察指纹识别"] --> S2["Stage 2 种子解析 + 知识图谱增强"] S2 --> S3["Stage 3 优化查询生成"] S3 --> S4["Stage 4 CodeQL 扫描 / Semgrep P1 降级"] S4 --> S5["Stage 5 CodeQL 深度分析"] S5 --> S6["Stage 6 符号约束匹配 Z3 + 知识图谱"] S6 --> S7["Stage 7 RL 策略 Payload 生成"] S7 --> S8["Stage 8 反馈闭环 RL 验证"] S8 -->|验证失败 且 轮数小于 max_rounds| S7 S8 -->|验证成功 或 达到最大轮数| S9["Stage 9 知识进化 + 报告生成"] S9 --> OUT["Markdown 漏洞报告 + 种子自学习"]图注:Stage 1 输入目标 URL,输出 WAF 与框架指纹;Stage 2 输入种子库,输出 seeds_db.json;Stage 3 输出 CodeQL 查询与 P1 taint 规则;Stage 4 输出 SARIF 路径;Stage 5 输出带 in_branch 标记的 flow_steps;Stage 6 输出 P0 可达性结论;Stage 7 输出候选 Payload;Stage 8 输出验证结果,失败则回退 Stage 7 变异重试;Stage 9 汇总证据生成报告。
V4 新增核心模块
| 模块 | 文件 | 职责 |
|---|---|---|
| V4 主控制器 | src/orchestrator_v4.py | 10 阶段深度闭环流水线编排 |
| 符号执行引擎 | src/symbolic_executor.py | Z3 约束求解,路径条件提取与可达性分析(5 秒超时降级) |
| CodeQL 深度分析 | src/codeql_deep_analyzer.py | P1 MVC-k=3 taint step 注入 + SARIF 后处理 |
| RL 反馈闭环 | src/feedback_loop.py | 验证→失败分析→26+ 策略变异→再验证(16 漏洞快速通道全覆盖) |
| Headless 验证器 | src/verifier_headless.py | Playwright 浏览器验证 DOM XSS/CSRF/CORS |
| 侦察指纹 | src/recon.py | 300+ 指纹特征(10 WAF + 20 框架) |
| P1 Semgrep 规则 | rules/p1_mvc/*.yaml | 4 语言 × 16 漏洞 = 64 条 MVC-k=3 跨层规则(5 P0 + 3 P1 + 8 原漏洞) |
| 快速验证通道 | src/verifier_v2.py | 16 漏洞专用验证器(5 P0 NoSQL/Deserial/Upload/Unauth/InfoLeak + 3 P1 SSTI/Redirect/Code + 8 原漏洞) |
| 靶场 Mock 服务 | mvc-targets/*/app_mock.py | 4 靶场 × 16 漏洞 = 64 个完整漏洞模拟环境(NoSQL/Deserial/Upload/Unauth/InfoLeak/SSTI/Redirect/Code + 8 原) |
3. V4 核心技术
P0:路径敏感分析(Z3 约束求解)
传统数据流分析不区分条件分支,会产生大量不可达路径导致误报。V4 引入 Z3 SMT 求解器:
flow_steps 中 in_branch=True 的步骤 → 提取 if/switch/ternary 条件表达式 → Z3 求解是否存在输入满足所有分支条件 → 无解(unsat) → sink 不可达 → 降分 40 → 有解(sat) → 记录示例输入,供 Payload 生成用效果:自动过滤不可达路径,大幅降低误报率。
P1:MVC 上下文敏感 k=3
支持跨 Controller→Service→DAO/Sink 三层数据流追踪,Semgrep 精准规则覆盖 4 种语言 × 16 漏洞类型(5 P0 + 3 P1 + 8 原)。
RL 反馈闭环验证
验证失败 → 分析原因(payload_invalid / 无响应 / 特征不匹配) → 26+ 变异策略(编码/截断/嵌套/大小写/注释/分隔符...) → 重新发送验证 → 最多 2 轮(可配置) → 成功则记录 confirmed_by=rl_mutation4. 快速开始
环境要求
- Python >= 3.9
- Node.js >= 16(运行靶场用)
- CodeQL CLI 2.19+(代码分析引擎,可选)
- Semgrep(P1 MVC-k=3 降级引擎,必装)
- Z3 Solver(
pip install z3-solver,P0 路径敏感分析)
安装
git clone https://gitee.com/nights-shadow/ChainForge.git chainforge cd chainforge pip install -r requirements.txt 安装 Semgrep(必装) pip install semgrep 安装 Z3 Solver(P0 路径敏感分析) pip install z3-solver 安装 CodeQL CLI(可选,JS/Java/Python 可用 CodeQL,PHP 用 Semgrep) 下载地址: https://github.com/github/codeql-cli-binaries/releases 安装 Playwright(Headless 验证,可选) pip install playwright && playwright install chromiumWeb UI 可视化界面(推荐)
# 启动 Web UI(默认 http://127.0.0.1:5000) python cli.py web 自定义端口和主机 python cli.py web --port 8080 --host 0.0.0.0一键运行(V4 全流程)
# V4 完整 10 阶段流水线(含 P0 路径敏感 + P1 MVC-k=3 + RL 反馈闭环) python3 -m src.orchestrator_v4 \ --target /path/to/source-code \ --lang javascript \ --url http://127.0.0.1:3000 \ --max-rounds 2 跳过 CodeQL(直接用 Semgrep P1 引擎,适合 PHP 或快速扫描) python3 -m src.orchestrator_v4 --target /path/to/source-code --lang javascript --url http://127.0.0.1:3000 --max-rounds 2 --skip-codeql实战演示:以 js-nest-mvc 靶场为例
下面以js-nest-mvc靶场(端口 3000)为例,完整跑一次 V4 流水线。先启动靶场,再执行主流程:
# 终端 1:启动 js-nest-mvc 靶场 cd mvc-targets/js-nest-mvc && npm install && node app.js # [mock] js-nest-mvc listening on http://127.0.0.1:3000 终端 2:执行 V4 完整 10 阶段流水线 python3 -m src.orchestrator_v4 --target ./mvc-targets/js-nest-mvc --lang javascript --url http://127.0.0.1:3000 --max-rounds 2关键输出日志(各阶段摘要行):
[Stage 1] recon → framework=NestJS, waf=none, tech=Node.js/Express-like [Stage 2] seeds → loaded 52 seeds, matched 16 for javascript [Stage 3] query_gen → generated 16 CodeQL queries + 16 P1 MVC-k=3 taint rules [Stage 4] codeql → SARIF paths=41, P1 confirmed=16 (rules hit 12/12) [Stage 5] deep_analyze → flow_steps=41, in_branch marked=23 [Stage 6] z3 → sat=31, unsat=10 (unreachable filtered, score -40) [Stage 7] payload_gen → candidates=31, with z3 sample input=18 [Stage 8] feedback → round1 confirmed=13/31, round2 mutated=18 → confirmed=18/18 [Stage 9] report → confirmed=31, report=reports/js-nest-mvc.md, seeds_evolved=6如何从输出中定位关键结论:
- P0 可达性:看
[Stage 6] z3行的sat与unsat计数,unsat即被 Z3 判定为不可达、已降分 40 的路径,sat才是进入 Payload 生成的有效路径。 - RL 变异成功:看
[Stage 8] feedback行的round2 mutated与confirmed,若第二轮确认数大于第一轮,说明变异策略生效;报告中对应条目会带confirmed_by=rl_mutation。 - 最终结果:
[Stage 9] report行的confirmed为最终确认漏洞数,明细见reports/js-nest-mvc.md。
支持的语言参数
--lang javascript # Node.js Express/Koa/Nest --lang python # Flask/Django --lang php # Laravel/原生 PHP --lang java # Spring Boot5. 靶场测试结果
4 个 MVC 靶场 × 16 漏洞类型 = 64 个已知漏洞点,100% 通过!
| 靶场 | 语言 | 端口 | Verifier 直测 | Feedback 闭环 |
|---|---|---|---|---|
| js-nest-mvc | JavaScript | 3000 | 16/16 100% | 8/8 100% |
| py-flask-mvc | Python | 5000 | 16/16 100% | 8/8 100% |
| php-laravel-mvc | PHP | 8000 | 16/16 100% | 8/8 100% |
| java-spring-mvc | Java | 8080 | 16/16 100% | 8/8 100% |
| 合计 | 4 语言 | — | 64/64 100% | 32/32 100% |
6. 种子格式
每个种子是一个 JSON 文件,放在seeds/raw/目录下。V4 支持 50+ 种子覆盖 4 语言 12 漏洞类。
{ "seed_id": "SEED_JS_002", "title": "Node.js 命令注入:req.query.host → exec()", "vulnerability_type": "Command Injection", "source": { "type": "http", "pattern": "req.query|req.body|req.params" }, "sink": { "type": "function", "pattern": "exec|execSync|spawn|spawnSync" }, "phases": [ { "id": 1, "desc": "分号拼接执行 whoami", "command_template": "curl -sk '{URL}/ping?{PARAM}=127.0.0.1;whoami 2>&1 | head -5'", "success_jump": -1, "fail_jump": -1 } ], "pre_conditions": [], "waf_bypass": "bash 花括号展开绕过; 注释截断", "environment": "Linux+Node.js+Express" }配置说明
config.yaml关键配置项:
codeql: path: "codeql" language: "auto" query_suite: "security-extended" seeds: raw_dir: "seeds/raw" db_file: "seeds/parsed/seeds_db.json" feedback: max_rounds: 2 # RL 反馈闭环最大轮数 mutation_strategies: 26 # 变异策略数 p0: z3_enabled: true # P0 Z3 路径敏感分析开关 p1: mvc_k: 3 # P1 MVC 上下文敏感深度 semgrep_rules: "rules/p1_mvc/"安全声明与合法使用
本工具仅供授权的安全测试使用。使用者需确保:
- 仅对已获得书面授权的目标进行测试
- 遵守当地网络安全法律法规
- 不对未授权目标执行动态验证(发送 HTTP 请求)
- 发现漏洞后遵循负责任的披露流程
作者不对任何滥用本工具的行为承担责任。
技术栈
- CodeQL 2.19+— AST+SSA 静态分析引擎
- Semgrep— P1 MVC-k=3 跨层数据流追踪引擎
- Z3 Solver— P0 路径敏感分支可达性约束求解
- Playwright— Headless 浏览器前端漏洞验证
- Python 3.9+— 核心实现语言
- requests— 动态验证 HTTP 客户端
- Flask— Web UI
总结与后续规划
V4 把「种子驱动」的思路贯穿到静态分析与动态验证的每一个环节,核心能力可以概括为以下四点:
- 种子驱动:50+ 结构化种子覆盖 4 语言 12 漏洞类,分析逻辑与 Payload 生成全部源于种子解析,新增漏洞类型只需补种子。
- P0 路径敏感:引入 Z3 SMT 求解器对
in_branch条件求解,unsat路径直接降分 40,从源头过滤不可达路径带来的误报。 - P1 MVC-k=3:跨 Controller→Service→DAO/Sink 三层追踪,Semgrep 规则覆盖 4 语言 × 16 漏洞类型,弥补单层数据流分析的断链问题。
- RL 反馈闭环:验证失败后自动分析原因并执行 26+ 变异策略重试,最多 2 轮,成功条目记录
confirmed_by=rl_mutation。
在 4 个 MVC 靶场 × 16 漏洞类型的验证中,Verifier 直测与 Feedback 闭环均取得64/64 100%的通过率,说明「静态定位 + 路径敏感 + 闭环验证」这条链路是可行的。
后续规划方向:
- 扩展漏洞类型:在现有 16 类基础上补充 SSRF、XXE、原型链污染、JWT 越权等场景,同步扩充种子库与 P1 规则集。
- 支持更多语言与框架:优先补齐 Go(Gin/Echo)、C#(ASP.NET Core)、Ruby on Rails 的 MVC-k=3 规则与靶场环境。
- 接入 CI/CD:提供 GitHub Actions / GitLab CI 模板与 SARIF 输出,让流水线在每次提交时自动跑 P0/P1 分析,并把确认结果回写为代码扫描告警。