ThirdKeyAI/symbi-codered
GitHub: ThirdKeyAI/symbi-codered
一款受治理的 AI 源代码审计工具,结合多语言 SAST、污点分析与 LLM 推理,所有发现均需引用验证并生成可审计的证据链。
Stars: 2 | Forks: 0
# symbi-codered
**受治理的 AI 源代码审计工具。** 多语言 SAST + LLM 驱动推理 + 沙箱 PoC 验证 + 魔鬼代言人反驳,附带可审计的证据链。
生成 SARIF + Markdown + 签名的 `engagement-seed.json` 移交文件,供下游消费者(例如 [symbi-redteam](https://github.com/ThirdKeyAI/symbi-redteam))提取以驱动漏洞验证。
## 简而言之,它是什么
对代码库运行 `codered hunt`。静态分析器(semgrep, bandit, clippy, gosec, eslint, checkov, trivy, ...)产生原始发现。tree-sitter 数据流提取器构建 `dataflow_edges`;机械污点追踪器对其进行遍历。四个 LLM agent —— `pattern_scout`, `chain_builder`, `poc_forge`, `devils_advocate` —— 随后对证据进行推理:pattern_scout 组合受引用限制的发现,chain_builder 将它们映射到七阶段的 Agent Kill Chain,poc_forge 合成在网络隔离沙箱中运行的重现脚本,而 devils_advocate 运行反转提示词反驳过程(可选择在独立的、非镜像模型上运行)。`reflector` agent 将测试任务提炼为可重用的知识三元组。每一步都受 Cedar 策略门控,在审计日志中进行哈希链接,并使用每次任务专属的 Ed25519 密钥进行签名。`codered report` 随后输出 SARIF、Markdown 和经 Ed25519 签名的 JSON 移交文件。
## 状态
完整流水线已实现并经过测试:底层基础、映射器、受引用限制的 static_hunter、感知攻击链的发现、确认偏差解药、多语言覆盖,以及 reporter / 移交 / reflector —— 已在大型真实多语言代码库中完成端到端验证。
**当前支持的语言覆盖:**
| 语言 | 解析 | 数据流 + 污点 | SAST 扫描器 | 沙箱重现器 |
|----------|:-------:|:----------------:|:-------------:|:--------------------:|
| Python | ✅ | ✅ | semgrep, bandit, pip-audit, ruff | ✅ |
| Rust | ✅ | ✅ | cargo-audit, clippy, semgrep | ✅ |
| TypeScript / JavaScript | ✅ | ✅ | eslint, npm-audit, semgrep | ✅ |
| Go | ✅ | ✅ | gosec, govulncheck, staticcheck | ✅ |
| Java | ✅ | ✅ | semgrep, compromised-packages | ✅ |
| PHP | ✅ | ✅ | semgrep, progpilot, compromised-packages | ✅ |
| IaC (Terraform / K8s / Dockerfile / GH-Actions) | n/a | n/a | checkov, trivy | n/a |
Java 和 PHP 各自提供完整的静态路径(tree-sitter 解析、数据流提取、污点分析、符号、semgrep SAST;PHP 还增加了 progpilot 和 compromised-packages)以及沙箱重现器 —— PHP 运行在 PHP 8.3 CLI + pdo_sqlite 上,Java 运行在 JDK 21 单文件源码模式(`java Repro.java`)并在 classpath 中包含 sqlite-jdbc。IaC sidecar(checkov + trivy)接入到映射器的语言检测和 static_hunter 的 JOBS 表(容器 `symbi-codered-scanner-iac`)中;其 Dockerfile 位于 `scanners/iac/`,并且 `iac-scanner` 服务包含在 `docker-compose.yml` 中 —— 将其与其他服务一起启动即可进行测试。
**近期增强:** 独立的非镜像 devils_advocate 模型(`--advocate-*` 标志)、受见证限制的反驳(只有在引用了结构性见证时才能*抑制*发现 —— 与创建发现时的见证限制对称),以及第三个 `poc_status = inconclusive` 状态,这样“重现器无法运行”将不再静默地被视为证伪。
**客户端门户(企业版)。** 一个经过身份验证的多租户 Web UI,用于与客户共享测试任务结果,作为独立的企业产品提供。`hunt` 从已签名威胁模型的测试任务中派生其扫描目标(这样它就不会漂移到错误的目录树);`--target` 仍然是显式覆盖。
## 架构
```
flowchart TD
repo[("target repo")]
cli["codered CLI"]
journal[("audit_journal
hash-chained")] cli --> carto["1 — cartographer
tree-sitter facts +
dataflow_edges"] carto --> spec["2 — specifier
signed threat model
(Ed25519)"] spec --> stat["3 — static_hunter
per-language scanners"] stat --> py["python-scanner
(semgrep, bandit,
pip-audit, ruff)"] stat --> rs["rust-scanner
(cargo-audit, clippy,
semgrep)"] stat --> ts["typescript-scanner
(eslint, npm-audit,
semgrep)"] stat --> go["go-scanner
(gosec, govulncheck,
staticcheck)"] stat --> jv["java-scanner
(semgrep,
compromised-pkgs)"] stat --> php["php-scanner
(semgrep, progpilot,
compromised-pkgs)"] stat --> iac["iac-scanner
(checkov, trivy)"] stat --> taint["4 — taint_tracer
BFS over
dataflow_edges"] taint --> scout["5 — pattern_scout
citation-gated
LLM reasoning"] scout -. uncertain claims .-> hrepl["hypothesis_repl
(sub-context)"] scout --> chain["6 — chain_builder
kill-chain
clustering (LLM)"] chain --> poc["7 — poc_forge
LLM-synthesized
reproducers"] poc --> sb_py["python-sandbox"] poc --> sb_rs["rust-sandbox"] poc --> sb_ts["typescript-sandbox"] poc --> sb_go["go-sandbox"] poc --> sb_php["php-sandbox"] poc --> sb_java["java-sandbox"] poc --> adv["8 — devils_advocate
inverted-prompt rebuttal
(LLM, witness-gated,
optional non-mirroring model)"] adv --> refl["9 — reflector
knowledge_triples
(LLM)"] refl --> report["codered report"] report --> sarif["findings.sarif"] report --> md["report.md"] report --> seed["engagement-seed.json
(Ed25519-signed,
Cedar-filtered)"] cli -. every action .-> journal repo --> carto ``` **信任基础**(与流水线正交): - **Cedar 策略门控**位于每个 `store_finding`, `advocate_finding`, `mark_poc_status`, `write_knowledge_triple`, `emit_to_seed` 中。策略位于 [`policies/`](policies/)。 - **哈希链审计日志**(`.symbiont/audit/audit.jsonl`)—— 记录每一次工具调用 + Cedar 决策;`audit::verify_chain` 证明未被篡改。 - **每次任务专属的 Ed25519 密钥对**(`.symbiont/keys/.{priv,pub}`)—— specifier 对威胁模型进行签名;reporter 对测试任务种子(engagement-seed)进行签名。
- **见证者/律师规则**([`policies/citation.cedar`](policies/citation.cedar))—— 没有 `Citation::{Analyzer,Code,Hypothesis}` 就无法存储任何发现;通过携带属性的 Cedar 实体进行结构性强制。
- **只读魔鬼代言人**([`policies/tool-authorization.cedar`](policies/tool-authorization.cedar))—— Cedar `forbid` 规则阻止 `devils_advocate` 调用 `store_finding`。通过 `devils_advocate_forbids_store_finding_unconditionally` 测试进行验证。
- **见证反驳**([`policies/advocate.cedar`](policies/advocate.cedar))—— 与 citation.cedar 对称:除非引用了结构性见证(envelope / sanitizer / closed-set / constant-caller),否则禁止 `devils_advocate` 的*反驳*(带有 `verdict == "rebutted"` 的 `advocate_finding`)。现在,抑制发现与创建发现一样受到证据约束,并且反驳的见证将作为从已签名日志中引用的证据信封写入。
- **用于 poc_forge 的网络隔离沙箱** —— `network_mode: none`,只读 `/repo`,每个脚本 30 秒超时。
## 快速开始
```
# 前提条件:docker, docker compose, rust toolchain, Anthropic API key。
git clone https://github.com/ThirdKeyAI/symbi-codered && cd symbi-codered
cp .env.example .env # set ANTHROPIC_API_KEY (and SYMBIONT_*)
# 其他 LLM 提供商(OpenAI / OpenRouter,或通过
# OpenAI 兼容网关的 AWS Bedrock)在 .env 中配置——参见其中的注释。
# 构建 CLI:
cargo build -j2 -p symbi-codered-cli --release
# 启动 scanner sidecars(按语言区分;首次启动时构建):
CODERED_TARGET=/path/to/target/repo docker compose up -d \
python-scanner rust-scanner typescript-scanner go-scanner java-scanner php-scanner iac-scanner \
python-sandbox rust-sandbox typescript-sandbox go-sandbox php-sandbox java-sandbox
# 运行 pipeline:
./target/release/codered carto /path/to/target/repo
# (从 stdout 获取 engagement_id)
./target/release/codered specifier --engagement --target /path/to/target/repo
./target/release/codered hunt --engagement
./target/release/codered report --engagement
# 输出:
ls reports//
# findings.sarif
# report.md
# engagement-seed.json (Ed25519-signed, Cedar-filtered)
```
在 Rust + TypeScript 代码库上进行完整配置的审计大约需要 5-15 分钟的实际时间,并在 Claude token 上花费约 1 到 10 美元(取决于发现数量)。
#### 独立的魔鬼代言人
默认情况下,`devils_advocate` 会镜像生成模型。为了打破确认偏差循环,你可以将反驳过程指向一个独立的模型(例如通过 OpenRouter),并拥有其独立的回退链:
```
codered hunt --engagement \
--advocate-provider openrouter \
--advocate-model openai/gpt-4.1 \
--advocate-fallback minimax/minimax-m2
```
如果 advocate 最终镜像了生成层,则会在启动时触发警告。
### 跳过 sidecar
每个 scanner sidecar 都是可选的。如果 `rust-scanner` 没有启动,rust 任务的 scanner_errors 会增加,其余部分继续执行。适用于在仅限 Python 的目标上进行快速迭代:
```
docker compose up -d python-scanner python-sandbox
codered hunt --engagement # Rust/TS/Go jobs gracefully error, Python flow completes
```
### 在浏览器中查看结果(客户端门户)
测试任务结果可通过经过身份验证的多租户 Web UI 进行查看,该
UI 作为独立的企业产品提供。请联系 ThirdKey 获取访问权限。
## 流水线阶段
| # | 阶段 | 类型 | 输出 |
|---|-------|------|--------|
| 1 | `cartographer` | tree-sitter | `repo_facts`, `symbol_index`, `routes`, `dataflow_edges`, 代码块 LanceDB 索引 |
| 2 | `specifier` | 标准 JSON + Ed25519 | `threat_models` 行(source, sink, 范围, 签名) |
| 3 | `static_hunter` | docker exec 进入 sidecar | 每个 scanner 带有 `Citation::Analyzer` 的 `findings` 行 |
| 4 | `taint_tracer` | 机械 BFS(无 LLM) | `taint_chains` 行(source→sink 路径) |
| 5 | `pattern_scout` | LLM (Symbiont ORGA loop) | 带有 `Citation::Code` / `Citation::Hypothesis` 的 `findings` 行 |
| 6 | `chain_builder` | LLM | 映射到 7 阶段 Agent Kill Chain 的 `attack_chains` 行 |
| 7 | `poc_forge` | LLM + 特定语言沙箱 | `findings.poc_status` ∈ {reproduced, refuted, inconclusive, reproduced_by_citation} |
| 8 | `devils_advocate` | LLM(反转提示词,只读,见证限制) | `findings.advocate_verdict` ∈ {confirmed, rebutted, uncertain} —— 反驳需要结构性见证 |
| 9 | `reflector` | LLM | `knowledge_triples` 行(跨测试任务召回基础) |
随后是 `codered report`(确定性 Rust;无 LLM),它渲染 SARIF + Markdown + 签名种子。
**上下文中的污点。** *source* 是不可信输入进入的地方(HTTP 参数、请求体、CLI 参数、环境变量、文件读取);*sink* 是使用不可信输入时很危险的操作(SQL 查询、shell 执行、文件路径、反序列化器、HTML 输出)。`taint_tracer` 在 cartographer 的 `dataflow_edges` 上执行从每个 source 到 specifier 指定的每个 sink 的机械 BFS —— 未净化的 source→sink 路径将成为 `TaintChain`(SQLi、命令注入、路径遍历、SSRF、XSS、…)。这些链是发现必须引用的结构性*见证*:可达性证明,而不仅仅是看起来有风险的代码形状。
## 开发
```
# 构建 + 测试:
cargo build -j2 --workspace
cargo test -j2 --workspace
cargo clippy -j2 --workspace --all-targets -- -D warnings
# 启动测试(构建 + 冒烟测试 orchestrator + python sidecars):
./tests/boot_test.sh
# 包含所有多语言 sidecar 构建的启动测试(较慢,约 20 分钟):
SYMBI_BOOT_TEST_MULTILANG=1 ./tests/boot_test.sh
# 实时 e2e(需要 ANTHROPIC_API_KEY + 运行中的 sidecars):
cargo test -j2 -p symbi-codered-cli --test plan_g_e2e -- --ignored
```
### 添加新 scanner
1. 在 `scanners//` 中放入 Dockerfile + scanner-runner.py
2. 向 `docker-compose.yml` 添加服务
3. 在 `crates/symbi-codered-tools/src/scanner_parsers/.rs` 添加输出解析器
4. 在 `tools/.clad.toml` 添加 ToolClad 清单 + 增加 `toolclad_load` 计数
5. 在 `crates/symbi-codered-tools/src/static_hunter.rs` 添加 `ScannerJob` 条目
### 添加新语言
与添加新 scanner 相同,另外:
6. 在 `crates/symbi-codered-tools/src/tree_sitter_loader.rs` 中将语言添加到 `SupportedLanguage`
7. (可选) 使用 `extract__edges` 扩展 `dataflow.rs`
8. 在 `crates/symbi-codered-tools/src/specifier.rs` 中为每种语言添加 source/sink 默认值
9. 在 `scanners/-sandbox/` 中添加特定语言的沙箱,并接入 poc_forge 调度
## 治理 + 信任
所有触及发现或工具调用的操作都受到策略门控和审计。请参阅:
- [`policies/citation.cedar`](policies/citation.cedar) —— 每个 store_finding 需要 ≥1 个引用
- [`policies/evidence.cedar`](policies/evidence.cedar) —— 每个 store_finding 需要 specifier_hash + 非空 envelope_id
- [`policies/tool-authorization.cedar`](policies/tool-authorization.cedar) —— 每个 agent 权限 + `devils-advocate-forbids-store` 不变量
- [`policies/advocate.cedar`](policies/advocate.cedar) —— `rebutted` advocate 判定需要结构性见证(抑制受见证限制,与创建发现对称)
- [`policies/handoff.cedar`](policies/handoff.cedar) —— 哪些发现符合 redteam 移交条件(advocate 确认/不确定、带引用、严重程度 ≥ 中等、poc 未被反驳;`inconclusive` **不会**被丢弃 —— 非测试不代表证伪)
- [`policies/step-up.cedar`](policies/step-up.cedar) —— 需要带外审批的操作
- [`policies/phase-gates.cedar`](policies/phase-gates.cedar) —— 阶段之间的排序约束
- [`policies/reflector.cedar`](policies/reflector.cedar) —— reflector 的能力面
位于 `.symbiont/audit/audit.jsonl` 的审计日志记录每次工具调用及其 Cedar 决策,并通过 SHA-256 链接条目。`audit::verify_chain` 证明日志未被篡改。
## 许可证
codered **核心** —— 分析引擎和 CLI (`carto`, `hunt`, `audit`,
`specifier`, `advocate`, `report`, `export-grc`) 以及 `agents/`, `policies/`,
`tools/`, 和 `scanners/` 定义 —— 采用
[Apache License 2.0](LICENSE) 许可。版权 © ThirdKey。
一些额外的功能,包括多租户**客户端门户**,是一个
**企业版**产品,**不**受此许可证涵盖。
请联系 ThirdKey 获取企业版授权。
### 构建
核心依赖于 [Symbiont](https://github.com/ThirdKeyAI/Symbiont)
runtime (`symbi-runtime`),从 crates.io 拉取 —— 无需额外设置:
```
cargo build -j2
```
hash-chained")] cli --> carto["1 — cartographer
tree-sitter facts +
dataflow_edges"] carto --> spec["2 — specifier
signed threat model
(Ed25519)"] spec --> stat["3 — static_hunter
per-language scanners"] stat --> py["python-scanner
(semgrep, bandit,
pip-audit, ruff)"] stat --> rs["rust-scanner
(cargo-audit, clippy,
semgrep)"] stat --> ts["typescript-scanner
(eslint, npm-audit,
semgrep)"] stat --> go["go-scanner
(gosec, govulncheck,
staticcheck)"] stat --> jv["java-scanner
(semgrep,
compromised-pkgs)"] stat --> php["php-scanner
(semgrep, progpilot,
compromised-pkgs)"] stat --> iac["iac-scanner
(checkov, trivy)"] stat --> taint["4 — taint_tracer
BFS over
dataflow_edges"] taint --> scout["5 — pattern_scout
citation-gated
LLM reasoning"] scout -. uncertain claims .-> hrepl["hypothesis_repl
(sub-context)"] scout --> chain["6 — chain_builder
kill-chain
clustering (LLM)"] chain --> poc["7 — poc_forge
LLM-synthesized
reproducers"] poc --> sb_py["python-sandbox"] poc --> sb_rs["rust-sandbox"] poc --> sb_ts["typescript-sandbox"] poc --> sb_go["go-sandbox"] poc --> sb_php["php-sandbox"] poc --> sb_java["java-sandbox"] poc --> adv["8 — devils_advocate
inverted-prompt rebuttal
(LLM, witness-gated,
optional non-mirroring model)"] adv --> refl["9 — reflector
knowledge_triples
(LLM)"] refl --> report["codered report"] report --> sarif["findings.sarif"] report --> md["report.md"] report --> seed["engagement-seed.json
(Ed25519-signed,
Cedar-filtered)"] cli -. every action .-> journal repo --> carto ``` **信任基础**(与流水线正交): - **Cedar 策略门控**位于每个 `store_finding`, `advocate_finding`, `mark_poc_status`, `write_knowledge_triple`, `emit_to_seed` 中。策略位于 [`policies/`](policies/)。 - **哈希链审计日志**(`.symbiont/audit/audit.jsonl`)—— 记录每一次工具调用 + Cedar 决策;`audit::verify_chain` 证明未被篡改。 - **每次任务专属的 Ed25519 密钥对**(`.symbiont/keys/
标签:DLL 劫持, DNS 反向解析, Go语言工具, SAST, 代码安全审计, 可视化界面, 大语言模型, 盲注攻击, 自动化漏洞挖掘, 请求拦截, 逆向工具, 通知系统, 错误基检测, 静态代码分析