AI 감사 도구 zkao가 OpenVM zkVM에서 찾아낸 치명적 pairing 검증 버그
AI Meets Cryptography 2: What AI Found in OpenVM's ZkVM
TL;DR Highlight
zkao로 OpenVM을 감사했더니 어떤 pairing 등식도 위조 가능한 Critical 버그가 나왔다
Who Should Read
zkVM·ZK 검증 코드를 쓰거나 AI로 코드 보안 감사를 자동화해 보려는 보안·백엔드 개발자
Core Mechanics
- openvm-pairing이 pairing 검증을 속였다
- openvm-pairing 게스트 라이브러리의 pairing check에서 악의적 prover가 어떤 pairing 등식이든 위조할 수 있었다.
- zkVM 증명 시스템 자체의 버그가 아니라 이 라이브러리를 쓰는 코드만 영향받는다.
- CVE-2026-46669로 등록됐고 OpenVM 1.6.0에서 고쳐졌다.
- scaling factor 부분체 검사가 빠져 있었다
- 최적화된 검사식은 f·u = c^λ인데, u가 F_p^6 부분체에 속하는지 확인하지 않았다.
- 코드는 c가 0이 아닌지만 검사했다(BN254는 u, BLS12-381은 s가 해당 값).
- 부분체 검사는 홀수 인덱스 계수 c1, c3, c5가 0인지 보는 등식 3개면 충분하다.
- c=1, u=f⁻¹ 한 줄로 검사가 통과된다
- c=1이면 c^λ=1이고 u=f⁻¹이면 f·u=1이라 어떤 Miller 출력 f에도 검사가 통과한다.
- f⁻¹은 보통 전체 F_p^12 원소라서 부분체 검사가 있었다면 거절됐을 값이다.
- 최적화 루틴이 성공을 반환하니 전체 final exponentiation을 하는 느린 fallback도 실행되지 않았다.
- 피해 범위가 넓다
- BLS12-381에서는 KZG opening proof를 위조할 수 있어 PLONK/KZG 검증기 등이 깨진다.
- BN254에서는 Groth16 검증기, BLS 서명 검사, pairing 등식에 의존하는 브리지가 깨진다.
Community Reactions
- PoC를 LLM에게 만들게 하는 triage는 믿기 어렵다는 저자 경험
- 모델이 실제로는 가짜인 이슈에도 통과하는 PoC를 잘 만들어 냈다는 경험이다.
- 검증하는 시간이 원 보고서 triage보다 더 길었다고 한다.
- 댓글: 서명 검증 비유로 쉽게 풀어 준 의견
- 서명이 주어진 해시에 대한 것임은 검증하지만 서명된 데이터가 그 해시인지는 확인하지 않는 라이브러리와 같다는 의견이다.
- 검증에 쓰는 사전 계산 값이 이 상황에 맞는지 확인하지 않아 항상 1이 나오는 자명한 파라미터가 통과한다는 설명이다.
- 댓글: 악용되면 L2 생태계가 리셋돼야 하느냐는 질문
- 대부분의 L2나 L2끼리 통신하는 컴포넌트가 하드 리셋이 필요할지 묻는 의견이다.
- 원문은 OpenVM 위에서 만드는 파트너가 모두 1.6.0으로 업그레이드했다고 한다.
- 댓글: 수학이 너무 빽빽해서 반응이 적다는 의견
- 맥락 없이는 읽기 어려운 글이라 댓글이 적다는 의견이다.
How to Apply
- 우리 코드의 검증 함수에서 hint 입력 검사 누락 찾기
- 오늘 AI 코딩 에이전트에 ZK·서명·proof 검증 함수를 붙여 넣고 prover/외부에서 받은 hint 값에 어떤 제약이 있는지 나열시켜라.
- 0이 아닌지 같은 약한 검사만 있는 값은 허용 범위(부분체, 범위, 차수 등)를 명시적으로 검사하도록 고쳐라.
- 최적화 경로가 통과하면 fallback이 생략되는 제어 흐름 점검하기
- 빠른 경로가 성공을 반환할 때 느린 전체 검증을 건너뛰는 코드를 찾아라.
- 빠른 경로의 전제 조건을 전부 검사하는 테스트를 추가하라.
- 멀티 에이전트 감사는 모듈 지식 요약 단위로 설계하기
- 폴더별로 서브에이전트를 돌리는 대신 각자 모듈의 가정·위임 사항·암묵적 불변식을 정해진 형식의 요약으로 내게 하라.
- 메인 에이전트가 요약을 합쳐서 모듈 간 조합 취약점을 보게 하라.
- LLM이 만든 PoC는 통과해도 믿지 말고 검토하기
- PoC에서 모킹, 비활성화한 검사, 패치한 헬퍼, 특이한 실행 플래그가 있는지 확인하라.
- 원 코드를 수정하지 않은 상태에서 재현되는지 사람이 직접 돌려 보라.
Try It
# Claude 또는 ChatGPT에 붙여넣기 (논문 방법의 간이 버전: 모듈 지식 요약으로 검증 코드 감사)
너는 암호·검증 코드 보안 감사자다. 아래 검증 함수를 버그 목록이 아니라 '모듈 지식'으로 분석해라.
[코드]
{{검증 함수 코드}}
다음 형식으로 답해라.
1. 이 함수가 가정하는 것
2. 호출자나 prover에게 위임하는 것 (hint, witness 등 외부 입력)
3. 암묵적으로 의존하는 불변식
4. 외부 입력 값마다 실제로 코드에서 검사하는 제약과 안 하는 제약
5. 빠른 경로가 성공하면 건너뛰는 전체 검증이 있는지
6. 입력을 악의적으로 골랐을 때(예: c=1, u=f^-1처럼 항상 식이 성립하게 하는 값) 검사가 통과하는지
각 항목은 근거가 되는 코드 줄을 인용해라. 확실하지 않으면 추측하지 말고 모른다고 써라.
이어서 해 볼 것: 같은 분석을 다른 모듈에도 돌리고 결과를 합쳐 '모듈 A의 위임 사항'과 '모듈 B의 가정'이 맞물리는지 물어봐라.Terminology
관련 논문
같은 시뮬레이션, 다른 근거: 도구 출력을 파일로 넘기면 LLM 에이전트 정확도가 어디서 깎이나
긴 툴 출력을 파일로 넘기자 GPT-5.1은 정확도 11.3%p 하락, 정식 출력 지정하니 회복
가짜 뉴스가 진짜 폭락을: LLM 트레이딩 에이전트 대상 정보 주입 공격
가짜 헤드라인 한 줄로 LLM 트레이딩 에이전트 62%를 조종했다(프롬프트 주입은 14%)
Harness Engineering 101: LLM은 뇌, harness는 몸
에이전트는 JSON 배열을 관리하는 루프이고, 16개 챕터로 직접 만들어 본다
Harness²: 에이전트 harness를 스스로 고쳐 쓰는 재귀 최적화 프레임워크
모델은 고정하고 harness를 재귀로 고쳤더니 벤치마크 점수가 최대 11.8%p 올랐다
해고된 Savannah 경찰관, ICE 요원 남편에게 Flock 계정 공유
경찰관이 Flock 계정을 남편(ICE 요원)에게 공유했고, 감사에서 983건 검색이 드러나 해고됐다
tmux와 Claude Code: 세션, send-keys, 그리고 한계선
tmux로 Claude Code 여러 개를 돌리면 편하지만 에이전트 4개쯤에서 한계가 온다
Hybrid Reasoning Agents: 잠재 공간에서 생각하고 텍스트로 행동하는 LLM 에이전트
잠재 공간 추론과 텍스트 도구 호출을 섞었더니 성능 10.4%↑, 토큰 최대 54.7%↓