asd3358123/verified-audit
GitHub: asd3358123/verified-audit
基于「单 agent + 承载式验证」理念的 Go 代码安全审计工具,通过确定性可达性分析和对抗性验证来消除 LLM 审计中的误报。
Stars: 1 | Forks: 0
# verified-audit
**English** | [繁體中文](README.zh-TW.md)
[](https://github.com/asd3358123/verified-audit/actions/workflows/ci.yml)
**对于安全审计而言,单个强大的 agent + 承载式验证在召回率上足以匹敌多 agent 扇出,且成本仅为后者的一小部分。以下是具体的方法、证据以及一个可用的 Go CI 工具。**
大多数“AI 代码审计”只做两件事之一:要么用幻觉产生的发现淹没你,要么 fan-out 出几十个 agent,指望数量能等于召回率。本仓库主张——并*进行了实测*——恰恰相反:
## 三个部分,一个故事
| | 内容 | 位置 |
|---|---|---|
| **证据** | 一项基准测试:递归 / fan-out 分解对比单个强大的 agent,涵盖 5 种配置。Fan-out **从未获胜**。 | [`bench/`](bench/) |
| **方法** | `verified-audit`:一个强大的 agent → 确定性 + 对抗性验证 → **显式报错,绝不静默**。 | [`METHODOLOGY.md`](METHODOLOGY.md) · [`skill/`](skill/) |
| **工具** | 一个无头(headless)的 Go 安全审计工具,将该方法接入 CI:`deadcode` 可达性(确定性)+ LLM 用于语义分析(仅在可达代码上)。 | [`tool/`](tool/) |
这些部分相辅相成:基准测试是*你应该信任该方法的原因*;方法是*具体的运作方式*;工具是*你今天就可以运行的可用参考*。
## 核心理念
1. **可达性是确定性工具的工作,而不是 LLM 的。** [`deadcode`](https://pkg.go.dev/golang.org/x/tools/cmd/deadcode) 构建了全程序调用图;在可证明不可达的函数内部的发现会**在不调用 LLM 的情况下被自动驳回**。LLM 会*被告知*可达性,而不是去猜测——这正是消除大多数误报的关键。(此步骤特意仅支持 Go——因为它需要*可靠*的调用图;对于 Python/JS/TS,验证过程承担了主要工作。参见 [`--lang`](tool/README.md#languages---lang)。)
2. **验证是起支撑作用的。** 每个发现都必须通过 (a) 确定性检查——即引用的 `file:line` 确实包含所声称的结构——以及 (b) 一个试图*反驳*它的对抗性怀疑者,且默认其为非漏洞。LLM 的自我评估往往会夸大其词;这一步使得在无人监视时,其输出结果也值得信赖。
3. **失败绝不能看起来像“干净”。** 解析失败的审计调用会将扫描标记为**不完整**(位于报告顶部的横幅),而不是空白。验证失败的调用会将该发现发送到**不确定(inconclusive)**的桶中——绝不会被静默丢弃,因为在安全门中,被丢弃的真实发现是极其危险的失败模式。
4. **关注 Source,而不仅仅是 Sink。** 对于注入类的发现,对 *sink* 的确认判定只是临时的,直到追踪到 *source*——LLM 能可靠地发现 `fmt.Sprintf` 写入 SQL 的行为,但通常会*假设*输入是由攻击者控制的。如果每个调用方传入的都是常量,那它只是一项代码加固提示,而不是一个可利用的漏洞。
5. **单个强大的 agent,而非 fan-out。** 通过 5 种配置实测(4–46 个植入的缺陷;强模型和弱模型;强制和非强制分解;最多 90 个文件):fan-out 在召回率上**从未击败过**单个强大的 agent——它只会增加成本和误报噪音。参见 [`bench/`](bench/)。
## 快速开始(适用于任何 Go 仓库)
```
pip install openai
go install golang.org/x/tools/cmd/deadcode@v0.47.0
export OPENROUTER_API_KEY=... # OpenAI-compatible; uses Claude via OpenRouter by default
python tool/verified_audit.py \
--repo /path/to/your/go/repo \
--paths ./internal/handler ./pkg/auth \
--out report.md
```
要将其作为**发布前的安全门(pre-ship security gate)**接入 Gitea / GitHub Actions,请参见 [`tool/README.md`](tool/README.md)。
**或者将其指向你已经在运行的扫描器。** `--sarif gosec.sarif` 会将相同的验证 + 可达性层应用于 gosec / semgrep / CodeQL 的输出,以**消除它们的误报**(并附带原因)——这通常是性价比最高的高价值用法,因为大多数团队都淹没在 SAST 的噪音中。在开源项目 [ffuf](https://github.com/ffuf/ffuf) 上,该工具将 gosec 的 25 个发现中的 **16 个**驳回为误报,每个都附带了理由,从而保留了真正的漏洞([实战案例](examples/triage-demo.md))。
**其他语言。** 审计、验证和分类(triage)也支持在 **Python、JavaScript 和 TypeScript** 上运行(`--lang`),并且基于 `--sarif` 的分类适用于任何 semgrep/CodeQL 能输出 SARIF 的对象。确定性的死代码可达性仍仅限 Go(它需要可靠的调用图);其他所有功能均可跨语言通用。
## 为什么会有这个项目(诚实说明)
这个项目最初是一个*递归多 agent 框架*。但它自己的基准测试推翻了其核心假设——递归分解从未击败过单个强大的 agent。在测量中经得起考验的部分,也就是本仓库现在的内容:**一个强大的 agent 加上验证**。故意推翻最初想法的基准测试被保留了下来——因为证据才是核心。
## 目录结构
```
README.md this file — the thesis
METHODOLOGY.md the method, runtime-agnostic (set it up yourself)
skill/ a drop-in Claude Code skill for the method
tool/ the Go audit tool + example CI workflows
bench/ the benchmark harness + the negative result
examples/ configuration examples
tests/ deterministic unit tests (run in CI)
```
## License
[MIT](LICENSE)。
标签:DLL 劫持, DNS 反向解析, Go语言, IPv6支持, LNA, Petitpotam, 人工智能, 大语言模型, 搜索语句(dork), 日志审计, 用户模式Hook绕过, 程序破解, 逆向工具, 错误基检测, 静态代码分析