Zatruwanie adresów: atak, któremu wystarczy, że skopiujesz nie to co trzeba

·7 min czytania·Autor: SSP Editorial Team
Okładka SSP Academy: zatruwanie adresów i łudząco podobne adresy kryptowalutowe

Zatruwanie adresów: atak, któremu wystarczy, że skopiujesz nie to co trzeba

Większość ataków na użytkowników kryptowalut wymaga, żebyś popełnił błąd: kliknął link, wpisał frazę seed w formularz, zatwierdził coś, czego nie przeczytałeś. Zatruwanie adresów wymaga mniej. Wymaga, żebyś skopiował adres z własnej historii transakcji.

Nie ma złośliwego oprogramowania, nie ma strony phishingowej, nie ma podpisu, który trzeba by z ciebie wyłudzić. Cały wkład atakującego polega na podłożeniu wiarygodnie wyglądającego ciągu znaków tam, gdzie później po niego sięgniesz.

Jak to działa

Zacznijmy od tego, co w ogóle to umożliwia: nikt nie czyta adresów. Adres bitcoinowy albo ethereumowy to trzydzieści kilka znaków base58 albo szesnastkowych bez znaczenia, bez sumy kontrolnej, którą dałoby się ocenić okiem, i bez żadnego powodu, żeby go pamiętać. Więc każdy portfel, eksplorator bloków i giełda skracają je na potrzeby wyświetlania — 0x8f3C…9A063 — a każdy użytkownik uczy się sprawdzać widoczne końcówki i pomijać środek.

Ten nawyk jest całą powierzchnią ataku.

Atakujący generuje adresy siłowo, aż któryś podzieli pierwsze i ostatnie znaki z adresem, którego naprawdę używasz — zwykle takim, na który niedawno wysłałeś pieniądze. To tanie. Generowanie par kluczy jest szybkie, a dopasowanie powiedzmy czterech znaków z przodu i czterech z tyłu zajmuje sekundy na zwykłym sprzęcie. Nikt niczego nie łamie; po prostu rzuca kośćmi, aż jakaś liczba wyda się znajoma.

Potem wprowadzają ten adres do twojej historii. Typowe metody:

Pył. Wysyłają ci znikomą kwotę — kilka satoshi, ułamek centa jakiegoś tokena — z łudząco podobnego adresu. To zwyczajna transakcja przychodząca, więc ląduje w twojej historii jak każda inna. W łańcuchach UTXO ten pył staje się dodatkowo monetą do wydania w twoim portfelu, co ma znaczenie później.

Przelewy o zerowej wartości. W łańcuchach EVM transfer zera tokenów ERC-20 jest poprawną transakcją. Atakujący wysyła 0 tokenów z twojego adresu na swój podrobiony, co część interfejsów pokazuje jako wychodzącą płatność wykonaną przez ciebie. Twoja historia pokazuje teraz, że rzekomo wysłałeś na adres, którego nigdy nie wybrałeś.

Fałszywe zdarzenia. Złośliwy kontrakt tokena może wyemitować zdarzenie Transfer, które nigdy nie nastąpiło. Eksploratory i portfele ufające dziennikom zdarzeń je wyświetlą. Nic się nie ruszyło; wpis jest po prostu kłamstwem.

A potem czekają. Dni, czasem miesiące. Atak się opłaca przy następnym razie, gdy chcesz zapłacić tej samej stronie, przewijasz historię w poszukiwaniu „adresu, którego użyłem ostatnio", i kopiujesz nie ten wiersz. Oba wyglądają jak 0x8f3C…9A063. Sprawdzasz końcówki. Końcówki się zgadzają.

Dlaczego zwykła rada nie wystarcza

„Zawsze sprawdzaj adres dwa razy" to standardowe zalecenie i samo w sobie zawodzi, bo sprawdzanie jest dokładnie tym, co atak zakłada. Ty sprawdziłeś. Porównałeś sześć znaków pokazanych przez portfel z sześcioma znakami w pamięci i były identyczne — bo atakujący uczynił je identycznymi.

Weryfikacja działa tylko wtedy, gdy to, co porównujesz, jest drogie do podrobienia. Cztery czy sześć zgodnych znaków kosztuje sekundy. Szesnaście zgodnych znaków kosztowałoby więcej, niż warta jest kradzież. Cała gra polega na tym, po której stronie tej krzywej stoją twoje nawyki.

W łańcuchach UTXO jest druga pułapka. Ta pyłowa płatność jest teraz monetą w twoim portfelu i jeśli portfel automatycznie konsoliduje wejścia, może zostać zmieciona do późniejszej transakcji — łącząc zapylony adres z resztą twoich monet. To problem prywatności, a nie kradzieży, ale właśnie dlatego pył warto ignorować, a nie sprzątać.

