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, 内存分配, 安全防御评估, 自动化构建, 请求拦截, 逆向工具