ARTEX:双图架构的 LLM 自主渗透测试系统,Go 单二进制自托管
项目地址: Demo: 资产同步:ScopeSentry
百度「agent+」攻防挑战赛冠军项目,AGPL-3.0,Go 后端 + Next.js 前端,前端通过 go:embed 内嵌进单二进制。
它做什么
给 agent 一个资产范围,它在范围内自主探索。仪表盘呈现总览、Token 消耗和活动流;任务页能看到执行过程中的会话与工具调用、探索链路图;配套发现列表、资产列表,以及力导向布局的资产覆盖图。支持流量录制,也支持「人在环路」对话干预。
两个设计值得单独说:
审批先行。 agent 动作可以走「拦截审批」,全局审批记录、任务内拦截、对话里的审批卡片都能展开查看完整详情,关键操作先审后行。这是把不可逆操作的闸门交回人手里的做法,代价是自动化链路会被打断,配置时要想清楚哪些工具值得拦。
数据自主权。 任务、发现、资产、流量全部落在自己的 PostgreSQL 里,不经过第三方平台。LLM 密钥(Anthropic 或 OpenAI)在界面里配置。
与 ScopeSentry 打通:填地址和 API Key 即可同步域名、子域、IP、端口、站点、端点等资产,按范围归并后进入资产图供 agent 探索。
双图架构
核心是两张图,加上把两图连起来的锚点。README 的描述:
- 资产图(Asset Graph,全局共享):跨任务的同一份资产真值库,节点类型
root_domain/subdomain/ip/service/app/endpoint。父子关系与去重 key 由程序计算,agent 只提交原始信息。 - 探索图(Exploration Graph,每任务独立):节点类型
goal/intent/fact/finding/hint,靠spawns/derived_from/yields/proves等边连成血缘链。 - 锚点:
exploration_anchors(node_id, asset_id)把意图、事实、漏洞锚定到具体资产。
planner 与 worker 的分工很清晰:planner 读探索图态势、判定目标,只在存在未覆盖的新方向时把意图派进 frontier;worker 领一条意图,用真实工具执行,把新资产、事实、漏洞写回两图后即停。引擎是事件驱动的——图一变就唤醒 planner。worker 之间可以跨 work 检索执行过程(search_all_worker_traces / get_worker_trace)。planner 持有一份按任务保留、跨唤醒共享的 todolist,多轮按依赖逐步派意图,用来推进多步利用链。
agent 能力由 norma SDK 提供(agentcore / tool / permission / harness / memory / transcript)。
部署
五种方式,按场景选。
一键脚本(会检测并安装 Docker,然后让你选全 Docker 还是本地编译):
git clone https://github.com/Autumn-27/ARTEX.git && cd ARTEX && ./install.sh
选全 Docker 时填 Postgres 密码,脚本自动写 .env 并 docker compose up -d。
Docker Compose 手动:
cp .env.example .env # 填 POSTGRES_PASSWORD,可选 ANTHROPIC_API_KEY
docker compose up -d
镜像 autumn27/artex 已含 ripgrep / curl / vim / npm / nmap,./skills 与 ./data 绑定挂载持久化。
Releases 预编译二进制: 解压得到 artex + start.sh(Windows 为 start.bat)+ skills/ + config.example.json。复制成 config.json 填 database 连接,用 ./start.sh 启动——它是守护脚本,页面一键更新靠它换装。后台常驻:
nohup ./start.sh >artex.log 2>&1 &
源码编译单二进制:
cd web && npm ci && npm run build:static && cd ..
cp -r web/out server/webui/dist
CGO_ENABLED=0 go build -tags embedui -o artex ./cmd/artex
跨平台打包: build.sh --release,默认覆盖 linux amd64/arm64、macOS amd64/arm64、Windows amd64。UPX 默认关闭,开启后可能与部分内核或虚拟化环境不兼容。
默认端口 8787,首次进入 /setup 设管理员密码。
升级与回滚
原则是只换程序不动数据。Postgres 数据卷 pgdata、./data(jwt.key/SQLite)、./skills 都保留。schema 迁移不需要手动跑——artex 每次启动幂等重跑 schema.sql(ADD COLUMN / CREATE INDEX IF NOT EXISTS),即「重启即迁移」。升级前仍建议备份 ./data 与数据库。
页面一键更新:系统配置 → 版本与更新卡片,下载当前平台发布包 → 比对 SHA256SUMS → -h 冒烟测试 → 暂存 artex.new → 程序退出后由 start.sh 重新拉起换装。失败不会留下坏程序;新版连续 3 次启动失败自动回滚到 artex.old。注意更新会中断正在运行的任务。
Docker 部署下只换程序不换镜像,工具链不会升级;要连镜像一起升级:
docker compose pull artex && docker compose up -d artex
开发构建(版本号 dev)不提供更新。另有 update.sh,可选 git pull,然后选 Docker 或本地编译更新。
配置与反代
数据库连接走 config.json,或环境变量 ARTEX_PG_DSN 覆盖。LLM 用 ANTHROPIC_API_KEY / OPENAI_API_KEY,也可在 UI 里配;可选 ARTEX_LLM_PROVIDER / MODEL / BASE_URL / PROXY。每个任务的 work agent 数在系统设置里配,默认 3。
常用参数:
./start.sh -addr :8787 -proxy :8788
-addr 是前端 + API,-proxy 是流量录制代理。
反代部署(HTTPS / 只开 443):前端与 API/SSE 同一个后端端口,实时活动流默认同源,不需要 NEXT_PUBLIC_SSE_BASE;公网只开 443,8787 留内网。SSE 长连接必须关缓冲,否则浏览器连上了却收不到事件,表现是活动流一直转圈。Nginx 关键项:
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_http_version 1.1;
proxy_set_header Connection "";
复测
任务详情里有「复测」页,可分页选漏洞、查看历次结论和证据、手动发起复测。结论三档:仍可复现、已修复、无法确认,每次的结论、证据、会话链接都会保存。新版后端首次启动会预置 retester Agent;复测成功且结论为「已修复」时,自动把漏洞处置状态改为「已修复」。
本地开发与技术栈
./dev.sh # 后端 :8787 + 流量代理 :8788 + 前端 next dev :5173
go test ./...
cd web && NEXT_PUBLIC_MOCK=1 npm run dev # Mock 预览
技术栈:Go net/http + JWT + SSE,engine 每个任务一个 plannerLoop 加 N 个 worker goroutine,pgx 落 Postgres。远程 MCP 可选 http(Streamable HTTP)或 sse(旧版)。
许可证与免责(重要)
项目采用 AGPL-3.0,衍生作品须同样以 AGPL-3.0 发布,通过网络提供服务也须公开完整源码。
作者额外声明:仅限个人学习、代码研究与本地隔离环境技术验证,严禁对任何线上系统/网站发起实际扫描、探测、利用或攻击(无论是否授权),使用者自负法律责任。