HoeTee/swe-ctf-challenge_image-build
GitHub: HoeTee/swe-ctf-challenge_image-build
基于 SWE-bench 的 CTF 题目自评测 Docker 镜像自动化构建工具,支持本地和远端构建并推送到 Docker Hub。
Stars: 0 | Forks: 0
# SWE CTF Tools
固定 CLI 工具,用于在本地 Docker 或远端服务器上构建 SWE-bench CTF 容器内自评测镜像,并按配置推送到 Docker Hub。
## 评测模型
镜像启动后,选手在页面上传 `submission.json`:
{
"challenge_id": "CHAL-Q21",
"diff": "diff --git ..."
}
容器内评测流程:
1. reset 到 metadata.base_commit
2. apply /opt/self-eval/test.patch # 隐藏测试,由 hidden_test_patch_file 打进镜像
3. apply submission.json.diff # 用户答案
4. run metadata.test_cmd
5. 测试通过后返回 GZCTF_FLAG
`hidden_test_patch_file` 不是答案。它是出题方隐藏测试 patch,用来把能暴露 bug 的测试加入代码库。用户答案只来自 `submission.json.diff`。
注意:隐藏测试会被打进镜像。如果镜像不能公开隐藏测试,请使用私有仓库或可信 registry。
## 安装
在项目根目录执行一次:
cd C:\Users\18014\OneDrive\Desktop\SWE-CTF-Tools
python -m pip install -e .
只有修改 `pyproject.toml` 的命令入口、增加依赖、换 Python 环境时,才需要重新执行安装。普通源码和配置修改不需要。
## 配置文件
默认只使用一个配置文件:
configs/build-image.yaml
本地构建和远端构建都使用这个文件,通过 `remote.mode` 切换。
本地构建:
remote:
mode: "local"
workdir: "C:/Users/18014/Desktop/ctf"
远端构建:
remote:
mode: "ssh"
host: "linyang@100.99.32.117"
workdir: "/home/linyang/swe-challenge-system/self-eval-entry"
## 题目配置
每题配置追加到 `challenges:` 下:
- n: 21
challenge_id: "CHAL-Q21"
dir: "CHAL-Q21"
base_image: "swebench/sweb.eval.x86_64.sympy_1776_sympy-16988:latest"
tag: "chal-q21"
hidden_test_patch_file: "../materials/CHAL-Q21/test.patch"
metadata:
instance_id: "sympy__sympy-16988"
repo: "sympy/sympy"
base_commit: "e727339af6dc22321b00f52d971cda39e4ce89fb"
version: "1.5"
test_cmd: "PYTHONWARNINGS=\"ignore::UserWarning,ignore::SyntaxWarning\" bin/test -C --verbose sympy/sets/tests/test_sets.py"
timeout_seconds: 280
workspace: "/testbed"
repo_source: "/testbed"
字段说明:
- `base_image`:SWE-bench 基础镜像,里面有目标代码库和测试环境。
- `hidden_test_patch_file`:出题方隐藏测试 patch,构建时会复制成题目目录里的 `test.patch` 并打进镜像。
- `metadata.base_commit`:评测开始前 reset 到的 commit。
- `metadata.test_cmd`:容器内真正执行的测试命令。
- `metadata.workspace` / `metadata.repo_source`:通常都是 `/testbed`。
旧字段 `test_patch_file` 仍兼容,但新配置不要再使用。
## 命令
检查当前配置指向的环境:
swe-ctf-check-remote
构建镜像:
swe-ctf-build-images
语义别名:
swe-ctf-build-images-local
swe-ctf-build-images-remote
这三个命令默认都读取同一个文件:
configs/build-image.yaml
实际是本地还是远端,由 `remote.mode` 决定。
dry-run:
swe-ctf-build-images --dry-run
swe-ctf-build-images-local --dry-run
swe-ctf-build-images-remote --dry-run
指定配置文件:
swe-ctf-build-images --config C:\path\to\build-image.yaml
旧本地命令仍保留为兼容别名:
swe-ctf-image-local
## Docker Hub
镜像名由以下字段组成:
docker_hub.repository:challenges[].tag
例如:
southernbanker/swebench-challenge:chal-q21
如果 `remote.mode: "local"`,`docker login` 发生在 Windows 本机 Docker Desktop。
如果 `remote.mode: "ssh"`,`docker login` 发生在远端服务器 Docker。
自动登录配置:
docker_hub:
repository: "southernbanker/swebench-challenge"
push: true
login: true
username: "southernbanker"
password: "Docker Hub access token"
推荐使用 Docker Hub Access Token,不建议使用账号密码。
如果只想构建不推送:
docker_hub:
push: false
## 启动容器测试
正式比赛中通常由 GZCTF 根据题目镜像配置启动容器,并注入 `GZCTF_FLAG`。手动启动只用于本地验证。
docker run --rm -p 18081:8080 `
-e GZCTF_FLAG="flag{local_test}" `
southernbanker/swebench-challenge:chal-q21
访问:
http://localhost:18081
健康检查:
GET /healthz
提交接口:
POST /submit
POST /api/submit
## 材料目录
建议每题材料放在:
materials/
CHAL-Q21/
test.patch
solution-submission.json
说明:
- `test.patch` 是隐藏测试,构建时打进镜像。
- `solution-submission.json` 是出题方内部官方提交答案,只用于自己测试,不会自动打进镜像。
## 输出
构建完成后会输出 JSON 清单,并按配置写入:
configs/build-image-manifest.json
清单示例:
{
"n": 21,
"challenge_id": "CHAL-Q21",
"challenge_dir": "C:\\Users\\18014\\Desktop\\ctf\\CHAL-Q21",
"base_image": "swebench/...",
"image": "southernbanker/swebench-challenge:chal-q21",
"push_planned": true,
"pushed": false
}
## 入口模板
通用模板目录:
entry-template/
Dockerfile
self_eval_app.py
static/
index.html
app.js
style.css
problem.json
构建时会按当前题目的 `challenge_id` 和 `n` 刷新 `static/problem.json`,避免复用模板时显示成旧题号。
## 容器运行时 API
题目容器后续用于页面会话、提交、评测日志、审计查询和控制行为的 API 设计见:
docs/container-runtime-api.md
docs/container-runtime-api.openapi.yaml
当前设计只覆盖容器内 API,不包含 OSS 下载、本地日志落盘、GZCTF 平台日志导出或跨日志合并流程。
新构建的镜像默认启动:
/opt/self-eval/self_eval_fastapi_app.py
容器内 API 使用同一个 8080 端口。管理/审计接口需要设置:
AUDIT_API_TOKEN
可选环境变量:
AUDIT_LOG_DIR=/opt/self-eval/audit
AUDIT_HEARTBEAT_SECONDS=30
AUDIT_MAX_LOG_LINES=1000
选手页面会自动调用 `/api/audit/page-opened` 和 `/api/audit/heartbeat`,提交时调用 `/api/submit`。
标签:AI评测, Docker, SWE-bench, 内存分配, 安全防御评估, 自动化构建, 请求拦截, 逆向工具