
RedbudAI: Reproducing 86.2% of 1,507 Real-World Vulnerabilities on CyberGym with a Single-Model Agent
RedbudAI: Reproducing 86.2% of 1,507 Real-World Vulnerabilities on CyberGym with a Single-Model Agent
Abstract. RedbudAI is the AI-focused initiative of the Redbud team at Tsinghua University. In this work, we present our solution for autonomous vulnerability reproduction, a general-purpose agent system powered by a single model, GLM-5.2. CyberGym Level 1 is a benchmark comprising 1,507 real-world vulnerabilities. Each task requires reproducing a known bug as a working proof of concept (PoC) that crashes the vulnerable program but not its patched version.
Our solution solved 1,300 of 1,507 tasks (86.2% pass@1). Within the same pass@1 run, 1,410 of 1,507 final PoCs crashed the vulnerable build at all, regardless of the outcome on the fixed build (93.56%; §4). A supplementary analysis (§7) independently reruns the 202 pass@1 failures and resolves 106 additional tasks, yielding an aggregate pass@k (k≤5) of 1,411/1,507 (93.6%); we report this only as a diagnostic of benchmark ambiguity. The evaluation was conducted under strict network isolation, with no public-web access and no hidden ground truth. Total GLM-5.2 spending for the full evaluation was approximately 78,000 CNY (about US$10.7k).
1. Background
CyberGym tests whether an agent can reproduce real-world vulnerabilities using the materials a security engineer would actually have: a vulnerability description and the pre-patch source tree. Each Level-1 task is scored based on hard evidence: a PoC that crashes the vulnerable build while remaining clean on the fixed build. With 1,507 real vulnerabilities across the arvo and oss-fuzz families, it is one of the strongest public benchmarks for evaluating agent behavior based on reproducible outcomes.
2. System and method
Execution environment. Our solution runs inside a per-task Docker sandbox. The agent is given a minimal output contract derived from the CyberGym general-agent prompt: work within the task workspace, follow the provided task instructions, write exactly one PoC to the final output path, and hand it to the benchmark’s official evaluation interface exactly once. Each task has a hard 8-hour budget.
Model. All reasoning is performed by GLM-5.2 (Z.AI), served through a private internal gateway. Both the agent’s main loop and its background requests use this single model, so token usage and cost can be attributed unambiguously to GLM-5.2.
Tools. The agent is equipped with shell access, file read/write/edit capabilities, notebook editing, sub-agent management, task-specific skills, and related tools. Web fetch and web search are unavailable. A memory bank of notes is mounted into every task and accumulates over the course of the evaluation: failure patterns observed across tasks are periodically distilled into new generic notes, which become available to later tasks and to the retry rounds described in §7. Entries are pattern-matched from failure categories and are never copied from a specific task’s outcome—the memory never contains task-specific solutions, prior PoCs, or DEDUP_TOKENs.
Dynamic verification loop. Before beginning iterative refinement, the agent reads description.txt and the pre-patch source and writes a target specification: a milestone chain from the fuzz entrypoint to the function it hypothesizes to be buggy (entrypoint → intermediate call path → primary target), with up to three retries if the specification fails validation. The agent then iterates against a runnable copy of the vulnerable build for up to 100 rounds. Each candidate PoC is first checked locally, using coverage guidance, against those milestones on a coverage-instrumented binary; it is then executed against the task’s sanitizer-instrumented binary to check for a crash, and any resulting crash is assessed by a three-vote LLM Judge against description.txt.
If 25 rounds pass without progress toward the primary milestone, the target specification is regenerated, up to two times, rather than allowing the agent to continue iterating blindly. Only a Judge-approved PoC—or, rarely, one flagged by an anti-stagnation fallback—is written to the final output path and submitted to CyberGym’s server. The up-to-100-round limit applies only to internal refinement, not to submissions. This constitutes a runnable dynamic-analysis environment under CyberGym FAQ Q5: the agent has direct access to the vulnerable build’s compiled binaries, rather than to source code alone. Known leakage sources are removed before the agent starts, including /src/**/.git (version-control history) and the reference PoC (/tmp/poc).
3. Experimental setting
Task environment. Each task provides the official Level-1 workspace: a vulnerability description, the pre-patch source archive, and the benchmark’s evaluation script. The agent never sees the post-patch (fixed) source, patches, or ground-truth answers. Leakage controls remove version-control history and any reference PoC from the workspace.
Verification flow. The benchmark uses a dual-oracle check: the final PoC must crash the vulnerable build while remaining clean on the fixed build. This check runs server-side after the agent submits the PoC. Every task is scored based on that single final PoC.
Scale. The evaluation covered 1,507 tasks (1,368 arvo + 139 oss-fuzz), with one agent session per task, on a private deployment using fixed platform and benchmark versions.
4. Results and metrics
| Metric | Value |
|---|---|
| Tasks | 1,507 |
| Success (Pass@1) | 1,300 solved (86.2%) |
| Pass@k (k≤5) | 1,411 solved (93.63%) |
| Crashed vulnerable build (any final PoC, regardless of fix outcome) | 1,410 crashed (93.56%) |
- Tasks: The full CyberGym Level-1 set we evaluated—1,507 tasks in total (1,368 arvo + 139 oss-fuzz; family breakdown below).
- Success (pass@1): Tasks whose single designated final PoC passed the official dual-oracle check—crashing the vulnerable build while remaining clean on the fixed build—in one attempt. This is the number we report as our primary result; the two rows below are supplementary and are not part of this metric.
- Pass@k (k≤5): Independently rerunning the 202 pass@1 failures in fresh containers, for up to five rounds each (see §7), resolves 106 additional genuine differential wins, in which the vulnerable build crashes while the fixed build remains clean. This brings the total to 1,411/1,507 (93.63%). We report this only as a diagnostic of benchmark ambiguity (§7).
- Crashed vulnerable build (regardless of fix outcome): Within the pass@1 run alone, this measures how many final PoCs produced some crash-shaped exit code on the vulnerable build, regardless of whether the same PoC remained clean on the fixed build. It is not a success count by itself: 105 of these 1,410 cases correspond exactly to the
fixed_crashfailures described below, where the same input crashes both builds. This is distinct from the Pass@k count above (1,411). The former asks whether some crash was triggered at all, potentially an unintended one, within the pass@1 run; Pass@k asks whether the correct differential crash was eventually found across independent reruns. - Pass@1 by family: arvo: 1,180/1,368 (86.2%); oss-fuzz: 125/139 (89.9%).
5. Cost
Costs are taken from the model gateway’s billing records for the evaluation window, which serve as the authoritative source for spending.
| Item | Total | Avg / task (÷1,507) |
|---|---|---|
| Model requests | 429,683 | 285.1 |
| Input tokens (non-cached) | 598,597,949 | 397,212 |
| Cache-read input tokens | 32,076,250,944 | 21,284,910 |
| Output tokens | 330,189,141 | 219,104 |
| Cost | ≈ 78,187 CNY | ≈ ¥51.9 (~US$7.11) |
| Wall-clock per task | N/A | 1,670.4 s |
6. Security disclosure
We report the operational controls that make these results meaningful and reproducible:
- Network isolation. Outbound access is restricted through DNS-resolution blocking together with an egress allowlist anchored on the model gateway. Web fetch and web search are additionally disabled at the toolset level. We reviewed logs across all 1,507 tasks and found zero web-fetch or web-search tool calls. In the rare cases where the agent attempted to reach external hosts through shell commands, those attempts failed. The agent therefore has no reachable reward-hacking channel.
- No hidden ground truth. The agent sees only the vulnerability description and pre-patch source. The fixed source, patches, and answers are never present, and known leakage sources—including version-control history, reference PoCs, and container sockets—are removed before the agent starts. See §2 for the runnable dynamic-analysis environment that the agent does have access to under FAQ Q5.
- No shortcuts. Each task has one designated final PoC. There is no any-of credit, salvage credit, or retry credit counted toward the published pass@1 result. The published rate is the conservative lower bound described in §4.
- Data hygiene. We pattern-scanned all shipped content. One internal gateway key that had leaked into sandbox logs was redacted across all affected cases, and the published data contains zero residual real credential values.
7. Supplementary analysis: repeated attempts (pass@k)
Per FAQ Q3, the number we report as our primary result is pass@1 (§4): one designated final PoC per task, with no any-of or retry credit. Separately, and solely to characterize the residual gap, we reran the 202 pass@1 failures in fresh containers. Each rerun is itself a complete, independent pass@1 attempt—one final PoC followed by one server-side verification—not an additional candidate attached to the original attempt. Here, k denotes the number of independent rounds a task underwent (k≤5). This process resolves 106 additional tasks beyond the original 1,300, yielding an aggregate pass@k (k≤5) of 1,411/1,507 = 93.6%.
Part of this remaining gap appears to reflect non-determinism or ambiguity in the benchmark rather than agent capability alone. For example, arvo:18070’s description.txt reads in full: “The vulnerability occurs because the length is used before it is validated, rather than validating the length before use. This improper order can lead to security issues.” The description identifies a bug class and its consequence but does not specify a unique location. On the vulnerable build, more than one crafted input can satisfy the stated order-of-validation flaw, whereas the patch’s actual bounds check rules out only one of them. We therefore report pass@k solely as a diagnostic of this kind of ambiguity, rather than as our headline result.