Nedávná zranitelnost fondu Curve se liší od incidentů hackerských útoků kryptoměn, které jsme viděli dříve, protože tentokrát problém přímo nesouvisí se zranitelností samotného smart kontraktu, ale se základním kompilátorem použitého programovacího jazyka Vyper.
Vyper je inteligentní programovací jazyk orientovaný na smlouvy, který přijímá styl podobný Pythonu a je speciálně navržen pro interakci s virtuálním strojem Ethereum (EVM).
Dopad této zranitelnosti je velmi vážný a každý den jsou ve zprávách hlášeny obrovské ztráty. Zdá se, že situace je pod kontrolou, ale ne dříve, než hackeři ukradli více než 70 milionů dolarů. Podle následného hodnocení LlamaRisk byly některé fondy projektů DeFi také napadeny hackery, včetně fondu pETH/ETH společnosti PEGD, který ztratil 11 milionů USD, fondu msETH/ETH společnosti Metronome, který ztratil 3,4 milionu USD, a fondu alETH/ETH společnosti Alchemix, který ztratil 11 USD. 22,6 milionů amerických dolarů, zatímco fond Curve DAO ztratil přibližně 24,7 milionů amerických dolarů.
Tato zranitelnost se nazývá reentrancy error a vyskytuje se hlavně v některých verzích programovacího jazyka Vyper, konkrétně v0.2.15, v0.2.16 a v0.3.0. Proto se projekty využívající tyto specifické verze Vyperu mohou stát terčem útoků.
Co je reentrancy?
Abychom pochopili, proč k této zranitelnosti došlo, pojďme nejprve pochopit, co je reentrancy a jak funguje.
Takzvaná reentrancy znamená, že funkci lze během provádění přerušit a bezpečně zavolat znovu před dokončením předchozího volání. Tento mechanismus se často používá v aplikacích, jako je zpracování hardwarových přerušení a rekurze.
Aby byla funkce reentrantní, musí splňovat několik podmínek:
Za prvé, nemůže používat globální a statická data. Toto je konvence, což znamená, že když je funkce spuštěna, nespoléhejte na globální data nebo statické proměnné. Protože pokud je funkce během provádění přerušena a poté znovu volána, může dojít k poškození globálních a statických dat nebo ke ztrátě informací.
Za druhé, nemůže upravit svůj vlastní kód. Bez ohledu na to, kdy je funkce přerušena, měla by být schopna pokračovat v provádění stejným způsobem. Pokud funkce během provádění upraví svůj vlastní kód, může při opětovném volání dojít k chybě.
Konečně nemůže volat další funkce, které nejsou reentrantní. To znamená, že v rámci reentrantní funkce byste neměli volat jiné funkce, které nemusí být reentrantní. Protože pokud to uděláte, může to způsobit nepředvídatelné výsledky a způsobit selhání programu nebo chyby.
Je to příliš těžké na pochopení, takže nebudeme zacházet do podrobností.
Jak to bylo zneužíváno?
Pojďme si vysvětlit, jak re-entrancy útoky vedly ke krádeži finančních prostředků a ztrátě 70 milionů dolarů při útoku Curve.
Za prvé víme, že reentrancy útok odkazuje na metodu, ve které škodlivý kontrakt opakovaně volá funkci v chytré smlouvě. Při útoku Curve se tato funkce používá ke stažení likvidity uživatele v poolu. Tato funkce má chybu v tom, že neprovádí dostatek kontrol před aktualizací částky.
Podívejme se na konkrétní proces útoku:
Řekněme, že zranitelná inteligentní smlouva má 10 etherů.
Útočník zavolá funkci vkladu a vloží 1 Ethereum.
Útočník poté zavolá funkci výběru a připravuje se stáhnout 1 Ethereum. V této funkci kontroluje, zda má útočník na svém účtu 1 Ethereum.
Tato funkce však neaktualizuje zůstatek ve smlouvě před převedením 1 Etheru na účet útočníka. To znamená, že smlouva stále předpokládá, že uvnitř je 10 etherů.
Útočník znovu zavolá funkci výběru (re-entry) a připravuje se znovu stáhnout 1 Ethereum.
Protože smlouva stále myslí, že je uvnitř 10 etherů, převede 1 ether znovu na útočníka.
Tento proces se opakuje, dokud ve smlouvě není žádná likvidita.
Útočník tak může opakovaně volat funkci výběru a převést téměř veškerou likviditu ve smlouvě na svůj vlastní účet, čímž dojde ke zcizení prostředků ve smlouvě.
Tato zranitelnost je pro útočníka velmi výhodná, protože částka ve smlouvě se neaktualizuje v reálném čase, což útočníkovi umožňuje opakovat útok, dokud nebudou ve smlouvě k dispozici žádné prostředky na odstoupení. #Crv