paradigmxyz/evmbench
GitHub: paradigmxyz/evmbench
一个用于发现和利用智能合约漏洞的基准测试与代理工具,自动化评估合约安全性。
Stars: 391 | Forks: 58
**evmbench 是一个用于发现和利用智能合约漏洞的基准测试和代理工具。**
工作原理 |
安全性 |
关键服务 |
仓库结构 |
快速启动(本地开发)
本仓库包含与 `evmbench` 检测评估的配套接口([代码](https://github.com/openai/frontier-evals))。作为参考,我们将评估代码以固定的子模块形式包含在 `frontier-evals/` 中。
上传合约源代码,选择一个代理,并接收在 UI 中呈现的结构化漏洞报告。
## 工作原理
### 架构
```
Frontend (Next.js)
│
├─ POST /v1/jobs/start ───► Backend API (FastAPI, port 1337)
│ ├─► PostgreSQL (job state)
├─ GET /v1/jobs/{id} ├─► Secrets Service (port 8081)
│ └─► RabbitMQ (job queue)
└─ GET /v1/jobs/history │
▼
Instancer (consumer)
│
┌─────────┴──────────┐
▼ ▼
Docker backend K8s backend (optional)
│ │
└────────┬───────────┘
▼
Worker container
├─► Secrets Service (fetch bundle)
├─► (optional) OAI Proxy (port 8084) ──► OpenAI API
└─► Results Service (port 8083)
```
### 端到端流程
1. 用户通过前端上传包含合约文件的 ZIP 包。UI 将该归档文件、选定的模型密钥以及(可选)OpenAI API 密钥发送到 `/v1/jobs/start`。
2. 后端在 Postgres 中创建作业记录,在 Secrets 服务中存储密钥包,并向 RabbitMQ 发布消息。
3. 实例器(Instancer)消费该作业并启动工作器(本地运行 Docker;或可选的后端 Kubernetes)。
4. 工作器从其密钥包中获取凭证,将上传的 ZIP 解压到 `audit/`,然后以“仅检测”模式运行 Codex:
- 提示词:`backend/worker_runner/detect.md`(复制到容器内的 `$HOME/AGENTS.md`)
- 模型映射:`backend/worker_runner/model_map.json`(将 UI 模型密钥映射到 Codex 模型 ID)
- 命令包装器:`backend/worker_runner/run_codex_detect.sh`
5. 代理写入 `submission/audit.md`。工作器验证输出是否包含可解析的 JSON 格式 `{"vulnerabilities": [...]}`,然后将其上传到结果服务(Results Service)。
6. 前端轮询作业状态,并以文件导航和注释形式渲染报告。
## 安全性
`evmbench` 对上传的不可信代码运行一个由 LLM 驱动的代理。请将工作器运行时(文件系统、日志、输出)视为不可信环境。
完整的信任模型和操作指南请参见 `SECURITY.md`。
OpenAI 凭证处理:
- **直接 BYOK(默认)**:工作器接收明文 OpenAI 密钥(`OPENAI_API_KEY` / `CODEX_API_KEY`)。
- **代理令牌模式(可选)**:工作器接收一个不透明令牌,并通过 `oai_proxy` 路由请求(明文密钥保留在容器外)。
启用代理令牌模式:
```
cd backend
cp .env.example .env
# 设置 BACKEND_OAI_KEY_MODE=proxy 和 OAI_PROXY_AES_KEY=...
docker compose --profile proxy up -d --build
```
操作说明:工作器运行时的默认超时时间已设定;可通过 `EVM_BENCH_CODEX_TIMEOUT_SECONDS` 覆盖最大审计运行时间(默认:10800 秒)。
## 关键服务
| 服务 | 默认端口 | 角色 |
|---|---:|---|
| `backend` | 1337 | 主 API:作业提交、状态、历史记录、认证 |
| `secretsvc` | 8081 | 存储并提供每个作业的密钥包(ZIP + 密钥材料) |
| `resultsvc` | 8083 | 接收工作器结果、验证/解析并持久化到数据库 |
| `oai_proxy` | 8084 | 可选的 OpenAI 代理,用于代理令牌模式 |
| `instancer` | (n/a) | 消费 RabbitMQ 并启动工作器容器/Pod |
| `worker` | (n/a) | 执行仅检测的代理并上传结果 |
| Postgres | 5432 | 作业状态持久化 |
| RabbitMQ | 5672 | 作业队列 |
## 仓库结构
```
.
├── README.md
├── SECURITY.md
├── LICENSE
├── frontend/ Next.js UI (upload zip, select model, view results)
├── frontier-evals/ Pinned upstream reference (git submodule)
├── backend/
│ ├── api/ Main FastAPI API (jobs, auth, integration)
│ ├── instancer/ RabbitMQ consumer; starts workers (Docker/K8s)
│ ├── secretsvc/ Bundle storage service
│ ├── resultsvc/ Results ingestion + persistence
│ ├── oai_proxy/ Optional OpenAI proxy (proxy-token mode)
│ ├── prunner/ Optional cleanup of stale workers
│ ├── worker_runner/ Detect prompt + model map + Codex runner script
│ ├── docker/
│ │ ├── base/ Base image: codex, foundry, slither, node, tools
│ │ ├── backend/ Backend services image
│ │ └── worker/ Worker image + entrypoint
│ └── compose.yml Full stack (DB/MQ + services)
└── deploy/ Optional deployment scripts/examples
```
## 快速启动(本地开发)
请确保已安装 Docker 和 Bun。
首先构建基础镜像和工作器镜像(在启动堆栈之前必需):
```
cd backend
docker build -t evmbench/base:latest -f docker/base/Dockerfile .
docker build -t evmbench/worker:latest -f docker/worker/Dockerfile .
```
启动后端堆栈(API + 依赖项):
```
cp .env.example .env
# 对于本地开发,.env.example 中的占位符密钥已足够。
# 对于互联网暴露的部署,请用强值替换它们。
docker compose up -d --build
```
启动前端开发服务器:
```
cd frontend
bun install
bun dev
```
访问以下地址:
- `http://127.0.0.1:3000`(前端)
- `http://127.0.0.1:1337/v1/integration/frontend`(后端配置端点)
## 感谢
感谢 OtterSec 团队的各位成员提供的支持,尤其是在前端构建方面:es3n1n、jktrn、TrixterTheTux、sahuang
[](/LICENSE)
标签:API服务, DevOps安全, Docker, NIDS, PostgreSQL, RabbitMQ, UI可视化, 代理框架, 作业调度, 前端Next.js, 区块链安全, 区块链开发, 后端FastAPI, 安全测试, 安全防御评估, 容器化, 工作队列, 形式化验证, 攻击性安全, 智能合约安全, 智能合约漏洞利用, 智能合约漏洞检测, 测试用例, 漏洞报告, 结构化查询, 自动化安全, 自动化攻击, 请求拦截