Scalable Weak-to-Strong Verifier Hardening for Agent Environments
Organizations: Stanford University · Carnegie Mellon University · Fewshot Corp · Independent Researcher
Abstract
Agent environments are essential for large language model (LLM) development. They use programmatic verifiers to turn complex outcomes into rewards. Verifiers can be attacked into awarding full credit to cheating agents without completing the intended task, causing inaccurate evaluation and misalignment in training. As agent environments scale in numbers and difficulty, so must the repairing of exploitable verifiers. To this end, we ask whether today's model with scaled compute can automatically harden agent environments to prevent potentially stronger future models from reward hacking. We introduce a scalable, fully automatic approach to weak-to-strong verifier hardening. It first sets up an isolated verifier sandbox that agents cannot directly modify, then uses a hacker-fixer loop to find and repair remaining verifier vulnerabilities. We apply this loop to Terminal Bench, KernelBench, and SETA, substantially reducing attack success across these agent environments. The iterative design scales with the hardening budget, producing progressively stronger defenses as the number of loop iterations increases and outperforming the static, non-iterative baseline. An earlier version of our hacker-fixer loop has been adopted by the official Terminal Bench repository as a way to audit exploits in its environments. Project page: https://verifier-hardening.github.io/.
Figures & tables
| Evaluator | State | Benign | Unhinted ASR | Hinted ASR | Verifier-aware ASR |
|---|---|---|---|---|---|
| GPT-5.6-Sol | Before | 97.1 / 90.5 | 68.6 / 43.5 | 99.0 / 88.2 | 98.0 / 82.4 |
| AutoSep | 98.0 / 91.2 | 31.4 / 19.9 | 4.9 / 3.9 | 96.1 / 89.9 | |
| After | 99.0 / 92.5 | 12.7 / 7.8 | 3.9 / 2.3 | 61.8 / 49.3 | |
| Opus 5 | Before | 96.1 / 93.1 | 87.3 / 69.9 | 100.0 / 95.4 | 100.0 / 99.3 |
| AutoSep | 99.0 / 94.4 | 47.1 / 30.1 | 27.5 / 18.3 | 99.0 / 96.1 | |
| After | 98.0 / 91.2 | 17.6 / 12.1 | 6.9 / 5.2 | 71.6 / 63.1 |
| Strategy | Benign | Unhinted ASR | Hinted ASR | Verifier-aware ASR |
|---|---|---|---|---|
| Original (shared) | 96.1 / 93.1 | 87.3 / 69.9 | 100.0 / 95.4 | 100.0 / 99.3 |
| AutoSep (iter 0) | 99.0 / 94.4 | 47.1 / 30.1 | 27.5 / 18.3 | 99.0 / 96.1 |
| Static-15, gated | 98.0 / 93.8 | 38.2 / 24.5 | 22.5 / 15.4 | 87.3 / 83.3 |
| Static-15, ungated | 88.2 / 83.0 | 27.5 / 18.6 | 12.7 / 8.8 | 78.4 / 72.5 |
| Full (final) | 98.0 / 91.2 | 17.6 / 12.1 | 6.9 / 5.2 | 71.6 / 63.1 |
| State | Benign | Unhinted ASR | Hinted ASR | Verifier-aware ASR |
|---|---|---|---|---|
| Original (shared) | 96.1 / 93.1 | 87.3 / 69.9 | 100.0 / 95.4 | 100.0 / 99.3 |
| 0 (separated) | 99.0 / 94.4 | 47.1 / 30.1 | 27.5 / 18.3 | 99.0 / 96.1 |
| 2 | 99.0 / 92.8 | 28.4 / 18.3 | 14.7 / 10.5 | 84.3 / 76.8 |
| 5 | 98.0 / 91.8 | 19.6 / 13.1 | 9.8 / 7.2 | 79.4 / 72.9 |
| 10 | 97.1 / 91.5 | 18.6 / 12.7 | 9.8 / 7.2 | 74.5 / 67.0 |
| 15 (final) | 98.0 / 91.2 | 17.6 / 12.1 | 6.9 / 5.2 | 71.6 / 63.1 |
| Evaluator | State | Benign | Unhinted ASR | Hinted ASR | Verifier-aware ASR |
|---|---|---|---|---|---|
| GPT-5.6-Sol | Before | 100.0 / 95.6 | 100.0 / 85.5 | 98.1 / 88.7 | 100.0 / 95.6 |
| AutoSep | 100.0 / 98.7 | 0.0 / 0.0 | 0.0 / 0.0 | 100.0 / 96.9 | |
| After | 100.0 / 96.9 | 0.0 / 0.0 | 0.0 / 0.0 | 90.6 / 62.9 | |
| Opus 5 | Before | 100.0 / 98.7 | 98.1 / 93.1 | 90.6 / 67.9 | 100.0 / 98.1 |
| AutoSep | 100.0 / 100.0 | 7.5 / 3.1 | 11.3 / 3.8 | 98.1 / 92.5 | |
| After | 100.0 / 98.1 | 0.0 / 0.0 | 0.0 / 0.0 | 88.7 / 81.1 |
| Evaluator | State | Benign | Unhinted ASR | Hinted ASR | Verifier-aware ASR |
|---|---|---|---|---|---|
| GPT-5.6-Sol | Before | 96.1 / 94.2 | 89.0 / 69.0 | 99.4 / 93.1 | 96.1 / 80.6 |
| AutoSep | 93.5 / 91.2 | 63.2 / 46.9 | 4.5 / 3.0 | 92.3 / 86.5 | |
| After | 96.1 / 90.3 | 31.0 / 20.2 | 2.6 / 1.9 | 82.6 / 66.2 | |
| Opus 5 | Before | 96.8 / 95.3 | 99.4 / 90.1 | 100.0 / 98.7 | 100.0 / 98.9 |
| AutoSep | 98.1 / 96.3 | 76.8 / 62.8 | 54.2 / 39.1 | 98.1 / 95.1 | |
| After | 94.8 / 90.3 | 50.3 / 35.1 | 23.9 / 15.9 | 86.5 / 74.2 |
| Group | Configuration | Benign | Unhinted ASR | Hinted ASR | Verifier-aware ASR |
|---|---|---|---|---|---|
| Original (shared) | 96.1 / 93.1 | 87.3 / 69.9 | 100.0 / 95.4 | 100.0 / 99.3 | |
| Full | 98.0 / 91.2 | 17.6 / 12.1 | 6.9 / 5.2 | 71.6 / 63.1 | |
| Hardening capability | w/o verifier access | 99.0 / 93.8 | 45.1 / 25.8 | 27.5 / 15.7 | 96.1 / 91.2 |
| Fixed output spec. | 99.0 / 93.8 | 37.3 / 24.2 | 22.5 / 14.1 | 96.1 / 86.6 | |
| w/o separation | 96.1 / 91.2 | 53.9 / 33.3 | 94.1 / 82.0 | 97.1 / 92.8 | |
| Benign validity | w/o corpus replay | 93.1 / 87.6 | 19.6 / 9.5 | 7.8 / 4.9 | 77.5 / 65.7 |
Appendix figures & tables7 assets
Supplementary material from the paper’s appendix.
Appendix
| Parameter | Terminal Bench / SETA | KernelBench |
|---|---|---|
| Model | GPT-5.6-Luna | GPT-5.6-Terra |
| Maximum iterations per hardening pass ( ) | 15 | 15 |
| Attack attempts per iteration ( ) | 3 | 3 |
| Additional fixer retries ( ) / maximum candidates | 3 / 4 | 3 / 4 |
| Attack reward threshold ( ) | 1.0 | 10.0 |
| In-loop solver reward threshold ( ) | 1.0 | 0.5 |
| Benchmark | Benign reward | Attack reward |
|---|---|---|
| Terminal Bench / SETA | ||
| KernelBench |
| State | Full | w/o verifier access | Fixed output spec. | w/o separation |
|---|---|---|---|---|
| Pristine | 87.3 / 69.9 | 87.3 / 69.9 | 87.3 / 69.9 | 87.3 / 69.9 |
| Iter 0 | 47.1 / 30.1 | 47.1 / 30.1 | 47.1 / 30.1 | 87.3 / 69.9 |
| Iter 2 | 28.4 / 18.3 | 44.1 / 26.8 | 44.1 / 29.1 | 78.4 / 60.8 |
| Iter 5 | 19.6 / 13.1 | 43.1 / 24.2 | 41.2 / 27.5 | 65.7 / 48.7 |
| Iter 10 | 18.6 / 12.7 | 43.1 / 24.2 | 40.2 / 24.8 | 57.8 / 38.9 |
| Iter 15 | 17.6 / 12.1 | 45.1 / 25.8 | 37.3 / 24.2 | 53.9 / 33.3 |
| State | Full | w/o corpus replay | w/o validation |
|---|---|---|---|
| Pristine | 96.1 / 93.1 | 96.1 / 93.1 | 96.1 / 93.1 |
| Iter 0 | 99.0 / 94.4 | 99.0 / 94.4 | 99.0 / 94.4 |
| Iter 2 | 99.0 / 92.8 | 95.1 / 88.6 | 79.4 / 74.8 |
| Iter 5 | 98.0 / 91.8 | 94.1 / 87.9 | 72.5 / 70.9 |
| Iter 10 | 97.1 / 91.5 | 91.2 / 86.9 | 72.5 / 70.9 |
| Iter 15 | 98.0 / 91.2 | 93.1 / 87.6 | 73.5 / 71.2 |
| Benchmark | Configuration | Tasks | Total | Mean/task |
|---|---|---|---|---|
| Terminal Bench | Full | 105 | 152.59 | 1.45 |
| SETA | Full | 155 | 255.66 | 1.65 |
| KernelBench | Full | 53 | 234.49 | 4.42 |
| Terminal Bench | w/o verifier access | 105 | 56.40 | 0.54 |
| Fixed output spec. | 105 | 104.80 | 1.00 | |
| w/o separation | 105 | 134.12 | 1.28 |
| Role | Inputs and conditional additions |
|---|---|
| Hacker | Original instruction; attack goal; current verifier source and output specification; within-round failure feedback; shared notes on KernelBench . |
| Fixer | Original instruction; attack evidence; current environment; boundary-repair instructions; reference and selected corpus examples; defense guidance; previous rejection evidence; shared notes on KernelBench . |
| Precheck solver | Original instruction plus reference-solution hint. |
| Fresh blind solver | Original instruction, without reference or verifier-source hints. |
| Diagnostic solver | Original instruction plus the failed candidate’s verifier source; result used only for failure feedback. |
| Patch reviewer | Original instruction, source context, and before/after patch evidence. |
AI Agent Security
Artificial intelligence agent security studies attacks and safeguards for tool-using, persistent, and collaborative systems across digital and physical settings.
See all 517 papers