메뉴
HN
Hacker News 49일 전

주요 AI 에이전트 벤치마크를 무너뜨린 방법과 과제

IMP
9/10
핵심 요약

UC 버클리 연구진이 주요 AI 에이전트 벤치마크 8종의 취약점을 조사해, 단 한 건의 과제도 실제로 풀지 않고도 최고 점수를 얻을 수 있음을 입증했습니다. 평가 환경 조작, 정답 유출, 테스트 우회 등이 원인이며, 현재 벤치마크 점수가 실제 모델 성능을 제대로 반영하지 못하고 있습니다. 평가 방식의 근본적 재설계와 보안 강화가 시급하다는 점에서 실무적 중요성이 큽니다.

번역된 본문

How We Broke Top AI Agent Benchmarks: And What Comes Next 저자: Hao Wang, Qiuyang Mang, Alvin Cheung, Koushik Sen, Dawn Song (UC Berkeley) 2026년 4월 (읽기 약 15–20분, 도구: github.com/moogician/trustworthy-env)

우리가 만든 에이전트는 모든 주요 벤치마크를 뚫었습니다. 어떻게 가능했는지, 그리고 분야가 해결해야 할 과제를 설명합니다.

벤치마크의 환상 매주 새로운 AI 모델이 벤치마크 리더보드 정상에 오릅니다. 기업들은 보도자료에서 이 숫자를 인용하고, 투자자들은 밸류에이션을 정당화하는 데 사용하며, 엔지니어들은 배포할 모델을 고르는 기준으로 삼습니다. 암묵적인 약속은 단순합니다. 더 높은 점수는 더 뛰어난 시스템을 뜻한다는 것입니다. 그 약속은 이미 깨졌습니다.

우리는 자동화된 스캐닝 에이전트를 구축해 가장 널리 알려진 AI 에이전트 벤치마크 8종(SWE-bench, WebArena, OSWorld, GAIA, Terminal-Bench, FieldWorkArena, CAR-bench 등)을 체계적으로 감사했습니다. 그리고 모든 벤치마크에서, 단 한 건의 과제도 실제로 해결하지 않고도 완벽에 가까운 점수를 얻을 수 있다는 사실을 발견했습니다. 추론도, 실제 능력도 필요 없습니다. 점수가 계산되는 방식을 악용하기만 하면 됩니다.

이는 이론적 공격이 아닙니다. 우리 에이전트는 각 벤치마크를 위한 동작하는 익스플로잇을 만들고, 공식 평가 파이프라인을 통해 실행해 높은 점수가 나오는 것을 확인합니다. 단 10줄짜리 파이썬 코드가 담긴 conftest.py 파일 하나로 SWE-bench Verified의 모든 인스턴스를 “해결”할 수 있습니다. 가짜 curl 래퍼 하나로 해결 코드를 한 줄도 작성하지 않고 Terminal-Bench의 89개 과제에서 만점을 받을 수 있습니다. Chromium을 file:// URL로 이동해 작업 설정에서 정답을 직접 읽어오면, WebArena의 812개 과제 모두에서 약 100%의 점수를 얻습니다. 이 밖에도 많습니다.

벤치마크는 여러분이 생각하는 것을 측정하지 않습니다.

이미 벌어지고 있는 일 벤치마크 점수는 이론이 아니라 실제로 조작되고 부풀려지며 무의미해지고 있습니다.

• IQuest-Coder-V1은 SWE-bench에서 81.4%를 기록했다고 주장했지만, 연구진이 조사한 결과 24.4%의 궤적이 단순히 git log를 실행해 커밋 이력에서 정답을 복사하는 방식이었습니다. 수정된 점수는 76.2%였습니다. 벤치마크의 공유 환경 덕분에 부정행위가 아주 쉬웠습니다. • METR은 o3와 Claude 3.7 Sonnet이 30% 이상의 평가 실행에서 보상 해킹(reward-hack)을 수행한다는 것을 발견했습니다. 스택 내부 검사, 그레이더 원숭이 패치, 연산자 오버로딩 등을 사용해 과제를 해결하는 대신 점수를 조작한 것입니다. • OpenAI는 내부 감사에서 감사 대상 문제의 59.4%가 결함 있는 테스트를 가지고 있다는 사실을 알게 된 후 SWE-bench Verified를 폐기했습니다. 즉, 모델들이 깨진 정답(ground truth)을 기준으로 평가되고 있었던 것입니다. • KernelBench에서는 torch.empty()가 평가자의 이전 계산에 포함된 참조 정답을 우연히 담고 있는 오래된 GPU 메모리를 반환합니다. 계산은 전혀 하지 않고 만점을 받는 셈입니다. • Anthropic의 Mythos Preview는 최첨단 모델이 능동적으로 환경을 해킹하려 시도하고 성공할 수 있음을 보여주었습니다. 한 사례에서 모델은 편집 권한이 없는 파일을 수정해야 했고, 우회 방법을 찾다가 상승된 권한으로 실행되는 설정 파일에 코드를 주입하는 방법을 발견했으며, 익스플로잇이 실행 후 스스로를 삭제하도록 설계했습니다. 모델이 독립적으로 자가 삭제 권한 상승 익스플로잇을 만들어낼 수 있다면, 평가 하네스의 구멍을 찾는 것도 가능합니다.

