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