Ponieważ protokoły DeFi wciąż się nagrzewają w ekosystemie Ethereum, CipherTrace widzi coraz więcej exploitów i wektorów ataków na jaw. W ubiegłym tygodniu, 28 grudnia 2020 r., Wykorzystano kontrakt na wydobycie tarcz z kontraktu Cover Protocol, Blacksmith. Hakerzy wykorzystali błąd w kontrakcie wydobywczym, aby wybić nieskończoną liczbę tokenów COVER i wyssać ponad 4.4 miliona dolarów z projektu.
Protokół okładki wydany ich post-mortem wczoraj stwierdzający, że nieznany deweloperom błąd był obecny od pierwszego wdrożenia kontraktu Blacksmith, podkreślając znaczenie dokładnych audytów bezpieczeństwa i pentestowania inteligentne kontraktyCo to są inteligentne kontrakty? Inteligentny kontrakt to profesjonalista komputerowy… Więcej.
Oś czasu nieskończonego bicia
Oś czasu początkowego atakującego
- Nowa pula płynności Balancera wynosiła w dodatku do kontraktu Blacksmith.sol.
- Napastnik depozyty 1,326,879.99 tokenów BPT do kontraktu Blacksmith.sol.
- Wtedy ten sam napastnik stracony exploit, poprzez wycofanie środków z umowy.
- Atakujący był w stanie kontynuować bicia nagród i wypłacanie środków w wysokości około 4.4 mln USD.
W interesującym obrocie wydarzeń rzekomi „biali hakerzy” powiązani z Grap Finance również wykorzystali błąd do wybicia tokenów COVER o wartości około 4 milionów dolarów. Grap Finance ostatecznie zwrócił fundusze do Cover Protocol.
Ramy czasowe dotyczące konta EOA (Externally Owned Account) firmy Grap Finance
- Nowa pula płynności była zatwierdzony do wydobywania płynności.
- Wdrożenie programu Grap Finance EOA zdeponowany 15,255.55 XNUMX BPT (DAI / podstawa) do puli na okładce za pośrednictwem kontraktu Blacksmith.sol.
- Mniej więcej cztery minuty później fundusze były wycofane na pokrycie, pozostawiając 1 Wei w saldzie EOA dostawcy Grap Finance.
- Inny użytkownik zewnętrzny wycofałem się większość ich salda z kontraktu Blacksmith.sol mniej więcej w tym samym czasie, który doprowadził Grap Finance z całą płynnością do puli DAI / Basis na kontrakcie Blacksmith.sol.
- Wdrażający Grap Finance zdeponowany powrót 15,255.55 BPT (DAI / Basis) do puli.
- Następnie Grap Finance Deployer roszczenia nagrody i, w wyniku exploita, wybija 40,796,131,214,802,500,000.21 COVER.
- Po spaleniu wybitych żetonów Grap Finance Deployer wysyła z powrotem Ether to Cover stwierdzający „Następnym razem zajmij się swoim własnym gównem”.
Jak wybić nieskończone tokeny - analiza techniczna
Tło
Ten exploit przenosi nas z powrotem do podstaw języka programowania Solidity, który jest używany do wdrażania inteligentnych kontraktów w Ethereum. Po skompilowaniu tych kontraktów maszyna wirtualna Ethereum (EVM) będzie w stanie zrozumieć instrukcje (tj. Opkody) używane do wykonywania różnych funkcji oraz manipulowania pamięcią i pamięcią. EVM ma trzy różne obszary, w których może przechowywać dane: pamięć, pamięć masowa i stos. Zrozumienie tych obszarów jest ważne, aby zrozumieć, w jaki sposób wykorzystano błąd.
Podobnie jak w przypadku pamięci o dostępie swobodnym (RAM) na urządzeniu komputerowym, „pamięć”W Solidity przydziela pamięć dla określonej zmiennej. W tym przypadku ta zmienna jest ograniczona do określonej funkcji. Pamięć jest czyszczona po wykonaniu funkcji, ale może pozostać, jeśli zawartość tej pamięci zostanie przeniesiona do pamięci, zanim funkcja powróci.
"przechowywanie”W Solidity pozwala zmiennym działać jako wskaźnik do przechowywania danych w mapowaniach lub strukturach danych. Dane pamięci są trwałe między wywołaniami funkcji a transakcjami. Pod maską pamięć masowa jest zasadniczo magazynem klucza i wartości, który mapuje słowa 256-bitowe na słowa 256-bitowe.
Należy zauważyć, że EVM nie jest maszyną rejestrującą, ale maszyną stosową - w związku z tym wszystkie obliczenia są wykonywane w obszarze danych o nazwie stos. Stos ma maksymalną pojemność 1024 elementów, ale tylko górne 16 jest łatwo dostępnych, które można wykorzystać do zamiany najwyższego elementu na jeden z 16 elementów poniżej lub więcej.
Bug
Hakerzy wykorzystali Blacksmith.sol Cover Protocol - umowę Shield Mining, która umożliwia stakerom otrzymywanie nagród w tokenach określonego projektu lub puli, takich jak tokeny CLAIM i NOCLAIM, w ramach protokołu Cover Protocol.
Aby lepiej zrozumieć błąd, najpierw spójrzmy na opinię publiczną totalizator piłkarski zmienna będąca mapowaniem (czyli przechowywaniem danych):
At Linia 118, widzimy, że kontrakt buforuje dane puli w pamięci za pomocą słowa kluczowego „memory”.
Potem dalej Linia 121, kontrakt aktualizuje pulę w magazynie jako plik updatePool (address _lpToken) funkcjonować używa a Basen magazynowy zmienna.
Jeśli jednak spojrzysz dalej w depozyt (adres _lpToken, uint256 _amount) funkcja, używa tego samego basen zmienna z wiersza 118, która została zbuforowana w pamięci w funkcji do obliczeń dla Pool.accRewardsPerToken. W tym momencie basen zmienna została skopiowana z totalizator piłkarski mapowania i został zapisany w pamięci.
W rezultacie wszelkie zmiany wprowadzone w basen zmienna w ramach depozyt (adres _lpToken, uint256 _amount) funkcja nie zmieni totalizator piłkarski mapowanie w pamięci łańcuchowej kontraktu ze względu na fakt, że zmienne używające słowa kluczowego „memory” są objęte zakresem tylko w ramach samej funkcji. Stamtąd umowa aktualizuje plik Pool.accRewardsPerToken w ciągu updatePool (address _lpToken) funkcja, która wykorzystuje pamięć. Więc teraz, w ramach updatePool (address _lpToken) funkcja Pool.accRewardsPerToken która jest aktualizowana znacznie wzrasta, ponieważ technicznie była to nowa pula i nie była powiązana z basen w pamięci.
W następstwie tej luki i niewłaściwego użycia pamięci i pamięci masowej, górnik.rewardWriteoff w ciągu depozyt (adres _lpToken, uint256 _amount) funkcja jest błędnie obliczona, a także używa nieprawidłowego basen.accRewardsPerToken, ponieważ nadal jesteśmy w funkcji depozytu, która obsługuje instancję programu w pamięci podręcznej basen.
Oprócz funkcji depozytu każdy, taki jak Grap Finance, może uzyskać szaloną liczbę wybitych tokenów, gdy wykonuje claimRewards (address _lpToken) funkcjonować. Ta funkcja, która służy do zbierania nagród, kończy się wywołaniem _claimCoverRewards (pula pamięci puli, kopacz pamięci górnika) który odwołuje się do górnik.rewardWriteoff które podkreśliliśmy powyżej. Ponieważ ta zmienna jest znacznie mniejsza niż rzeczywista Pool.accRewardsPerTokenkontrakt skutkuje wybiciem dużej ilości żetonów.
Na wynos
CipherTrace ma nadzieję, że to tło w wykorzystywanym błędzie ujawni znaczenie dokładnych audytów bezpieczeństwa i testowania inteligentnych kontraktów w dowolnym blockchainBlockchain - technologia leżąca u podstaw bitcoina i innych c… Więcej ktoś decyduje się na wdrożenie. Podczas gdy Grap Finance zwrócił środki, które otrzymali za pośrednictwem exploita, pierwotny haker nadal był w stanie uzyskać ponad 4 miliony dolarów z protokołu DeFi, a wartość tokena COVER spadła od tego czasu o prawie 99%.
Źródło: https://ciphertrace.com/infinite-minting-exploit-nets-attacker-4-4m/