AI-аудитор zkao нашёл критическую ошибку в OpenVM's zkVM — баг в библиотеке openvm-pairing позволяет злоумышленнику подделать любое равенство спариваний. Уязвимости присвоен CVE-2026-46669, её исправили в OpenVM 1.6.0. Это не баг в самой системе доказательств zkVM, а только в коде, использующем уязвимую библиотеку.
Проблема скрывалась в оптимизации проверки произведений спариваний. Вместо дорогой финальной экспоненты схемы вроде Groth16 или KZG используют трюк с «остатком-свидетелем»: проверяют, что f * u = c^λ, где f — выход цикла Миллера, c — хинт от доказывающего, u — так называемый scaling factor. Чтобы проверка была надёжной, u должен лежать в подполе Fp6. В исходном коде OpenVM для BLS12-381 и BN254 проверяли только, что c != 0 — а на принадлежность к подполю не смотрели. Доказывающий мог передать c = 1 и u = f^(-1), и проверка проходила для любого ложного f. Нормально f^(-1) — полный элемент Fp12, не лежащий в Fp6, поэтому проверка подполя и должна была его отсечь.
Последствия серьёзные: на BLS12-381 ломаются KZG-открытия и PLONK/KZG-верификаторы, на BN254 — Groth16, BLS-подписи и любой мост, зависящий от спариваний. Гость zkVM, эмулирующий precompile ecPairing (адрес 0x08), выдавал бы ложные результаты, что подрывало L2-роллапы, бриджи и приватные протоколы.
Нашли баг не с помощью обычных LLM. Даже после прогонов с Opus 4.7 и Codex 5.4 все находки признали информационными — zkVM слишком сложен для простой «изолированной» проверки модулей. zkao справился благодаря потоку cryptopsy, который комбинирует анализ кода с криптографической литературой (известные атаки, ловушки) и моделирует часть ручного аудита. Сканирование заняло более 9,5 часов.
Исправление — тривиальное: добавили проверку, что нечётные коэффициенты (1,3,5) scaling factor равны нулю. Патч в коммите a720e2c вошёл в OpenVM 1.6.0.
Интересный урок: попытка автоматически проверять PoC через LLM провалилась — модель легко фабриковала «успешные» эксплойты, которые на деле ничего не доказывали, и такой триаж отнимал больше времени, чем ручная проверка. Сейчас zkao дорабатывают, чтобы снизить число ложных срабатываний.
Команда OpenVM быстро отреагировала, спасибо им и Йи Суну из Axiom за ревью поста. Дальше планируют публиковать находки из целенаправленного аудита OpenVM 2.0.