Siedzę nad tym od wtorku i autentycznie brakuje mi już sił. Przeglądałem wczoraj raport z tego potężnego drenażu na Mango Markets — zgarnęli grubo ponad 100 baniek, a ja gapiłem się w monitor jak sroka w gnat. Zawsze myślałem, że smart kontrakty to taki betonowy skarbiec. Błąd.
Prawie wszędzie w logach z audytów bezpieczeństwa przewija się jedno, cholernie niejasne dla mnie hasło: atak na wyrocznie cenowe w DeFi. Złapałem zaledwie skrawki teorii. Wiem, że oracle dostarcza ceny z tradycyjnych giełd bezpośrednio do blockchaina, prawda? Taki niby rzetelny kurier z rynkowymi danymi. Skoro ten mechanizm obsługuje protokoły pożyczkowe, jakim cudem ktoś wchodzi z ulicy, sztucznie pompuje kurs jakiegoś niszowego tokena na jednym zdecentralizowanym parkiecie i nagle pod zastaw tego napompowanego śmiecia wyciąga miliony w stabilnych monetach?
Próbowałem to rozrysować na kartce. Niby proste. Czytam wątek analityka z PeckShield z początku października, gdzie pokazali krok po kroku całą operację. Gość wziął błyskawiczną pożyczkę (flash loan) na równe 50 milionów dolarów z Aave, zalał pulę płynności na Uniswapie v3, kompletnie zdezorientował lokalną wyrocznię i uciekł z łupem. Całość zajęła mu zaledwie 14 sekund. Tyle wystarczyło, żeby położyć świetnie zapowiadający się projekt na łopatki.
Totalny kosmos. Tutaj pojawia się mój ogromny ból głowy i prośba do wyjadaczy z forum.
Czy ktoś z was potrafi rozbić wektor ataku na wyrocznie cenowe na absolutnie podstawowe czynniki? Gdzie twórcy aplikacji popełniają ten krytyczny błąd? Zanim zaryzykuję własne, ciężko zarobione środki na kolejnej platformie z kuszącym APY, muszę umieć samodzielnie ocenić ryzyko. Szukam gotowej listy kontrolnej. Na co wy zwracacie uwagę przed autoryzacją kontraktu?
Podrzućcie sprawdzone metody. Bez solidnego zaplecza teoretycznego w tym temacie, strach klikać jakikolwiek depozyt.
Pamiętam ten lepki, zimny pot na karku, gdy pod koniec listopada 2021 roku nasz firmowy bot na Telegramie zaczął wściekle wypluwać alerty o anomaliach na puli płynności. Ktoś właśnie drenował zaprzyjaźniony protokół pożyczkowy na blisko 4,2 miliona dolarów, a my w biurze patrzyliśmy w ekrany jak zahipnotyzowani. Zwykły, prozaiczny błąd w kodzie? Gdzie tam. Zwinny napastnik zagrał na nosie audytorom, bezczelnie manipulując rynkową wyceną aktywów przez ułamek sekundy.
Zadałeś absolutnie kluczowe pytanie, bo większość ludzi wchodzi w zdecentralizowane finanse z zamkniętymi oczami. Wierzą, że mityczne smart kontrakty są z definicji niezniszczalne. Bzdura. Wektor ataku na wyrocznie cenowe — brzmi to jak hermetyczny termin z podręcznika fizyki kwantowej, prawda? A tak naprawdę mamy tu do czynienia z najzwyklejszym, cyfrowym skokiem na bank. Tyle że przeprowadzonym w białych rękawiczkach i z użyciem genialnej matematyki.
Zacznijmy od absolutnych podstaw. Wyrocznia (oracle) w ekosystemie DeFi pełni rolę kuriera z gazetą. Smart kontrakt siedzi zamknięty w szczelnej piwnicy blockchaina. Nie ma pojęcia, po ile aktualnie handluje się Ethereum na zewnętrznych giełdach. Musi o ten kurs zapytać owego kuriera. A co, jeśli ktoś brutalnie przekupi tego chłopaka, żeby na pierwszej stronie wydrukował fałszywy nagłówek? Cały system z automatu głupieje.
Wróćmy do tej chłodnej, listopadowej nocy. Napastnik wziął tak zwaną błyskawiczną pożyczkę (flash loan). To gigantyczny kapitał — powiedzmy 50 milionów DAI — pożyczony bez absolutnie żadnego zabezpieczenia, pod jednym, twardym warunkiem: zwrotu całości w tej samej transakcji. Mając w garści tak niewyobrażalną gotówkę, facet uderzył w mniejszą giełdę DEX i sztucznie, własnym kapitałem, wywindował cenę mało płynnego, śmieciowego tokena z 2 do 400 dolarów.
Pach, i po sprawie.
Trwało to zaledwie dwanaście sekund. Protokół pożyczkowy, z którym współpracowaliśmy, odpytał swoją źle skonfigurowaną wyrocznię o wycenę zastawu. Zobaczył, że ten niszowy token jest nagle warty fortunę. System pozwolił więc hakerowi zastawić owe zmanipulowane, wirtualne wydmuszki i wyciągnąć w zamian twarde stablecoiny. Kiedy chwile później napastnik oddał flash loan i rynek wrócił do normy, platforma została z portfelem pełnym bezwartościowych monet. Zbankrutowała. Prosty arbitraż połączony z bezlitosną socjotechniką na maszynie wirtualnej, zgadza się?
Pytasz pewnie teraz, jak nie dać się wrobić, wrzucając swoje ciężko zarobione oszczędności w jakiś nowy basen płynności. Odłóżmy na bok akademickie dywagacje. Oto brutalnie skuteczny, trzyetapowy filtr bezpieczeństwa. Sam przepuszczam przez niego każdy audyt architektury przed rekomendacją alokacji kapitału:
Zrozumienie tej bezwzględnej mechaniki odróżnia zwykłe mięso armatnie każdej hossy od weteranów, którzy faktycznie pomnażają tu majątek. Traktuj od dzisiaj każdy obiecujący protokół jak zaminowany teren. Jeśli kod ślepo i naiwnie ufa jednej giełdzie, a programiści pożałowali czasu na solidny bufor czasowy, to problem wcale nie polega na tym, czy ktoś ten wektor uderzenia zrealizuje. Kwestią jest wyłącznie kiedy skrypt napisany przez kogoś mądrzejszego od twórców zwęszy darmową gotówkę.
Wszyscy wokół trąbią, żeby po prostu wpiąć Chainlinka i iść spać. Błąd. Wielki błąd. Skryptowanie pod DeFi to nie zabawa klockami Lego, gdzie doklejasz gotowy moduł i zapominasz o sprawie.
Pamiętam audyt pewnego protokołu pożyczkowego z naszego rodzimego podwórka na przełomie października 2022 roku. Chłopaki postawili świetny front-end, zgarnęli trochę kapitału i byli absolutnie pewni swego. Korzystali z rzekomo super-bezpiecznego mechanizmu TWAP (Time-Weighted Average Price) z Uniswap V3. Dwa dni po mainnecie wyparowało im 1,4 miliona dolarów. Dlaczego? Ktoś wziął gigantyczną pożyczkę błyskawiczną (flash loan), sztucznie wypompował cenę niszowego tokena na jednym niefortunnym bloku, a ich mądry smart kontrakt ślepo zjadł tę spreparowaną wartość jak darmowe pączki w tłusty czwartek.
Typowy wektor ataku na wyrocznię cenową to najczęściej brutalna, bezlitosna matematyka.
Napastnik bezczelnie gra na różnicy między zmanipulowanym kursem na lokalnym, mało płynnym DEX-ie a globalną ceną rynkową. Jeżeli wasz kod nie weryfikuje głębokości rynku przed masową likwidacją pozycji użytkowników, stajecie się darmowym bankomatem dla botów arbitrażowych, zgadza się? Młodzi devowie notorycznie wpadają też w banalną pułapkę starych danych. Wyrocznia odświeża się z pewnym opóźnieniem — gdy rynek nagle krwawi i wszystko leci na łeb na szyję, zablokowany stary odczyt to absolutny wyrok śmierci dla skarbca całego ekosystemu.
Mam dla was wysoce specyficzną radę wprost z okopów deweloperki Web3. Zamiast polegać na jednym dostawcy, zaimplementujcie asynchroniczny obwód bezpieczeństwa. Zastosujcie ten krótki framework przy najbliższym kodowaniu:
Architektura inteligentnych kontraktów nigdy nie wybacza naiwności. Albo ty walidujesz dane wejściowe z paranoiczną wręcz dokładnością, albo zmotywowany haker błyskawicznie weryfikuje płynność twojego protokołu.