Co naprawdę broni

Nigdy nie bierz adresu z historii transakcji. To jedyna zmiana, która ma znaczenie. Twoja historia to zapis tego, co się wydarzyło, a nie lista osób, którym ufasz — i każdy na świecie może do niej pisać. Bierz adresy od drugiej strony, kanałem, w którym zauważyłbyś oszusta, albo z książki adresowej, którą sam wypełniłeś.

Porównuj całe adresy albo coś, co streszcza cały adres. Przeczytanie wszystkich czterdziestu dwóch znaków jest nierealne. Porównanie identikonu — małego obrazka generowanego deterministycznie z całego ciągu — już nie, bo podróbka różniąca się gdziekolwiek w środku daje wyraźnie inny rysunek. Twoje oko wykona pracę, której nie wykona twoja cierpliwość.

Korzystaj z zapisanego kontaktu. Adresu, który zapisałeś raz ze źródła zweryfikowanego raz, nie da się zatruć później. Po to są książki adresowe i dlatego SSP trzyma kontakty na twoim urządzeniu, a nie na serwerze: lista kontaktów jest godna zaufania tylko wtedy, gdy nikt inny nie może jej edytować.

Wyślij płatność próbną przy dużych albo pierwszych przelewach. Mała kwota, potwierdzenie odbioru innym kanałem, potem reszta. Opłaty czynią to uciążliwym i wciąż jest to właściwe przy płatności, której nie chciałbyś stracić.

Ignoruj pył. Nie wydawaj go, nie „sprzątaj" i uważaj na automatyczną konsolidację, jeśli zależy ci na prywatności.

Co robi z tym SSP

Zatruwanie adresów jest problemem wyświetlania w równym stopniu co bezpieczeństwa, więc część odpowiedzi mieszka w tym, jak adresy są rysowane.

SSP skraca adresy do sześciu znaków z przodu i sześciu z tyłu0x8f3C4b…9A0631 — zamiast trzech czy czterech, których używa wiele interfejsów. To nie jest wybór kosmetyczny. Każdy dodatkowy znak zwielokrotnia siłowy koszt uzyskania dopasowania, a dwanaście widocznych znaków stawia przekonującą podróbkę daleko poza zasięgiem okazjonalnego generowania.

Środek jest przygaszony, a nie usunięty. W rozwiniętej formie portfel pokazuje pełny ciąg z pogrubionymi końcówkami i jaśniejszym środkiem, więc ta część, na której pominięcie atakujący liczą, wciąż fizycznie jest na ekranie, zamiast zostać zastąpiona wielokropkiem mogącym kryć cokolwiek.

Ten sam kod działa w obu aplikacjach. splitAddressForDisplay w SSP Wallet to bezpośredni port tego z SSP Key, celowo utrzymany identycznie, żeby adres wyglądał tak samo w przeglądarce i na telefonie. To ma znaczenie, bo SSP pokazuje ci transakcję dwa razy, na dwóch urządzeniach — a drugie spojrzenie jest prawdziwą kontrolą tylko wtedy, gdy obie powierzchnie renderują to samo w ten sam sposób. Dwa różne skrócenia pozwoliłyby rozbieżności schować się w tej różnicy.

Na ekranie zatwierdzania w SSP Key odbiorca pokazywany jest z identikonem wygenerowanym z pełnego adresu, obok skróconego tekstu, a dotknięcie rozwija cały adres jako zaznaczalny tekst. Identikon jest tym, co pokonuje podmianę w środku ciągu: atakujący może dopasować twoje pierwsze i ostatnie znaki, ale nie dopasuje obrazka wyprowadzonego z każdego znaku bez rozwiązania dużo trudniejszego problemu.

Nic z tego nie jest gwarancją. Jeśli wkleisz zatruty adres i zatwierdzisz go na obu urządzeniach, SSP go podpisze — to właśnie znaczy być portfelem, który kontrolujesz, a nie powiernikiem podważającym twoje decyzje. Multisig dwa-z-dwóch nie pozwala komuś innemu wydać twoich monet; nie powstrzyma cię przed świadomym zapłaceniem niewłaściwej osobie. Jak przy każdym ataku, który działa przez skłonienie cię do działania, obrona musi zadziałać przed podpisem, a nie w jego trakcie.

Wersja krótka

Zatruwanie adresów działa, bo porównujesz sześć znaków zamiast czterdziestu dwóch, a atakujący wie, które sześć. Obroną nie jest większa staranność — jest nią nigdy nie brać adresu z miejsca, do którego atakujący może pisać, i używać narzędzi, które stawiają ci z powrotem przed oczami te fragmenty, które byś pominął.

Udostępnij ten artykuł

Powiązane artykuły