BSC Flash Loan Attack: Pancake Bunny

W maju 2021 roku widzieliśmy kilka hacków wymierzonych w przedmioty BSC DeFi. W szczególności, luka związana z wybijaniem nagród w agregatorze zysków, Pancake Bunny, została wykorzystana do wybicia ~ 7 mln tokenów BUNNY z absolutnie niczego, co spowodowało ogromną stratę pieniężną w wysokości 45 mln USD. Po krwawym włamaniu, 3 rozwidlone zadania — AutoShark, Merlin Labs i Pancake Hunny — zostały zaatakowane porównywalnymi metodami. Amber Group'& rsquo; Grupa Blockchain Security, kierowana przez Dr Chiachih Wu, omawia lukę i przedstawia szczegółowy opis wykorzystania przez replikację ataku na Pancake Bunny.

Ukryta powierzchnia ataku: balanceOf()

Wiele osób uważa, że ​​komponowanie jest ważne dla sukcesu DeFi. Umowy tokenów (np. ERC20) odgrywają istotną rolę w dolnej warstwie lego DeFi. Jednak projektanci mogą zignorować pewne niemożliwe do opanowania i nieprzewidywalne warunki podczas włączania ERC20 do swoich zadań DeFi. Na przykład możesz „& rsquo; Przewiduj, kiedy i ile tokenów otrzymasz po odzyskaniu istniejącego salda tokenów. Ta nieprzewidywalność tworzy ukrytą powierzchnię ataku.

W wielu przypadkach mądre porozumienia odwołują się do sald ERC20 w swoim uzasadnieniu usług. Na przykład, gdy użytkownik przenosi kilka tokenów XYZ do mądrej umowy, XYZ.balanceOf() jest wywoływany, aby sprawdzić, ile pieniędzy zostało zdobytych. Jeśli jesteś& rsquo; ponownie zapoznając się z bazą kodu Uniswap, najprawdopodobniej rozumiesz, że umowa Uniswap V2Pair zawiera wiele wywołań balanceOf().

W bicie kodu Uniswap V2Pair.mint() wykorzystuje istniejące salda (saldo0, saldo1) oraz informacje księgowe (kwota0,kwota1) w celu uzyskania ilości przekazanych przez użytkownika (kwota0,kwota1). Jeśli jednak zła gwiazda przesunie niektóre właściwości (token1 lub token2) tuż przed wywołaniem mint(), ofiara zaoferuje większą płynność niż oczekiwano, tj. wybitych zostanie więcej tokenów LP. Jeśli korzyści są określane na podstawie liczby żetonów PL, zła gwiazda może zyskać, gdy korzyści przewyższają wydatki.

Uniswap V2Pair.burn() ma podobne zagrożenie. Wywołujący funkcję mint() może zagrozić sobie bez pełnego zrozumienia zawartych w niej zagrożeń. Tak było w przypadku Pancake Bunny.

Zdobądź bonus 110 USDT Futures całkowicie za darmo!

W powyższym kodzie wiersz 140 uzyskuje saldo tokena LP poprzez balanceOf() i przechowuje go w płynności. W wierszach 144–145 część wszystkich tokenów LP należących do Uniswap V2Pair (tj. płynność z _ totalSupply) jest wykorzystywana do uzyskania (kwota0, kwota1) z istniejącymi saldami (saldo0, saldo1) 2 właściwości (tj. , token0 i token1). Później (kwota0, kwota1) z 2 nieruchomości są przenoszone na adres w wierszach 148–149.

Tutaj zła gwiazda może kontrolować (balance0, balance1) i płynność, wysyłając trochę token0+ token1 lub token LP do umowy Uniswap V2Pair tuż przed wywołaniem funkcji mint(), aby osoba dzwoniąca uzyskała więcej token0+ token1 . My& rsquo; Przeprowadzę Cię przez kod źródłowy Pancake Bunny i ujawnię, jak zła gwiazda może na tym zarabiać.

Analiza luk: BunnyMinterV2

W kodzie źródłowym Pancake Bunny funkcja BunnyMinterV2.mintFor V2() nadzoruje wybijanie tokenów BUNNY jako korzyści. W szczególności suma do wybicia (tj. mintBunny) wynika z kryteriów wejściowych, _wypłata opłat i _ opłata za wyniki. Obliczenie jest powiązane z 3 funkcjami: _ zapAs setsTo BunnyBNB() (linia 213), priceCalculator.valueOfAs set() (linia 219) oraz kwotaBunnyTo Mint() (linia 221). Ponieważ zła gwiazda może wybić dużą ilość KRÓLIKA, problem zależy od jednej z 3 funkcji wskazanych powyżej.

Przeczytaj artykuł:  Mike Novogratz oskarża amerykańskich urzędników o słabą orientację w branży kryptowalut

