paradigmxyz/evmbench

GitHub: paradigmxyz/evmbench

一个用于发现和利用智能合约漏洞的基准测试与代理工具,自动化评估合约安全性。

Stars: 391 | Forks: 58

evmbench cover

**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 [![Apache-2.0 License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](/LICENSE)
标签:API服务, DevOps安全, Docker, NIDS, PostgreSQL, RabbitMQ, UI可视化, 代理框架, 作业调度, 前端Next.js, 区块链安全, 区块链开发, 后端FastAPI, 安全测试, 安全防御评估, 容器化, 工作队列, 形式化验证, 攻击性安全, 智能合约安全, 智能合约漏洞利用, 智能合约漏洞检测, 测试用例, 漏洞报告, 结构化查询, 自动化安全, 自动化攻击, 请求拦截