Właśnie miały miejsce dwa pierwsze znane eksploity przeciwko działającym obwodom ZK, które nie były subtelnymi błędami związanymi z niedostatecznym ograniczeniem. Były to weryfikatory Groth16 wdrożone bez ukończenia ceremonii zaufanego ustawienia. Jeden został uratowany przez białego kapelusza za około 1,5 miliona dolarów, a drugi został opróżniony na 5 ETH. 🧵
Oba protokoły używały Circom + snarkjs, najczęstszej stosowanej technologii dla wdrożeń Groth16. Błąd? Pominęli Faza 2 zaufanego ustawienia: krok wkładu specyficznego dla obwodu. Bez tego parametry γ i δ klucza weryfikacyjnego są ustawione na tę samą wartość: generatory G2.
Dlaczego γ = δ psuje wszystko? Weryfikacja Groth16 sprawdza: e(-A, B) · e(α, β) · e(vk_x, γ) · e(C, δ) = 1 Gdy γ = δ, atakujący może ustawić C = -vk_x, aby skasować oba człony, a następnie ustawić A = α, B = β, aby skasować resztę. Równanie staje się 1 · 1 = 1. Żaden świadek nie jest potrzebny.
Protokół Foom (~1,4 mln USD) był dApp loteryjnym na Base i Ethereum. Akcja ratunkowa przeprowadzona przez @duha_real oraz innego niezależnego białego kapelusza opróżniła kontrakty, zanim mógł to zrobić złośliwy aktor, wykorzystując sfałszowane dowody do wyciągnięcia 99,97–99,99% tokenów.
Protokół Veil (~5K $) był forkiem Tornado Cash na Base. Napastnik opróżnił cały zbiornik w jednej transakcji, 29 sfałszowanych wypłat używając fałszywych nullifierów takich jak 0xdead0000, wyciągając pełne saldo zbiornika wynoszące 2,9 ETH.
To jest snarkjs działający zgodnie z zamierzeniem. Kiedy uruchamiasz groth16 setup, inicjalizuje γ i δ jako generator G2 jako zastępczy. Oczekuje się, że uruchomisz zkey contribute, aby zrandomizować δ. Pomiń ten krok, a twój weryfikator zaakceptuje każdy dowód.
Przerażająca część: to nie była głęboka wada kryptograficzna ani subtelny błąd w obwodzie. To był błąd w wdrożeniu: brakująca jedna komenda CLI. I to pozostawało w produkcji z prawdziwymi funduszami na ryzyko.
wnioski: - Zawsze przeglądaj skrypty wdrożeniowe, a nie tylko kod obwodu - Sprawdź swoje klucze weryfikacyjne: jeśli vk_gamma_2 == vk_delta_2, twoje dowody są fałszowalne - Współpracowaliśmy z @DedaubSecurity, aby zeskanować łańcuchy EVM w poszukiwaniu innych dotkniętych kontraktów, nie znaleziono żadnych o wysokiej wartości, ale kilka istnieje
4,1K