Niech& rsquo; s zaczynają się od funkcji _ zapAs ustawia To BunnyBNB(). Gdy przekazaną własnością jest aCake-LP (wiersz 267), określona ilość tokenów LP jest wykorzystywana do wyeliminowania płynności i pobrania (ilość Token 0, ilość Token 1) z (token0, token1) z puli płynności (wiersz 278). Za pomocą umowy zapBSC te właściwości są przełączane na tokeny BUNNY-BNB LP (linie 287–288). Odpowiednia ilość tokenów BUNNY-BNB LP jest następnie zwracana do dzwoniącego (linia 298). Tutaj mamy problem.Czy ilość odpowiada ilości żetonów LP, które zakładasz, że zostaną spalone?(* )wykonanie

W V2Router.removeLiquidity() płynność tokenów LP (ilość w zestawach zapPancakeAs BunnyBNB()) zostanie wysłana do umowy To Pair (wiersz 500) i zostanie wyczarowana Pancake Pair.burn(). Naleśnikuj istniejące saldo żetonów LP Jeśli para jest większa niż 0, rzeczywista suma do spalenia będzie wyższa niż ilość, co pośrednio zwiększa sumę BUNNY do wybicia. Problem z naleśnikami w _ zap

Innym setsAs BunnyBNB() jest wywołanie zapBSC.zapTo().InToken kryjące się za tym rozumowaniem polega na wymianie 2 właściwości zebranych przez removeLiquidity() na tokeny BUNNY-BNB LP. ZapBSC zamienia właściwości poprzez Od czasu zamiany, zła gwiazda może wykorzystywać pożyczki flash do kontrolowania ilości przełączanych BUNNY-BNB.Pancake na BunnyMinterV2.mint

Wstecz V2(), wartość bunnyBNBA zwrócona przez zapFor setsAs BunnyBNB() zostałaby wprowadzona priceCalculator.valueOfTo set() w celu oszacowania wartości na podstawie BNB (tj. vauleAs BNB), porównywalnej z systemem Oracle.

Jednak priceCalculator.valueOf set() rekomenduje ilość BNB i BUNNY (rezerwa0, rezerwa1) w parze BUNNY_BNB As Pair jako źródła kosztów, Pancake, który umożliwia złej gwieździe wykorzystanie pożyczek flash do kontrolowania ilości bitych tokenów BUNNY. ilośćBunny

Funkcja Mint() to podstawowa estymacja matematyczna. Wkład wejściowy zwiększa się o 5 (bunnyPerProfitBNB = 5e18), co samo w sobie nie ma pola powierzchni ataku, jednak wzmocnienie wzmacnia kontrolę opisaną powyżej. Walka

Od do

Ponieważ atak jest aktywowany przez getReward(), potrzebujemy certyfikatu potwierdzającego korzyści. Etherscan pokazany na powyższym zrzucie ekranu Pancake, haker To Bunny wyczarował funkcję init(), polegającą na wykorzystaniu zgody na wymianę 1 WBNB na WBNB- Tokeny USDT-LP i zdeponuj je w VaultFlip

Zgodnie z umową Flip, taką, że odniósłby pewne korzyści poprzez wywołanie opisanej powyżej metody getReward().Exp, wykorzystując funkcjęTo Prepare(), odtworzyliśmy wywołanie vaultFlipWe Flip.deposit() (wiersz 62). Jednak podobnie wykorzystał umowę ZapBSC, aby usprawnić uzyskiwanie tokenów LP (linie 54-57). Naleśnik, jeden jest & rsquo; t w stanie uzyskać korzyści, dopóki opiekun For Bunny nie rozpocznie następnego wywołania harvest(). Naleśnik ten czynnik,

W Bunny haker zrobił'& rsquo; Rozpoczął atak aż do pierwszego rozdania zbiorów () po rozdaniu init(). Dlatego w naszej symulacji żaden opiekun nie może rozpocząć zbioru().

Rekurencyjne pożyczki Flash

W tym celu wykorzystujemy funkcję eth-brownie, aby podszywać się pod opiekuna i ręcznie rozpocząć transakcję harvest() (wiersz 25). i Bank TubeHere Amber Group, Blockchain Security'& rsquo; s(*)group właśnie wykorzystała następujące umowy 8 Pancake Pair & rsquo; funkcja flash-swap do wypożyczenia 7 mln WBNB:

Aby usprawnić wywołania flash-swap, załadowaliśmy 2 kryteria do czwartego argumentu wejściowego wywołań Pancake Pair.swap() (linia 4 lub 72): poziom i właściwość. Zmienna level pokazuje, który poziom wywołania swap() ponownie wejść; zmienna właściwości ma wartość 74 lub 0, co oznacza, że ​​potrzebujemy uzyskać token1 lub token0.

Przeczytaj artykuł:  Niemiecki bank Comdirect oferuje teraz 11 kryptowalut ETP w planie oszczędnościowym

