Złosobnicze serwery Electrum podmieniały wysłane płatności na fałszywe transakcje bitcoin z zerową opłatą; poprawka w wersji 4.8.3
Najważniejsze informacje
- •Electrum wydała wersję 4.8.3, aby naprawić poważną lukę polegającą na podmienianiu rozesłanych płatności przez złośliwe serwery; opiekun SomberNight opublikował 24 października advisori GHSA-6jp4-8v48-cc5v i wezwał użytkowników do aktualizacji.
- •Atak działał, ponieważ starsze wersje nie weryfikowały podpisów transakcji w mempoolu — sfałszowana transakcja z zerową opłatą wyświetlała się jako oczekująca, a podniesienie opłaty przez Replace-By-Fee powodowało, że portfel ofiary podpisywał ważnym podpisem wersję atakującego.
- •Udokumentowana ofiara korzystająca z multisig 2-z-3 w formacie P2SH z dwoma Trezorami otrzymała fałszywą transakcję z identycznymi bajtowo scriptSigami na 31 wejściach, której adres docelowy naśladował ostatnie cztery znaki prawdziwego adresu, kończąc się na GyQ3.
- •Poprawka wprowadzona w commicie 90fe308 weryfikuje podpisy wejść należących do portfela przed dodaniem transakcji z mempoola do lokalnej historii, jednak niepotwierdzonych płatności przychodzących portfel nadal nie może w pełni zweryfikować do momentu potwierdzenia w blockchainie.
- •Electrum zaleca użytkownikom, którzy nie mogą dokonać aktualizacji, sprawdzanie adresów wyjściowych i kwot przed podpisaniem czegokolwiek, w tym podnoszeniem opłat; użytkownicy łączący się wyłącznie z własnymi serwerami nie byli narażeni.

Złośliwe serwery Electrum podmieniały świeżo rozesłane płatności bitcoin użytkowników na fałszywe transakcje z zerową opłatą, kierujące środki na adresy wyglądające niemal identycznie, licząc na to, że ofiary podniosą opłatę i podpiszą wersję atakującego. Electrum wydała wersję 4.8.3 24 października, aby usunąć tę poważną lukę. Opiekun projektu SomberNight opublikował tego samego dnia advisorię GHSA-6jp4-8v48-cc5v i poprosił użytkowników o aktualizację.
Jak działa atak
Electrum jest lekkim klientem: nie uruchamia pełnego węzła bitcoin i w kwestii informacji o niepotwierdzonych transakcjach w mempoolu polega na swoim serwerze, co wyjaśnia dokumentacja projektu. Gdy użytkownik podpisuje i wysyła transakcję (tx1), złośliwy serwer może ją zatrzymać i przekazać portfelowi inną transakcję (tx2), która kieruje środki na adres atakującego.
Tx2 zawiera nieprawidłowe podpisy. Starsze wersje Electrum nie weryfikowały podpisów transakcji w mempoolu, więc portfel wyświetlał tx2 jako oczekującą i ukrywał tx1. Replace-By-Fee (RBF) pozwala nadawcy ponownie rozesłać niepotwierdzoną transakcję z wyższą opłatą. Jeśli opłata w fałszywej transakcji zostanie podniesiona, portfel podpisuje ważnym podpisem wersję atakującego. Zwyczajny krok — podniesienie opłaty w pozornie utkniętej płatności — staje się wówczas momentem, w którym to portfel ofiary podpisuje transakcję atakującego.
Sfałszowany adres dzielił końcówkę GyQ3 z prawdziwym adresem docelowym
Jedna z ofiar, znana jako dannydeezy, udokumentowała atak. Konfiguracja to multisig 2-z-3 w starszym formacie P2SH z dwoma urządzeniami Trezor, 31 wejściami i jednym wyjściem. Użytkownik sprawł wyjście na obu Trezorach, a następnie rozesłał transakcję. Trezory zweryfikowały prawdziwą transakcję, zanim opuściła portfel; wersja atakującego pojawiła się dopiero potem, przekazana przez złośliwy serwer, więc weryfikacja na urządzeniach nigdy jej nie obejrzała. Historia portfela wyświetlała następnie pełną kwotę jako niepotwierdzoną, kierowaną na nieznany adres, a wpis później zmienił status na „Local”. W Electrum „Local” oznacza transakcję znaną tylko portfelowi i niewidoczną w sieci.
Fałszywka odwzorowała wejścia, wersję i locktime prawdziwej transakcji, z identycznymi bajt w bajt scriptSigami na wszystkich 31 wejściach. Wszystkie 62 podpisy zgadzały się z prawdziwą transakcją; żaden nie zgadzał się z fałszywą. Prawie wszystkie środki trafiły na adres-naśladownika, a niewielka kwota wróciła na jeden z już używanych adresów portfela.
Fałszywy adres kończył się na GyQ3 — podobnie jak prawdziwy adres docelowy. Atakujący ustalił adres zgodny z ostatnimi czterema znakami właściwego adresu. ZachXBT wskazał już wcześniej podobne oszustwo typu address poisoning dotykające użytkowników portfela Phantom; podrobione adresy są projektowane tak, aby zmylić rzut oka na pierwsze i ostatnie znaki.
Wersja 4.8.3 sprawdza podpisy tylko przy wejściach należących do portfela
Inny użytkownik, Raju-K12, 18 października prywatnie zgłosił, że podniósł opłatę w fałszywej transakcji i stracił środki. Według opiekunów projektu niektóre serwery przeprowadzają ten atak w praktyce.
Commit 90fe308 dodaje sprawdzanie podpisów wejść należących do portfela („is_mine”) przed dodaniem transakcji z mempoola do lokalnej historii. Wersja 4.8.3 została oznaczona tagiem w git 23 października, a pliki binarne udostępniono następnego dnia.
Electrum nadal sprawdza tylko wejścia kontrolowane przez portfel, więc niepotwierdzone transakcje przychodzące pozostają nieweryfikowane, ponieważ klient nie posiada pełnego interpretera skryptów. Dla odbiorców oznacza to, że oczekującej płatności przychodzącej nie można w pełni zweryfikować samym portfelem do momentu jej potwierdzenia w blockchainie. Obejściem zalecanym przez Electrum dla osób, które nie mogą dokonać aktualizacji, jest sprawdzanie adresów wyjściowych i kwot przed podpisaniem czegokolwiek, w tym podnoszeniem opłat. Użytkownicy łączący się wyłącznie z własnymi serwerami nigdy nie byli narażeni.
Electrum wydawała już wcześniej poprawki awaryjne. W styczniu 2018 roku zamknęła interfejs JSON RPC, który pozostawał otwarty przez około dwa lata, po tym jak badacz Google Tavis Ormandy odkrył, że strona internetowa może wykryć port i opróżnić środki. Cryptopolitan informował, że w lipcu pojawiło się ostrzeżenie o błędzie generowania seeda w Coldcard — tego samego dnia około 594 BTC, czyli ok. 38 milionów dolarów, wypłynęło z mniej więcej 500 portfeli.