제로 지식 가상 머신(zkVM)은 신뢰할 수 없는 증명자(prover)가 검증자(verifier)에게 프로그램(일반적으로 Rust를 RISC-V로 컴파일한 것)이 올바르게 실행되었음을 설득하게 합니다. 이 증명은 컴파일된 바이너리를 다루기 때문에, 오컴파일레이션(miscompilation)은 정확한 zkVM이 개발자의 소스 코드와 다른 계산에 대한 유효한 증명을 생성하게 할 수 있습니다.
우리는 프로덕션 zkVM인 SP1과 Jolt를 대상으로 오컴파일레이션이 zkVM 보장에 가하는 위협에 대한 최초의 경험적 연구를 제시합니다. 우리는 LLM 에이전트를 사용하여 124개의 LLVM 버그 중 단지 LLVM IR로만 보고된 60개에 대한 Rust 트리거를 복구함으로써, 알려진 88개의 rustc 및 LLVM 오컴파일레이션과 Rust 재현 도구를 조립했습니다. 이 버그들 중 다수가 zkVM으로 이어집니다. 88개 중 48개가 SP1에서 게스트가 잘못된 출력을 커밋하게 만들고, 46개가 Jolt에서 그렇게 만드는데, 여기에는 양쪽 모두에 존재하는 동일한 15개의 rustc 버그가 포함됩니다.
재현되지 않는 대부분의 버그는 예를 들어 명령어 세트 확장(instruction-set extension)이 필요하기 때문에, zkVM 타겟의 결함 있는 코드에 도달하지 않습니다. 기존 게스트 프로그램은 우발적으로 영향을 받는 경우가 드뭅니다. 10개의 인기 있는 SP1 프로젝트의 13개 게스트에 걸쳐, 버그가 있는 컴파일러와 수정된 컴파일러는 빌드되는 552개의 게스트-버그 쌍 중 447개에서 바이트 단위로 동일한 바이너리를 생성하며, 나머지 105개는 동일한 코드를 가지거나 우리가 실행한 모든 입력에 대해 일치합니다. 하지만 게스트에 코드를 기여하는 공격자는 의도적으로 이러한 버그를 유발할 수 있습니다.
프로젝트당 약 40달러로, LLM 에이전트는 평범한 최적화처럼 보이지만 게스트 소스 코드의 동작을 유지하고, 20개 중 11개 프로젝트에 걸쳐 366개의 프로젝트-버그 쌍 중 12개에서 알려진 버그를 노출하는 패치를 발견했습니다. 네 가지 사례에서는 게스트가 잘못된 출력을 커밋하는데, 여기에는 유효한 블록을 거부하는 이더리움 클라이언트도 포함되며, 나머지 여덟 가지 사례에서는 유효한 입력에서 실패합니다.
zkVM이나 게스트 소스 코드를 검토하거나 형식적으로 검증하는 것만으로는 그러한 패치를 잡아낼 수 없습니다. 왜냐하면 둘 다 정확하기 때문입니다. zkVM 프로젝트는 컴파일러를 신뢰 기반(trusted base)의 일부로 취급하고 툴체인(toolchain)의 알려진 버그들을 추적해야 합니다.