Erik Zhang wydaje Neo N3 v3.10.2, łatac obejście weryfikacji witness w multisig
Najważniejsze informacje
- •Neo opublikowało 23 października Neo N3 v3.10.2, wydanie bezpieczeństwa autorstwa współzałożyciela Erika Zhanga, zawierające pojedynczą poprawkę logiczną i żadnych nowych funkcji.
- •Poprawka eliminuje obejście weryfikacji witness spowodowane niespójną walidacją kluczy publicznych między overloadami kontraktów multisignature, które wcześniej pozwalało uszkodzonym skryptom przejść jedną ścieżkę walidacji, mimo niepowodzenia na innej.
- •Wszystkie ścieżki kodu walidacyjnego wymuszają teraz pełne kryptograficzne dekodowanie kluczy publicznych przed sklasyfikowaniem skryptu jako ważnego kontraktu multisig, dzięki drobnej edycji w Helper.cs.
- •Commit dodaje dwa nowe testy i aktualizuje jeden istniejący, aby potwierdzić, że skrypty z nieprawidłowymi kluczami publicznymi są odrzucane przez każdą ścieżkę walidacji, w tym pełny przypadek transakcji z niezgodnymi hashami witnessa.
- •Nie odnotowano potwierdzonego wykorzystania błędu w Neo N3 MainNet, a poprawka działa wyłącznie na węzłach uruchamiających załatane wydanie, co czyni wdrożenie przez operatorów kluczowym kolejnym krokiem.

Neo wydało Neo N3 v3.10.2, ukierunkowaną poprawkę bezpieczeństwa, która zamyka obejście weryfikacji witness, umożliwiające wcześniej uszkodzonym skryptom multisignature przejście jednej ścieżki walidacji, mimo wykrycia ich przez inną. Dla zwykłych użytkowników poprawka eliminuje drogę, którą nieprawidłowa transakcja mogła wyglądać na ważną dla części oprogramowania węzła.
Wydanie, którego autorem jest współzałożyciel Neo Erik Zhang, zostało opublikowane 23 października. Zawiera ono pojedynczą poprawkę logiczną walidacji kontraktów multisignature w Neo N3 i żadne nowe funkcje.
Co naprawia poprawka
Gdy transakcja jest przesyłana do sieci Neo N3, protokół sprawdza, czy dołączone podpisy są ważne i pochodzą od właściwych stron. Te dane autoryzacyjne — podpisy i dołączone do transakcji kontrole — protokół nazywa witness i to właśnie tę warstwę wzmacnia ta poprawka. W przypadku kontraktów multisignature, które wymagają minimalnej liczby autoryzowanych sygnatariuszy do zatwierdzenia transakcji i są powszechnie używane wszędzie tam, gdzie kilka stron wspólnie kontroluje te same środki, weryfikacja obejmuje sprawdzenie, czy każdy klucz publiczny wymieniony w skrypcie kontraktu jest kryptograficznie ważny.
Poprawka zamyka lukę w sposobie stosowania tej kontroli. Logika walidacji multisig w Neo N3 zawła wiele ścieżek kodu do badania skryptu multisig. Jedna z nich w pełni dekodowała każdy klucz publiczny — proces, który natychmiast odrzucał każdy klucz niebędący ważnym punktem na krzywej eliptycznej. Druga ścieżka sprawdzała wyłącznie strukturę skryptu — prawidłowe długości bajtowe i prawidłową liczbę kluczy — bez wykonywania dekodowania kryptograficznego. Skrypt zawierający uszkodzony klucz publiczny mógł więc przejść drugą ścieżkę i nie przejść pierwszej, a dwie ścieżki nie zgadzały się co do tego, czy skrypt jest ważny. Taki rodzaj rozbieżności narusza podstawową właściwość, jakiej oczekuje się od walidacji blockchainowej: ten sam skrypt powinien dawać ten sam werdykt niezależnie od tego, która ścieżka kodu go bada.
Rozbieżność nie była nieznana. Zachowanie to było udokumentowane we własnym zestawie testowym Neo od 2024 roku, kiedy Anna Shaleva, deweloperka Neo SPCC, przeniosła nowy kod weryfikacji witness z NeoGo do referencyjnego węzła w C#. Test dodany w tym pull requeście oznaczył goły overload IsMultiSigContract jako „unlucky” (pechowy) za pomijanie dekodowania kluczy, ale potraktował wynik jako oczekiwane zachowanie, a nie defekt. Dwie tam używane implementacje — referencyjny węzeł w C# i NeoGo — podkreślają, dlaczego jednolitość zachowania ma znaczenie: w sieci utrzymywanej w więcej niż jednej implementacji węzła każda z nich musi rozstrzygać tak samo tę samą transakcję.
Poprawka usuwa tę rozbieżność. Wszystkie ścieżki logiki walidacyjnej wymuszają teraz pełne dekodowanie kluczy przed sklasyfikowaniem skryptu jako ważnego kontraktu multisig.
Poprawka i pokrycie testami
Zmiana to drobna edycja w src/Neo/SmartContract/Helper.cs. Poprawka dekoduje klucz za każdym razem, więc każda ścieżka badająca skrypt multisig wykonuje teraz tę samą kontrolę.
Commit dodaje dwa nowe testy i aktualizuje jeden istniejący. Pierwszy nowy test przekazuje skrypt multisig z uszkodzonym kluczem publicznym do wszystkich trzech ścieżek walidacji i potwierdza, że każda z nich go odrzuca. Drugi buduje pełną transakcję z uszkodzonym witnessem multisig i potwierdza, że sieć ją odrzuca. Ten test uruchamiany jest dwukrotnie — raz z adresem sygnatariusza zgodnym z witnessem i raz z niezgodnością — co pokrywa przypadek „med witness hashes” odnotowany w informacjach o wydaniu.
Zaktualizowany test, TestIsMultiSigContract_WrongCurve, wcześniej oczekiwał, że ścieżka skrócona zaakceptuje skrypty z nieprawidłowymi kluczami. Teraz oczekuje, że wszystkie trzy ścieżki je odrzucą, utrwalając poprawione zachowanie w zestawie testowym przed przyszłymi regresjami.
Jimmy Liao, główny deweloper Neo i założyciel R3E Network, opisał wydanie na X:
Neo N3 v3.10.2 — wydanie bezpieczeństwa. Naprawia obejście weryfikacji witness wynikające z niespójnej walidacji kluczy publicznych między overloadami
IsMultiSigContract. Klucze są teraz walidowane przed klasyfikacją multisig.
Brak znanych eksploitów
Wraz z wydaniem nie opublikowano formalnego biuletynu bezpieczeństwa. Annotatki wydania, ani komunikat commita nie opisują żadnego potwierdzonego wykorzystania błędu w Neo N3 MainNet.
Operatorzy węzłów i dostawcy infrastruktury uruchamiający Neo N3 powinni zaktualizować do v3.10.2 — ponieważ jest to poprawka po stronie klienta, jej zaostrzona kontrola działa tylko na węzłach faktycznie uruchamiających załatane wydanie, co czyni wdrożenie przez operatorów praktycznym kolejnym krokiem do obserwowania. Pełne wydanie jest dostępne na GitHubie.