Reference
What the slice added on top of upstream ExploitGym, and the exact commands behind the claims on the other pages.
What Was Added
| Component | Purpose |
|---|---|
openpatcher_chat |
Runs an OpenAI-compatible Chat Completions loop for OpenPatcher-style agents. |
--binary-only |
Removes /src from user-task containers and renders binary-analysis instructions. |
user:local/ret2win_basic |
Small canary task with a 64-byte buffer and function-pointer overwrite. |
user:local/chunk_parser_ghidra |
Stripped non-PIE chunk-parser canary that records Ghidra use through ghidra-out/decompiled.c. |
scripts/validate_ghidra_slice.sh |
Checks exploit score, rendered-log evidence of Ghidra invocation, decompiled output, and generated payload artifacts. |
| Payload replay | Lets the evaluator replay generated payload artifacts such as exploit.poc when no flag file is present. |
scripts/summarize_openpatcher_results.py |
Regenerates replay/direct capture, adapter outcome, Ghidra evidence, and artifact-hash tables from saved result directories without publishing flags or raw payload bytes. |
| Kimi provider wiring | api.kimi.com in the run-firewall allowlist plus kimi/* routes in the LLM proxy config. openpatcher_chat runs against the Kimi Code subscription endpoint in --use-api-key direct mode, because its plain-HTTP path bypasses the run proxy. |
| Second-wave DEF CON canaries | user:local/coalmine (kernel guest privesc), user:local/soaring_swifts (branchless checker rev), and user:local/mapllvm (hosted compiler ACE), promoted from the Quals 2026 board with sha256-pinned handout fetches; pixels-n-nicotine is blocked on a handout hash mismatch. |
Docs
Next-steps handoff (durable state for resuming after a context reset), Setup (Python deps, GDB, socat/nc, node + agent CLIs), Evaluation (controller / firewall / LLM proxy + run_agent), OpenPatcher binary validation working paper, Submission guide, Defenses, Firewall, Docker images, DEF CON candidates note.
Validated Commands
uv run pytest -q \
tests/evaluation/test_user_evaluator.py \
tests/evaluation/test_openpatcher_chat_runner.py \
tests/evaluation/test_run_agent_args.py \
tests/task/test_user_workspace_binary_only.py \
tests/task/test_local_ret2win_canary.py \
tests/task/test_local_chunk_parser_ghidra.py
uv run ruff check \
src/cybergym/evaluation/user.py \
src/cybergym/evaluation/agents/openpatcher_chat.py \
src/cybergym/evaluation/agents/openpatcher_chat_stream_renderer.py \
tests/evaluation/test_user_evaluator.py \
tests/scripts/test_summarize_openpatcher_results.py \
tests/task/test_local_chunk_parser_ghidra.py
python scripts/summarize_openpatcher_results.py \
out/four-task-mini-paper-20260707
UV_BIN=/home/tdx2/.local/bin/uv \
bash scripts/validate_binary_slice.sh \
--controller http://172.17.0.1:8666 \
--task user:local/ret2win_basic \
--exploit data/tasks/user/local/ret2win_basic/solve.py
UV_BIN=/home/tdx2/.local/bin/uv \
bash scripts/validate_ghidra_slice.sh \
--out-dir out/chunk-parser-ghidra-gpt55-binary-20260707-v2 \
--task user:local/chunk_parser_ghidra
EXPLOITGYM_CTF_SANDBOX=1 \
scripts/validate_shelldiet_sandbox.sh \
--controller http://127.0.0.1:8666
# Kimi Code subscription route, direct mode (add --binary-only for the
# binary-only variant). Requires api.kimi.com in the firewall allowlist.
OPENAI_API_KEY=sk-kimi-... \
uv run examples/run_agent.py \
--agent openpatcher_chat \
--model kimi-for-coding \
--tasks-file data/task_ids/ready.txt \
--use-api-key \
--api-base-url https://api.kimi.com/coding/v1 \
--controller-url http://172.17.0.1:8666 \
--use-firewall \
--out-dir out/kimi-smoke