KillianM00/polysec-harness
GitHub: KillianM00/polysec-harness
一个基于多代理LLM的生产级安全研究管线,通过对抗性验证和校准评分,自主审计智能合约与Web应用并生成可复现的漏洞报告。
Stars: 0 | Forks: 0
# polysec-harness
一个生产级的、多代理 LLM 安全研究管线。通过生成具有特定角色的 AI 子进程,自主审计
智能合约和 Web 应用程序。这些子进程能够阅读代码、编写可执行的
概念验证,并通过对抗性二次验证来确认发现——同时具备校准的严重性评分、可复现的 PoC
工件以及严格的作用域强制执行。
该项目基于这样一个观察构建:发现漏洞和*评估*漏洞需要不同的
上下文:假设存在漏洞的 LLM 对其自身的假设存在“是”偏见,因此验证层作为独立的进程运行,使用全新的上下文,并经过四个通过/失败关卡。
## 它的功能
给定一个漏洞悬赏计划的范围(Code4rena、Immunefi、HackerOne、Sherlock、
Cantina 等),该 harness 会:
1. **根据预期价值对目标进行排序**——审计后的代码变动、先前的披露密度、悬赏金额上限、目标密度评分。
2. **并行调查每个已排序的目标**——阅读源代码,形成特定的假设,编写可执行的 PoC(EVM 的 Foundry 测试;Web2 的可复现 HTTP 交互),并进行迭代,直到证明能够展示影响或合理反驳该假设。
3. **对抗性地验证每项调查**——从全新的上下文重新运行 PoC,检查断言是否*具有实际影响*,根据计划排除规则对攻击者进行分类,并确认被绕过的功能在已部署的合约中处于操作上的启用状态。
4. **在全新的沙盒中复现已验证的发现**三次,以确认确定性。
5. **生成符合计划模板的提交级报告**,并以最终操作员审查作为关卡。
所有层级间的通信都是对 `state/` 的原子文件写入。每个角色在单独的子进程中运行,具有自己的上下文窗口、模型选择和速率限制池。
## 架构
```
┌─────────────────────┐
Campaign cfg → │ Orchestrator │ (Opus 4.7 — low-volume coordinator)
└──────────┬──────────┘
│ writes state/directives/cycle_NNN.md
▼
┌─────────────────────┐
│ Priority Ranker │ (Haiku 4.5 — fast triage)
└──────────┬──────────┘
│ writes state/targets.jsonl
▼
┌───────────────┴────────────────┐
│ Investigators × N │ (Opus 4.7 — deep code reading + forge loop)
│ (parallel, disjoint context) │
└───────────────┬────────────────┘
│ writes state/investigations/cycle_NNN/I####.md
│ + state/repos//test/polysec/I####.t.sol
▼
┌─────────────────────┐
│ Verifier │ (Opus 4.7 — adversarial second pass)
│ Gates A / B / C │
└──────────┬──────────┘
│ writes state/verified_findings//F####.md
▼
┌─────────────────────┐
│ Reproducer │ (3× re-run in fresh anvil-fork or HTTP-replay)
└──────────┬──────────┘
│ writes state/repros/F####/result.json
▼
┌─────────────────────┐
│ Report Writer │ (Opus 4.7 — program-template-aware)
│ → operator gate │
└─────────────────────┘
```
协调器管理周期生命周期,强制执行每个周期和会话的预算,
调度层级,并应用跨领域策略(拒绝恢复、无效发现率自动停止、去重评分)。每个下游层级从 `state/` 读取上游工件,并写入自己的原子工件供下一层级使用——没有共享内存,没有消息总线,没有隐藏状态。
## 验证模型
调查员的主要工件不是假设段落——它是一个可执行的 PoC。一个能够运行并断言余额变化的 Foundry 测试,或者一个能够重放并产生具有实际影响的响应分歧的 HTTP 交互。如果模型无法编写出能展示影响的 PoC,调查将以“未发现漏洞,以下是我排除的情况”干净退出。
然后,验证器应用四个硬性关卡。任何关卡失败都会将严重性限制在 L2,并设置 `promoted=false`:
- **关卡 A — 测试重跑并通过。** 验证器在全新的上下文中从磁盘重新执行调查员的 Foundry 测试(或重放 HTTP 交互)。如果它不能在冷启动下通过,说明调查员产生了幻觉;拒绝。
- **关卡 B — 断言具有实际影响。** 验证器读取测试源代码。不合格的模式:仅有 `assertTrue(success)`,仅有 `vm.expectRevert`,没有余额/状态突变的断言。报告必须证明存在金钱后果或未经授权的状态改变,而不仅仅是“函数调用没有报错”。
- **关卡 C1 — 攻击者类别在计划范围内。** 测试的 `vm.prank(attacker)`(或 HTTP 请求的 `Authorization` 标头)会根据 `state/scope.md` 的排除规则进行分类。计划排除的特权角色受损(管理员密钥、内部员工、受损客户)属于 N/A,无论代码正确与否。
- **关卡 C2 — 功能处于操作上的启用状态。** 通过 `mainnet_probe`,验证器确认被绕过的功能确实存在于已部署的合约中。在代码中真实但在实际部署中无法触及的绕过将被降至 L1。
这些关卡的存在是为了强制执行单独的 LLM 漏洞悬赏工作流通常缺乏的纪律:真实的提交必须是可复现的,必须展示影响,必须针对无许可参与者,并且必须在操作层面适用。
## 校准
验证器的严重性评级锚定在功能存在性上,而不是凭感觉。锚点是具体的:“PoC 测试演示了未经授权的调用者进行的状态突变,并且该函数修改了持有资金的余额 → access_control L4+。”在对来自 Code4rena、Sherlock 和 Immunefi 公开披露的 300 项披露基础事实语料库进行迭代后,评判器在针对人工评级结果时达到了约 80% 的精确匹配严重性评级。
校准是持续测量的:每个被提升的发现都会根据评分标准进行评分,并且漂移审计每五个周期会对先前的发现重新评分,以检测评分标准随时间推移发生的漂移。
## 能力
**在四种活动配置中表现出多态性**,每种配置都有特定于配置的工具目录、调查员系统提示和严重性评分标准:
| 配置 | 目标 | 调查员重点 |
|---------|---------|--------------------|
| **A** Web2 悬赏 | HackerOne / Bugcrowd | OWASP 类别严重性 + 影响;HTTP 交互作为 PoC |
| **B** 智能合约 | Code4rena / Sherlock / Immunefi | Solidity 漏洞类别;Foundry 测试作为 PoC |
| **C** AI/ML 安全 | Anthropic / OpenAI / HF | 提示注入 / 模型提取分类法 |
| **D** 通用 / CTF | 以测试为预言机的有界代码任务 | 正确性 + 覆盖率 |
跨九个部分的**60 多种专用工具**——每种工具都遵循单一的
消化契约(有界的结构化输出,经过异常预过滤,
带有下一步提示的自描述错误,以及适用时的操作提示)。
亮点:
- **EVM 攻击原语**:`foundry_test`、`slither_run`、`mythril_run`、
`anvil_snapshot_replay`(分叉状态差异测试)、`chainlink_feed_probe`、
`uniswap_amm_probe`(V2 闭式解 + V3 QuoterV2 集成)、
`flash_loan_orchestrator`(Aave V3 / Balancer V2 / Maker DSS-Flash 提供
者选择)、`mev_bundle_sim`(Flashbots `eth_callBundle` 集成)、
`call_graph_extractor`(基于 Slither 的函数摘要)、
`role_actor_map`(基于正则表达式的权限清单)、
`exploit_template_library`(用于预言机操纵、捐赠攻击、首个存款者膨胀、三明治攻击的参数化模板)、
`mainnet_probe`(带有 source-path-to-address 解析的 cast-call 包装器)、
`postaudit_diff`(按文件提取 git 变动)。
- **Web2**:带有基线差异模式的 `http_request`、`payload_render`(按 WAF 绕过分数排序的模板化 SQLi/XSS/SSRF/SSTI/CSRF 变体)、
`race_condition_runner`、`cors_probe`、`auth_replay`、`burp_tap` 代理模式。
- **侦察**:`subdomain_enum`、`js_analyzer`(从公共包中提取端点)、`param_discovery`、`ct_log_watch`、`wayback_diff`、`github_recon`
(预编辑的机密泄露搜索)。
- **验证**:`poc_runner`(沙盒 PoC 执行)、`differential_test`、
`cross_target_scan`(假设扇出到 N 个目标)、`repro_3x`、
`dupe_check`(披露数据库相似性搜索)。
- **AI/ML**:`prompt_inject_runner`、`model_fingerprint`、`jailbreak_corpus`、
`mcp_introspect`、`embedding_distance`。
## 安全加固
- **沙盒隔离**:每次按尝试的执行都在 Docker 容器中运行,
带有默认拒绝的网络桥接、只读 rootfs、tmpfs `/work`、CPU/内存
上限、`--cap-drop=ALL` 以及 seccomp 配置文件。出口允许列表在 mitmproxy 桥接处强制执行。
- **预交战范围过滤器**:在任何 LLM 调用之前,每个 `campaign.targets[].surface_ref` 都会根据 `state/scope.md` 的“In scope”块进行子字符串验证。范围外的候选者会以失败关闭,且不消耗 token。
- **拒绝恢复协议**:区分“模型拒绝合法的授权工作”(使用增强的范围上下文重试,最多 3 次重试)和“模型发出结构化升级请求”(在任何进一步层级调度之前由操作员解决)。
- **原子写入 IPC**:所有层级工件都通过 temp-file + rename(临时文件+重命名)写入;即使在写入过程中遭遇 `kill -9` 也能保证数据安全。
- **成本账本**:在 `state/cost_ledger.jsonl` 中记录每次调用的 `{ts, role, model, input_tokens, output_tokens, cache_read_tokens, cache_write_tokens, usd}` 账本。周期和会话预算由协调器强制执行;与 Anthropic 计费的调节误差在 2% 以内。
- **无效发现率自动停止**:如果最近 N 次调查中有 N 次返回 severity=0,协调器将拒绝调度进一步的周期,直到操作员介入。
- **漂移审计**:每隔五个周期,验证器会根据当前评分标准对五个随机抽样的先前发现重新评分;`state/drift_audits/log.jsonl` 会记录分数差异,以便检测评分标准的漂移。
## 验证
在 **Damn Vulnerable DeFi v4** 上干净地进行了端到端验证:3 个 cycle-16 目标中的 3 个(unstoppable、naive-receiver、truster)生成了带有基于实际影响断言的通过 Foundry 漏洞利用。naive-receiver 漏洞利用通过元交易转发器链接了一个 11 次调用的 multicall,在 nonce ≤ 2 的单笔交易中耗尽了 300 万美元的 WETH——这是一个教科书式的链式 DeFi 漏洞利用,展示了跨合约边界的多步推理。
校准评估在 300 项披露基础事实语料库(阶段 1H)上达到了约 80% 的精确匹配严重性评级。
## 技术栈
- 通过 `uv` 使用 **Python 3.12**;对 `polysec/` 采用严格的 mypy 检查,对 `scripts/` 采用宽松的 mypy 检查
- 使用 **Pydantic v2** 定义每个工件模式(`polysec/schemas.py`)
- 每个层级使用 **Claude Code 子进程**(`claude --print --output-format json`)
- 使用 **Foundry**(forge / cast / anvil)进行 EVM PoC 执行 + 主网分叉探测
- 使用 **Docker** 进行按尝试的沙盒隔离
- 使用 **mitmproxy** 强制执行出口允许列表 + 取证流量记录
- 使用 **MCP (Model Context Protocol)** 向每个 Claude 子进程暴露工具
- 使用 **Slither + Mythril** 封装器进行静态分析原语处理
- 使用 **pytest** 进行单元 + 集成 + 评估测试套件(约 1000+ 个测试)
## 代码组织
```
polysec/ main package
├── orchestrator.py cycle lifecycle, tier dispatch, dud-rate gate
├── claude_invoker.py spawn `claude --print` with envelope parsing
├── ipc.py atomic file writes, frontmatter-markdown serde
├── schemas.py Pydantic models for every tier artifact
├── refusal_recovery.py 3-tier retry with scope re-anchoring
├── budgets.py per-cycle / session / tier budget enforcement
├── eval/ calibration eval pipeline (300+ disclosures)
├── reproducer/ Foundry-in-Docker + HTTP-replay reproducers
├── sandbox/ Docker spawn/exec/teardown
├── proxy/ mitmproxy controller + allowlist enforcement
├── mcp/ MCP server exposing tool catalog to Claude
├── dedup/ target-density scoring for ranker
├── bounties/ program-metadata fetchers (H1, Immunefi, C4)
└── tools/ ~60 tool catalog across 9 sections (see Capabilities)
prompts/ role system prompts
├── orchestrator.md
├── ranker.md
├── investigator_a_web2.md HTTP-exchange-first investigator
├── investigator_b_evm.md forge-test-first investigator
├── investigator_c_aiml.md
├── investigator_d_generic.md
├── verifier.md 4-gate adversarial pass, profile-aware
├── reproducer.md
├── report_writer.md
└── shared/ refusal_recovery, output_schemas, tool_catalog_*
campaigns/ per-campaign YAML config
audit/ self-audit of the tool catalog (programmatic verification)
docs/ architecture, operator_guide, threat_model
scripts/ start_cycle, eval_run, dupe_watch, …
tests/ unit + integration + eval pytest suites
```
## 值得注意的工程决策
- **锚定的严重性校准。** 大多数 LLM 评判设计让模型从 1-5 中挑选一个数字。如果没有锚点,模型的 `4` 和人工分类员的 `4` 是不同的东西,这种漂移会扼杀分类接受率。验证器提示词包含约 80 行与功能存在性挂钩的具体锚点;校准是可测量和可调整的。
- **测试优先的调查员要求。** 调查员的主要工件是通过的可执行证明,而不是段落。如果模型不能写出一个,它会返回“未发现漏洞”,并且周期继续——彻底消除了“我认为这可能被利用是因为……”的失败模式。
- **基于实际影响的断言检测器。** 关卡 B 读取测试源代码,并根据不合格的断言形状进行模式匹配。在没有证明影响的情况下通过的测试将被限制在 L2。这可以捕获那些看起来像通过的测试但没有展示金钱后果的 PoC。
- **拒绝恢复与升级请求的区分。** “模型拒绝合法的授权工作”和“模型发出真正的范围问题”看起来很相似,但具有不同的语义。harness 会分别处理它们——拒绝会使用增强的上下文重试;升级请求会阻塞,直到操作员解决。
- **原子写入 IPC。** 每个层级工件都通过 temp-file + rename 写入,以防止崩溃时出现半写读取。在写入过程中遭遇 `kill -9` 的情况下进行了测试。
- **成本感知的模型分层。** 使用 Haiku 4.5 进行大批量分类(排序器),使用 Opus 4.7 进行承重推理(调查员、验证员、报告编写者)。提示词缓存锚定在角色系统提示词上,以在规模上将输入 token 成本减半。
## 展示的技能
- **多代理 LLM 系统设计**:层级分离、基于文件的 IPC、独立的上下文窗口、独立的速率限制池、原子状态转换。
- **校准工程**:基础事实语料库构建、锚定评分标准设计、精确匹配指标跟踪、漂移检测。
- **安全工程**:威胁建模、范围强制执行、沙盒隔离、出口允许列表、拒绝恢复协议设计、特权参与者分类。
- **领域广度**:OWASP Top 10 (web2)、Solidity 漏洞类别 (EVM)、AI/ML 攻击分类法(提示注入、模型提取、越狱语料库)、漏洞悬赏计划操作细节(研究员标头、KYC 排除、影响优先规则、CVSS 层级映射)。
- **成本感知基础设施**:每次调用的账本、分层的预算、提示缓存、无效发现率自动停止。
- **生产工具链**:Pydantic v2 模式、mypy strict 模式、pytest、ruff、pre-commit hooks、Docker 隔离、MCP 集成。
## 开始使用
```
git clone https://github.com/KillianM00/polysec-harness.git
cd polysec-harness
uv venv && source .venv/bin/activate
uv pip install -e .
# 运行单元测试
pytest tests/unit
# 运行 calibration eval
python scripts/eval_run.py --config evals/phase1h.yaml
# 针对已配置的 campaign 调度一个 cycle
python scripts/start_cycle.py --campaign --cycle
```
有关内部机制,请参见 `docs/architecture.md`;有关日常工作流程,请参见 `docs/operator_guide.md`。
## 许可证
AGPL-3.0。衍生作品必须保持开源。商业许可证可应要求提供。
## 联系方式
Killian Miller — killianmiller6@gmail.com — github.com/KillianM00
标签:AI安全, AI安全研究, Chat Copilot, CISA项目, Code4rena, EVM, Foundry, HackerOne, Immunefi, LLM代理, PE 加载器, PyRIT, Web3安全, Web3漏洞扫描, Web报告查看器, 代码安全审计, 代码审计自动化, 去中心化应用安全, 多智能体系统, 大语言模型安全, 安全规则引擎, 对抗性验证, 并行计算, 智能合约审计, 智能合约漏洞, 机密管理, 概念验证, 漏洞严重性评估, 网络安全, 自动化渗透测试, 请求拦截, 软件供应链安全, 远程方法调用, 隐私保护