
Smart kontrakty to fundament nowoczesnego świata kryptowalut. Umożliwiają one automatyczne i bezpieczne wykonywanie transakcji bez potrzeby pośredników. Ale tak jak każda technologia – nie są niezniszczalne. Jednym z najbardziej znanych i niebezpiecznych zagrożeń dla inteligentnych kontraktów jest atak ponownego wejścia, czyli Reentrancy Attack.
Co to jest atak ponownego wejścia?
Wyobraź sobie, że smart kontrakt pozwala użytkownikom wypłacać środki, które wcześniej wpłacili. Z pozoru wszystko wygląda dobrze, ale jeśli nie zadbano o odpowiednie zabezpieczenia, pojawia się problem. Haker może wstrzyknąć złośliwy kod, który – zamiast pozwolić kontraktowi dokończyć wypłatę – ponownie uruchamia tę samą funkcję zanim system zdąży zaktualizować stan konta.
Efekt? Haker wypłaca środki w kółko, zanim system zorientuje się, że coś jest nie tak.
Jak to wygląda w praktyce?
Przykład: kontrakt Ethereum pozwala użytkownikowi wypłacić swoje ETH. Kontrakt najpierw wysyła środki, a dopiero potem aktualizuje saldo. W tym czasie atakujący używa swojego złośliwego kontraktu, który natychmiast znowu uruchamia wypłatę – zanim saldo zostanie zaktualizowane.
I tak kilka razy z rzędu, aż wyciągnie wszystko, co się da.
Od teorii do praktyki – głośne przypadki ataków
-
DAO Hack (2016) – klasyczny atak reentrancy. Haker opróżnił DAO (pierwszy duży fundusz oparty na smart kontrakcie) z ETH o wartości ok. 50 milionów dolarów.
-
Lendf.me (2020) – atakujący wielokrotnie pożyczał i spłacał środki, manipulując stanem kontraktu i kradnąc ponad 25 milionów USD.
-
Cream Finance – podobny schemat: pożyczanie, spłata, pętla, manipulacja – wynik? Strata ponad 30 milionów USD.
-
BurgerSwap (2021) – zdecentralizowana giełda na BNB Chain padła ofiarą reentrancy, a straty wyniosły ponad 2 miliony USD.
-
Siren Protocol – atak zakończył się kradzieżą środków o wartości 30 milionów USD.
Wszystkie te przypadki łączy jedno: błędne lub brakujące zabezpieczenia w kodzie smart kontraktu.
Jakie są typy ataków ponownego wejścia?
-
Klasyczny Reentrancy – funkcja jest ponownie wywoływana przed aktualizacją danych.
-
Reentrancy między funkcjami (cross-function) – haker wywołuje różne funkcje kontraktu w odpowiedniej kolejności, aby wywołać niepożądane zachowanie.
-
Zależność od znacznika czasu – manipulowanie czasem wykonania bloku, by uzyskać przewagę.
-
Frontrunning + reentrancy – haker zauważa podatną transakcję i błyskawicznie umieszcza własną wcześniej w kolejce, wykorzystując lukę.
Jak się przed tym bronić?
Deweloperzy mogą zastosować kilka skutecznych zabezpieczeń:
-
Zmiana kolejności operacji – najpierw zaktualizuj saldo, dopiero potem wyślij środki.
-
Wzorzec „checks-effects-interactions” – najpierw sprawdź warunki, potem zmień stan, dopiero na końcu wchodź w interakcję z innym kontraktem.
-
Blokady (mutexy) – zabezpieczenie funkcji przed wielokrotnym jednoczesnym uruchomieniem.
-
require() – kontrolne warunki, które sprawdzają, czy funkcja ma prawo się wykonać.
-
Ograniczenie głębokości wywołań – kontrakt przestaje działać, jeśli zbyt wiele funkcji wywołuje się nawzajem.
-
Regularne audyty – kod powinien być przeglądany przez ekspertów.
-
Monitoring i testy – przed wdrożeniem kontrakt powinien przejść testy odporności na różne scenariusze.
Dlaczego to takie ważne?
Reentrancy Attack nie tylko prowadzi do ogromnych strat finansowych, ale też podważa zaufanie do całego ekosystemu DeFi. W świecie, który opiera się na zaufaniu do kodu zamiast do ludzi, każda luka to potencjalna katastrofa.
Dlatego każdy twórca smart kontraktów powinien rozumieć, jak działa ten atak, i jak go uniknąć.
Podsumowanie
Atak ponownego wejścia to jeden z najbardziej znanych i szkodliwych błędów w smart kontraktach. Można się przed nim bronić, ale wymaga to dobrej znajomości zasad działania Ethereum, przemyślanego pisania kodu i dokładnych testów. W świecie blockchaina, gdzie każdy błąd może kosztować miliony, świadomość zagrożeń to nie luksus – to konieczność.