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 ```
标签:DLL 劫持, DNS 反向解析, Go语言工具, SAST, 代码安全审计, 可视化界面, 大语言模型, 盲注攻击, 自动化漏洞挖掘, 请求拦截, 逆向工具, 通知系统, 错误基检测, 静态代码分析