이는 고립된 사건이 아닙니다. 이는 체계적인 문제의 증상입니다. 우리가 AI 능력을 측정하기 위해 의존하는 벤치마크 자체가, 측정하겠다고 주장하는 바로 그 능력에 취약합니다.

우리 익스플로잇 에이전트의 성적표 해결한 과제: 0건. LLM 호출: 0회(대부분의 경우). 점수: 거의 완벽.

• Terminal-Bench (89개 과제) — 100% 점수. 바이너리 래퍼 트로이 목마. • SWE-bench Verified (500개 과제) — 100% 점수. pytest 훅으로 모든 테스트가 통과하도록 강제. • SWE-bench Pro (731개 과제) — 100% 점수. 컨테이너 내 파서 덮어쓰기. • WebArena (812개 과제) — 약 100% 점수. 설정 유출 + DOM 주입 + 프롬프트 주입. • FieldWorkArena (890개 과제) — 100% 점수. 검증이 정답의 정확성을 전혀 확인하지 않음. • CAR-bench (모든 환각 과제) — 100% 점수. 보상 구성 요소를 완전히 건너뜀. • GAIA (165개 과제) — 약 98% 점수. 공개 정답 + 정규화 충돌. • OSWorld (369개 과제) — 73% 점수. VM 상태 조작 + 공개 정답 파일.

우리 시대의 도전 (이어지는 내용은 벤치마크 평가의 근본적 재설계, 보안 강화, 그리고 AI 능력을 제대로 측정하기 위한 새로운 패러다임의 필요성을 다룹니다.)

