Bez kategorii

Kompilator pokazywał jeden kod, do Ethereum trafiał inny. Ofiary same wdrożyły kontrakty, które je okradły

Przez pół roku 224 osoby samodzielnie skompilowały, wdrożyły na Ethereum i zasiliły własnymi środkami kontrakty, które następnie opróżniły ich portfele. Łącznie straciły 274,6 ETH, czyli około 517 tysięcy dolarów. Nie kliknęły w podejrzany link i nie zatwierdziły nikomu dostępu do swoich tokenów — wykonywały instrukcje z tutoriali na YouTube, które obiecywały zautomatyzowanego bota arbitrażowego.

Kampanię opisała firma analityczna TRM Labs w raporcie z 14 września. Między lutym a sierpniem ofiary wdrożyły 234 kontrakty, a skradzione środki trafiły na sześć adresów kontrolowanych przez operatorów. Mediana straty to 1 ETH, co wskazuje na schemat nastawiony na wiele niewielkich wpłat, nie na jedną dużą ofiarę.

Wszystko zaczynało się od filmu. TRM Labs zidentyfikowała dziewięć niemal identycznych tutoriali na YouTube, prowadzonych przez wygenerowane przez AI postacie z syntetycznymi głosami. Każdy obiecywał to samo: gotowy bot arbitrażowy oparty na modelu Claude od Anthropic, który sam wyszukuje różnice cen między giełdami i zarabia bez udziału użytkownika. Widz dostawał kod do skopiowania i link do strony kompilatora — część z tych witryn naśladowała Remix, znane narzędzie do pracy z kontraktami.

Tu zaczynał się właściwy mechanizm. Strona kompilatora miała złośliwy backend: kod, który użytkownik widział w oknie przeglądarki, nie był tym, co trafiało do sieci. Na blockchain szedł kontrakt pobrany z serwera oszustów. Wszystko, co ofiara mogła sprawdzić na ekranie — wklejony fragment, podgląd przed wdrożeniem — dotyczyło programu, który nigdy nie został opublikowany.

Wdrożony kontrakt zachowywał się jak wiarygodne narzędzie. Przyjmował depozyty ETH, co w przypadku bota handlującego miało sens: potrzebuje kapitału, na którym pracuje. Gdy jednak saldo przekraczało 0,05 ETH, obie główne funkcje — „Start” i „Withdraw” — robiły dokładnie to samo: przenosiły środki na adres operatorów. „Start” nie uruchamiał żadnej strategii, „Withdraw” nie oddawał pieniędzy. W kodzie nie było ani logiki arbitrażowej, ani żadnego elementu AI. Claude był nazwą w ofercie, nie częścią produktu.

Dlaczego portfel nie miał sygnału ostrzegawczego

Klasyczny drainer prosi o uprawnienia: ofiara podpisuje zgodę na dostęp do tokenów, a atakujący opróżnia portfel w ramach przyznanego limitu. Tutaj tor był inny. Adres kontraktu powstawał na oczach użytkownika i był nowy, więc nie figurował w żadnej blokliście. Wdrożenie, wpłata ETH i wywołanie funkcji to transakcje, które ofiara sama autoryzowała i podpisała jako właściciel portfela — z punktu widzenia portfela nic w nich nie odbiegało od normy.

Symulacja transakcji również nie miała czego wychwycić, bo do podmiany dochodziło po stronie serwera kompilatora, jeszcze przed publikacją kodu w sieci. Jedynym miejscem, w którym można było zauważyć rozbieżność, było porównanie kodu z ekranu z tym, co faktycznie znalazło się na blockchainie — czyli dokładnie to, czego tutorial nie sugerował robić.

274,6 ETH rozłożone na 224 osoby i 234 kontrakty, przy medianie 1 ETH, to skala, która nie przyciąga uwagi platform i nie prowokuje szybkiej reakcji. Rozproszenie jest tu częścią projektu, nie przypadkiem.