Używając funkcji zwrotnej pancakeCall(), rekurencyjnie wywołujemy Pancake Pair.swap() z poziomem +1, aż osiągniemy siódmy poziom. Na poziomie wiodącym wywołujemy metodę shellcode(), aby wykonać prawdziwą akcję w wierszu 98. Gdy funkcja shellcode() zwraca, zmienna właściwości zwraca uzyskaną właściwość na każdym dopasowanym poziomie (wiersze 102–104).

Pociągnąć za spust

Funkcja shellcode() wyczarowana przez siódmy poziom pancakeCall() jest prawdziwym wykorzystaniem kodu. Po pierwsze, utrzymujemy istniejące saldo WBNB w wbnbAmount (wiersz 108), zamieniamy 15,000 112 WBNB na tokeny WBNB-USDT-LP (wiersz 113) i wysyłamy je do umowy, która wybiła te tokeny LP (tj. umowa Pancake Pair) w wierszu XNUMX. Ta akcja ma na celu kontrolowanie wywołania removeLiquidity() wewnątrz funkcji _ zapAs setsTo BunnyBNB() jak oszacowano powyżej, co pozwala nam uzyskać więcej WBNB+USDT niż oczekiwano.

Drugim działaniem jest kontrolowanie kosztu USDT, do którego odwołuje się _ zapAs setsTo BunnyBNB(), aby przełączyć USDT na WBNB. Ponieważ _ zapAs setsTo BunnyBNB() wykorzystuje parę naleśników WBNB-USDT do przełączania USDT na WBNB, możemy zmienić pozostałą część WBNB pożyczonego przez flash na USDT w ramach Pancake Swap. Spowoduje to, że WBNB będzie niewiarygodnie tanie, a _ zapAs setsTo BunnyBNB() otrzyma nieproporcjonalnie dużą ilość WBNB po przełączeniu z USDT. Należy pamiętać, że kontrola kosztów odbywa się tutaj na basenie Pancake V1, a nie Pancake V2'& rsquo; s Parowanie naleśników jak w poprzedniej czynności.

Ostatnią akcją jest wywołanie getReward(). Podstawowe wezwanie do umowy może wybić 6.9 mln tokenów BUNNY (linia 125). Tokeny BUNNY mogą następnie zostać zamienione na WBNB w Pancake Swap, aby spłacić pożyczkę flash.

W naszej symulacji zła gwiazda płaci 1 WBNB i wygrywa 104 tys. WBNB + 3.8 mln USDT (porównywalne do ~ 45 mln USD).

O Grupie Bursztynowej

Amber Group to wiodąca międzynarodowa firma zajmująca się finansowaniem kryptowalut, działająca na całym świecie, działająca cały czas w Hongkongu, Taipei, Seulu i Vancouver. Założona w 2017 r. Amber Group obsługuje ponad 500 klientów instytucjonalnych i w rzeczywistości sprzedała łącznie ponad 500 miliardów dolarów w ponad 100 elektronicznych giełdy, z zarządzanymi nieruchomościami o wartości ponad 1.5 miliarda USD. W 2021 r. Amber Group pozyskała 100 milionów dolarów w ramach finansowania serii B i stała się najnowszym jednorożcem FinTech o wartości ponad 1 miliarda dolarów. Więcej informacji na stronie: www.ambergroup.io.

Każdy trader, który handluje kryptowalutą na giełdzie Binance, chce wiedzieć o nadchodzących wydarzeniach pumppodnoszenie wartości monet w celu osiągnięcia ogromnych zysków w krótkim czasie.
Ten artykuł zawiera instrukcje jak dowiedzieć się, kiedy i jaka moneta weźmie udział w kolejnym „Pump”. Każdego dnia społeczność na Kanał telegramu Crypto Pump Signals for Binance Sygnały dla Binance publikuje 10 darmowych sygnałów o nadchodzącym „Pump” i raporty o udanych”Pumps”, które z sukcesem zrealizowali organizatorzy społeczności VIP.
Obejrzyj wideo na jak dowiedzieć się o nadchodzącej kryptowalucie pump i zarabiaj ogromne zyski.
Te sygnały transakcyjne pomagają zarobić ogromne zyski w ciągu zaledwie kilku godzin po zakupie monet opublikowanych na kanale Telegram. Czy już osiągasz zysk, korzystając z tych sygnałów transakcyjnych? Jeśli nie, spróbuj! Życzymy powodzenia w handlu kryptowalutami i pragniemy otrzymać taki sam zysk, jak subskrybenci VIP Crypto Pump Signals for Binance Sygnały dla kanału Binance.
John Lesley/ autor artykułu

John Lesley to doświadczony trader specjalizujący się w analizie technicznej i prognozowaniu rynku kryptowalut. Ma ponad 10-letnie doświadczenie z szeroką gamą rynków i aktywów - walut, indeksów i towarów.John jest autorem popularnych tematów na głównych forach z milionami wyświetleń i pracuje zarówno jako analityk, jak i profesjonalny trader zarówno dla klientów, jak i samego siebie.

Dodaj komentarz