CheckerBench: AI가 버그 탐지기를 끝까지 만들어 낼 수 있을까
취약 코드와 수정 코드를 구분하고 오탐까지 점검하는 300개 과제로, 코딩 에이전트가 재사용 가능한 정적 분석 검사기를 만드는 능력을 평가했습니다.
쉽게 말하면비유하자면 정비사에게 고장 난 차와 고친 차를 나란히 보여 주고, 같은 고장을 다음에도 잡아낼 점검 도구를 직접 만들게 한 시험이다. 도구가 고장은 잡고 멀쩡한 곳에서는 헛경보를 내지 않아야 합격이다. 가장 잘한 조합도 절반을 넘기지 못했다.
- 왜 봐야 하나
- AI 코딩 에이전트에게 보안 검사기 제작을 맡기려는 사람에게 현재 수준을 보여 준다. 평균 합격률은 32.30%였다. 다만 수정 패치와 코드 문맥을 미리 준 시험이다. 모르는 취약점을 스스로 찾는 능력을 잰 것은 아니다.
이 논문은 대규모 언어 모델 기반 코딩 에이전트가 실제 소프트웨어 저장소에서 정적 분석 검사기를 처음부터 끝까지 합성할 수 있는지 평가하는 CheckerBench 벤치마크를 소개한다. 297개 CVE에서 파생된 300개 과제를 7개 모델과 3개 에이전트 하네스의 21개 조합으로 실험한 결과, 평균 Pass@1은 32.30%에 그쳤고 최고 성능도 45.33%에 머물러 현재 에이전트가 재사용 가능한 검사기를 안정적으로 만드는 데 큰 어려움을 겪고 있음을 보여준다.
알아낸 것
- 7개 모델과 3개 하네스(에이전트를 돌리는 틀)를 짝지은 21개 조합의 평균 합격률(Pass@1)은 300개 과제 기준 32.30%였다. 가장 높은 조합인 Claude Opus 4.8과 OpenCode도 45.33%에 그쳤다.
- 검사기가 빌드된 비율은 78.25%, 취약 코드와 수정 코드를 구분한 비율은 73.65%였다. 이 구분 비율과 최종 합격률 32.30%의 차이는 41.35%포인트다. 헛경보(오탐) 억제 같은 나머지 조건이 더 어려웠다는 뜻이다.
- 같은 모델도 하네스에 따라 성적이 달랐다. 하네스별 평균 합격률은 OpenCode 36.95%, Hermes Agent 26.14%였다. 언어별로는 모든 모델이 C/C++에서 가장 낮았다.
한계와 주의할 점
- 수정 패치와 코드 문맥을 미리 준 상태에서 검사기를 만드는 과제다. 아무 정보 없이 새 취약점을 찾아내는 성공률이나 실제 소프트웨어의 보안 수준을 보여 주지는 않는다.
- 합격 여부는 실행 검사만으로 정하지 않고 AI 모델이 과정의 품질과 헛경보 여부도 판정했다. 사람 검증과의 일치도 지표는 0.85로 보고됐지만 전부 기계적으로 확정된 점수는 아니다.
- AI가 학습 때 이미 본 취약점일 가능성을 점검했지만 없다고 증명하지는 못했다. Claude Opus 4.8 출시 뒤에 공개된 취약점으로 만든 과제는 300개 중 3개뿐이다.
용어 풀이
- 정적 분석 검사기
- 프로그램을 실행하지 않고 소스 코드에서 특정 결함 패턴을 탐지하는 규칙 또는 플러그인. 이 연구에서는 에이전트가 합성해야 할 최종 산출물이다.
- Pass@1
- 한 번의 독립적인 합성 실행 후 검사기가 전체 평가를 통과한 과제의 비율. 이 벤치마크의 주요 지표로, 3회 반복 실행의 평균을 사용한다.
- 차등 검증
- 제출한 검사기를 취약 코드와 수정 코드에 각각 실행해 결함 관련 진단이 수정 뒤 사라지거나 구분되는지 확인하는 절차. 분석기별 규칙과 패치 관련성도 검사하므로, 경고 수만 단순 비교하는 평가는 아니다.
- 오탐률
- 보고된 경고 중 실제 결함이 아닌 비율. 표의 FPpass는 합격 검사기의 기록된 경고 중 판정이 끝난 것을 모아 계산한다. 개별 검사기의 합격 여부는 별도로 추출한 mainline 경고 표본의 오탐 비율이 기본 25% 이하인지 검사한다.
- 에이전트 하네스
- LLM에 도구 사용, 저장소 탐색, 코드 편집, 실행 피드백 등의 능력을 제공하는 프레임워크. OpenCode, Claude Code, Hermes Agent가 사용되었다.
더 깊이 읽기 읽는 데 약 7분
배경과 문제
정적 분석은 프로그램을 실행하지 않고 코드의 결함을 찾는 기술이다. 기존 정적 분석기는 사람이 직접 작성한 검사기에 의존하는데, 결함 패턴과 분석 전략을 도구별 규칙으로 인코딩하려면 상당한 전문 지식과 노력이 필요하다. 최근 대규모 언어 모델(LLM)이 코드 이해와 결함 탐지에 활용되고 있지만, 코드 조각에 직접 적용하면 추론 비용이 높고 저장소 전체 맥락에 접근하기 어려워 불완전한 추론이나 환각된 결과를 낳을 수 있다.
이를 극복하기 위해 코딩 에이전트는 LLM에 저장소 탐색, 코드 편집, 도구 실행, 피드백 기반 개선 능력을 더한다. 이론적으로는 결함 명세가 주어지면 에이전트가 분석기 구조를 파악하고 검사기 로직을 구현한 뒤 컴파일러와 분석기 피드백을 반복적으로 활용해 검사기를 다듬을 수 있다. 그러나 검사기 합성은 복잡한 분석기 프레임워크를 이해하고 여러 파일에 걸쳐 조정된 수정을 가하며, 결과물이 컴파일되고 목표 결함을 탐지하면서 오탐률은 낮게 유지해야 하는 장기 과제다. 이 논문은 이를 '장기 에이전트 정적 분석 검사기 합성'이라고 부른다.
기존 접근의 한계
기존 코딩 및 취약점 벤치마크는 검사기 중심이 아니다. 저장소 수준 벤치마크는 코드 완성, 패치 생성, 기능 구현을 평가하고, 취약점 벤치마크는 탐지·분류·수리에 초점을 맞춘다. 재사용 가능한 검사기 합성을 평가하는 경우는 드물다. 또한 기존 벤치마크는 과제 상호작용이 제한적이어서 에이전트가 검사기 개발에 필요한 반복적 계획·구현·디버깅을 수행하지 못하게 한다.
벤치마크마다 환경, 도구 인터페이스, 평가 프로토콜이 크게 달라 시스템 간 결과 비교가 어렵다. 평가 지표도 패치 수준 정확성이나 테스트 스위트 결과만 측정할 뿐, 취약점 커버리지, 오탐 제어, 분석기 호환성 같은 검사기 고유 속성을 포착하지 못한다. CheckerBench는 이러한 네 가지 격차를 메우기 위해 통합 벤치마크를 제안한다.
연구방법을 단계별로
CheckerBench는 6단계 파이프라인으로 구축된다. 먼저 공개 CVE 기록을 오픈소스 저장소의 수정 커밋과 연결해 취약·수정 리비전 쌍을 복구한다. 다음으로 고정된 도구 체인과 분석기(Clang Static Analyzer, CodeQL)로 두 리비전을 격리된 작업 공간에서 재구성해 실행 가능한 환경을 만든다. 그런 다음 패치, 수정 전후 함수, 빌드 메타데이터, 컴파일·스캔 명령, 최소 검사기 스캐폴드를 묶어 과제를 패키징한다.
독립 검증기는 제출된 검사기를 깨끗한 작업 공간에서 소스로부터 다시 빌드하고 취약·수정 리비전에서 진단 대비와 패치 관련성을 확인한다. 사람이 개입하는 교정 궤적 수집 단계에서는 실패한 시도 후 사람이 검증 증거를 진단하고 프롬프트 지침을 수정해 재실행한다. 마지막으로 품질 관리, 중복 제거, 분할을 거쳐 300개 과제가 확정된다. 평가 프레임워크인 CheckerLab은 합성 단계와 독립 검증 단계를 분리해 공정성을 높인다. 본 평가에서는 각 실행에 50분의 생성 예산을 주며, 종료한 소스와 기록을 고정한 뒤 새 환경에서 검사한다. 빌드와 취약·수정 코드의 차이만으로 합격시키지는 않는다. Claude Opus 5가 과정의 품질, 취약점 의미, 표본 경고의 오탐 여부도 판정한다. 사람 검증과의 일치도는 합동 Cohen의 κ=0.85로 보고됐으므로, 실행 검사를 포함하더라도 전부 기계적으로 확정되는 평가로 읽어서는 안 된다.
결과와 숫자의 의미
21개 모델–하네스 조합에서 평균 Pass@1은 32.30%이고, 최고 조합인 Claude Opus 4.8과 OpenCode는 45.33%를 기록했다. 전체 빌드 성공률은 78.25%, 차등 검증 성공률은 73.65%로 훨씬 높다. 차등 검증과 Pass@1의 격차는 41.35%포인트로, 빌드와 차등 검증의 격차 4.60%포인트보다 훨씬 크다. 이는 의미적 충실도, 프로세스 품질, 오탐 제어, 정상 완료 같은 추가 요구사항을 충족하는 것이 어렵다는 뜻이다.
하네스 선택에 따라 성능과 모델 순위가 크게 달라진다. OpenCode의 평균 Pass@1이 36.95%로 가장 높고, Hermes Agent는 26.14%로 10.81%포인트 차이가 난다. Kimi-K3는 OpenCode에서 38.67%지만 Hermes Agent에서는 24.33%로 14.34%포인트 하락한다. 언어별 수치는 각 모델의 세 하네스 결과를 동일 가중 평균한 것으로, 모든 모델이 C/C++에서 가장 낮은 Pass@1을 보였고, 최고 모델인 DeepSeek-V4-Pro도 24.53%에 그쳤다. C/C++ 과제는 159개로 전체의 절반 이상을 차지해 전체 성공률에 큰 영향을 미친다.
구체적인 예시
FFmpeg의 PNG 버퍼 오버플로 과제(CVE-2017-7866)는 취약 리비전에서 av_bprint_get_buffer를 1바이트로 호출해 버퍼가 가득 차면 NUL 종료 문자가 범위를 벗어나는 문제를 보여준다. 수정 리비전은 2바이트를 요청하고 avail_out을 buf_size-1로 설정해 종료 문자를 위한 공간을 남긴다. 생성된 CSA 검사기는 버퍼 용량과 inflate() 호출 시 avail_out을 추적해 취약 리비전에서 1개, 수정 리비전에서 0개의 경고를 보고한다.
TorchServe의 Zip Slip 과제(CVE-2023-48299)는 아카이브 추출 중 경로 탈출을 탐지하는 CodeQL 쿼리를 요구한다. 에이전트는 패치를 읽고 Files.newOutputStream(...)으로 이어지는 아카이브 이름을 추적한 뒤 ZipSlipFlow를 재사용해 쿼리를 구현한다. 초기 검증에서 취약 1, 수정 0의 대비를 확인했지만, Commons 타입이 해석되지 않아 JDK ZIP 흐름만 관찰 가능하다는 범위 제한을 진단한다. 최종 쿼리는 ZIP 전용 범위를 유지하며 1→0 대비를 안정적으로 재현한다.
한계와 오해하기 쉬운 점
이 벤치마크는 수정 패치와 코드 문맥이 주어진 상태에서 검사기를 합성하는 과제다. 미지의 취약점을 아무 정보 없이 찾는 성공률이나 실제 모든 소프트웨어의 보안 수준을 나타내지 않는다. 공개된 300개 교정 궤적에는 실패 진단과 프롬프트 수정을 위한 사람 개입이 포함되어 있어, 교정 궤적과 독립 평가 실행을 구분해야 한다.
실험은 7개 모델×3개 하네스의 21개 조합이 각각 같은 300과제를 3회 독립 실행한 Pass@1 평균이다. 최고 45.33%와 전체 평균 32.30%는 이 설정의 결과다. 데이터 오염도 점검했지만, CVE 공개일이 Claude Opus 4.8 출시 이후인 과제는 300개 중 3개뿐이며 코드나 패치는 더 먼저 공개됐을 수도 있다. 별도 100개 언어별 층화 과제에서 식별자를 보존한 바꿔 쓰기와 의미를 유지한 식별자 치환을 비교하자, Claude Opus 4.8의 Pass@1은 3퍼센트포인트 낮아졌다. 이 개입에서 친숙한 식별자의 영향이 작았다는 관찰이지, 학습 데이터 오염이 없다는 증명은 아니다.
실제로 어떻게 활용할까
CheckerBench는 취약점 명세를 신뢰할 수 있는 재사용 검사기로 바꾸는 에이전트를 위한 재현 가능한 테스트베드를 제공한다. 연구자나 실무자는 이 벤치마크를 사용해 새로운 모델이나 하네스의 검사기 합성 능력을 비교하고, 언어·결함 유형별 성능을 분석할 수 있다. 특히 C/C++ 과제가 공통 난제로 확인되어 CSA 기반 검사기 개발에 집중할 필요가 있다.
실무 적용 시에는 Pass@1뿐 아니라 빌드 성공률, 차등 검증 성공률, 오탐률, 프로세스·의미 점수, 상호작용 효율성을 함께 고려해야 한다. 예를 들어 Kimi-K3는 Claude Code에서 DeepSeek-V4-Pro와 거의 같은 Pass@1을 달성하면서 성공한 궤적들에서 도구 호출을 38.2% 적게 사용했다. 실패한 실행까지 포함한 전체 비용 절감률이나 모든 배포 환경의 효율 향상으로 해석하면 안 된다. 또한 스킬 라이브러리와 실행 피드백이 성능에 큰 영향을 미치므로, 에이전트 배포 시 이러한 지원 요소를 포함하는 것이 중요하다.
원문에서 확인한 근거 6곳
- CheckerBench는 297개 CVE, 167개 저장소, 85개 CWE, 5개 언어 생태계에서 파생된 300개 과제를 포함한다.Abstract
- 21개 모델–하네스 구성에서 평균 Pass@1은 32.30%이고 최고는 45.33%이다.Abstract
- 전체 빌드 성공률은 78.25%, 차등 검증 성공률은 73.65%이며, 차등 검증과 Pass@1의 격차는 41.35%포인트다.5.2 Overall Performance
- 모든 모델이 C/C++에서 가장 낮은 Pass@1을 보였고, 최고 모델인 DeepSeek-V4-Pro도 24.53%에 그쳤다.Language and defect-family variation
- Kimi-K3는 Claude Code에서 DeepSeek-V4-Pro와 거의 같은 Pass@1을 달성하면서 성공 궤적에서 도구 호출을 38.2% 적게 사용했다.Success and interaction efficiency
- Claude Opus 4.8은 300개 과제 중 3개의 CVE가 모델 출시 이후 공개됐으며, 별도 100개 층화 과제의 P–D 식별자 치환 비교에서는 Pass@1 차이가 3퍼센트포인트였다.Contamination and Prior Exposure
10월 8일(목) 정리 · AI가 쓰고 원문과 대조