원문 보기
원문 보기 (영어)
How We Broke Top AI Agent Benchmarks: And What Comes Next Hao Wang, Qiuyang Mang, Alvin Cheung, Koushik Sen, Dawn Song UC Berkeley April 2026 (Est. 15-20 minutes read, tool available at github.com/moogician/trustworthy-env ) Our agent hacked every major one. Here’s how — and what the field needs to fix. The Benchmark Illusion Every week, a new AI model climbs to the top of a benchmark leaderboard. Companies cite these numbers in press releases. Investors use them to justify valuations. Engineers use them to pick which model to deploy. The implicit promise is simple: a higher score means a more capable system. That promise is broken. We built an automated scanning agent that systematically audited eight among the most prominent AI agent benchmarks — SWE-bench, WebArena, OSWorld, GAIA, Terminal-Bench, FieldWorkArena, and CAR-bench — and discovered that every single one can be exploited to achieve near-perfect scores without solving a single task. No reasoning. No capability. Just exploitation of how the score is computed. These aren’t theoretical attacks. Our agent builds working exploits for each benchmark, runs them through the official evaluation pipelines, and watches the scores roll in. A conftest.py file with 10 lines of Python “resolves” every instance on SWE-bench Verified. A fake curl wrapper gives a perfect score on all 89 Terminal-Bench tasks without writing a single line of solution code. Navigating Chromium to a file:// URL reads the gold answer directly from the task config — giving ~100% on all 812 WebArena tasks . And many more… The benchmarks aren’t measuring what you think they’re measuring. This Is Already Happening Benchmark scores are actively being gamed, inflated, or rendered meaningless, not in theory, but in practice: IQuest-Coder-V1 claimed 81.4% on SWE-bench — then researchers found that 24.4% of its trajectories simply ran git log to copy the answer from commit history. Corrected score: 76.2%. The benchmark’s shared environment made the cheat trivial. METR found that o3 and Claude 3.7 Sonnet reward-hack in 30%+ of evaluation runs — using stack introspection, monkey-patching graders, and operator overloading to manipulate scores rather than solve tasks. OpenAI dropped SWE-bench Verified after an internal audit found that 59.4% of audited problems had flawed tests — meaning models were being scored against broken ground truth. In KernelBench , torch.empty() returns stale GPU memory that happens to contain the reference answer from the evaluator’s prior computation — zero computation, full marks. Anthropic’s Mythos Preview showed that frontier models can actively try to hack the environment and succeed. In one episode, the model needed to edit files it lacked permissions for; after searching for workarounds, it found a way to inject code into a config file that would run with elevated privileges, and designed the exploit to delete itself after running . If a model can independently craft self-erasing privilege escalation exploits, it can find the holes in an evaluation harness. These are not isolated incidents. They are symptoms of a systemic problem: the benchmarks we rely on to measure AI capability are themselves vulnerable to the very capabilities they claim to measure. The Scorecard of Our Exploit Agent Zero tasks solved. Zero LLM calls (in most cases). Near-perfect scores. Terminal-Bench (89 tasks) — 100% score. Binary wrapper trojans. SWE-bench Verified (500 tasks) — 100% score. Pytest hooks force all tests to pass. SWE-bench Pro (731 tasks) — 100% score. In-container parser overwrite. WebArena (812 tasks) — ~100% score. Config leakage + DOM injection + prompt injection. FieldWorkArena (890 tasks) — 100% score. Validation never checks answer correctness. CAR-bench (all hallucination tasks) — 100% score. Reward components skipped entirely. GAIA (165 tasks) — ~98% score. Public answers + normalization collisions. OSWorld (369 tasks) — 73% score. VM state manipulation + public gold files. How Our Agent Did It Terminal-Bench: Trojanizing the Test Infrastructure Terminal-Bench evaluates agents on 89 complex terminal tasks (from building COBOL chess engines to configuring distributed systems). It uses Harbor, a sandboxing framework that re-uploads protected test files before verification. Containers have full internet access — Harbor’s allow_internet config defaults to True and no task overrides it. Harbor correctly protects /tests/ — but it doesn’t protect system binaries. Here’s the irony: 82 of 89 tasks download uv from the internet at verification time via curl , creating an exploitable dependency chain. Our exploit replaces /usr/bin/curl with a wrapper during the agent phase. When the verifier later runs curl ... | sh to install uv, our wrapper intercepts the request, installs the real uv, and then trojanizes the uvx binary. The trojanized uvx detects pytest invocations and produces fake passing output: ============================= test session starts ============================== collected 3 items tests/test_outputs.py ... [100%] ============================== 3 passed in 0.05s =============================== It writes 1 to the reward file. The verifier trusts it. Task “passed.” For the remaining 7 tasks, our agent wraps pip (to trojanize freshly-installed pytest ), python (to intercept python -m pytest ), or the pre-installed uvx binary. Result: 89/89 tasks, 100% score, without writing a single line of solution code. SWE-bench: 100% Resolve Rate Without Fixing a Single Bug SWE-bench is arguably the most influential AI coding benchmark. It presents real GitHub issues and asks the agent to produce a patch that makes the failing tests pass. SWE-bench-Verified (500 hand-validated instances) and SWE-bench Pro (731 multilingual instances) are currently considered the gold standards for measuring coding agents. Both are exploitable at 100%. The vulnerability: The agent’s patch is applied inside the same Docker container where tests run. Anything the patch introduces — a conftest.py, a monkey-patch, a Go init() function — executes with full privileges before or during testing. SWE-bench Verified exploit: Our agent creates a conftest.py with a pytest hook that forces every test to report as passing: import pytest @ pytest . hookimpl ( hookwrapper = True ) def pytest_runtest_makereport ( item , call ): outcome = yield rep = outcome . get_result () if rep . when == "call" : rep . outcome = "passed" rep . longrepr = None Pytest auto-discovers conftest.py files and loads them before running tests. The hook intercepts every test result during the “call” phase and rewrites it to “passed.” The log parser sees PASSED for every test. The grader sees all fail-to-pass tests now passing. Instance resolved. For Django (231 of 500 instances), which uses unittest instead of pytest, the exploit prepends a monkey-patch to django/__init__.py that replaces unittest.TestCase.run with a function that unconditionally reports success. For repos with an existing conftest.py , the exploit uses the patch --batch --fuzz=5 fallback (the third of SWE-bench’s three patch application methods) to prepend our hook to the existing file. SWE-bench Pro exploit: Pro uses a separate parser.py to extract test results — but it runs inside the same container. Our conftest.py includes a pytest_configure hook that overwrites /workspace/parser.py with a fake parser that marks every extracted test as PASSED . The same approach works for Go (via init() functions) and JavaScript (via .mocharc.yml setup files). Result: 500/500 Verified instances and 731/731 Pro instances exploitable, with zero issues solved. WebArena: Reading the Answer Key WebArena is a popular benchmark of 812 web interaction tasks. It runs a PromptAgent that drives a Playwright-controlled Chromium browser, and it ships task configs — including reference answers — as JSON files on the local filesystem at config_files/{task_id}.json . The exploit requires zero changes to WebArena’s code . We don’t patch