Co je Reentrancy Attack?
Reentrancy Attack je situace, kdy kontrakt předá kontrolu jinému kontraktu během volání a ten externí kód se vrátí do prvního kontraktu dřív, než dokončí aktualizaci svých záznamů. Ten časový trik umožní útočníkovi opakovaně provádět citlivé akce, například opakované výběry. Představte si, že žádáte o vrácení peněz a vrátíte se ke přepážce dřív, než pokladník zamkne pokladnu.
„Pouze starý kód může být zasažen Reentrancy Attack.“ Není to pravda. Jakýkoli kontrakt, který provede externí volání dříve, než zamkne svůj stav, může být zranitelný, pokud je logika nedbale napsaná.
Jak Reentrancy Attack funguje
Krátký příběh. Typický smart kontrakt má funkci pro výběr, která posílá prostředky volajícímu. Pokud pošle prostředky nejdřív a až poté smaže zůstatek, útočník může vklouznout zpět pomocí callbacku a požádat o více dříve, než se zůstatek nastaví na nulu.
- Start: Útočník vloží nějaké prostředky, aby vypadal důvěryhodně.
- Call: Útočník spustí výběr na cílovém kontraktu.
- Fallback: Cílový kontrakt pošle prostředky, což spustí fallback funkci útočníka.
- Repeat: Ta fallback funkce zavolá výběr znovu dříve, než je zůstatek aktualizován.
- Drain: Smyčka pokračuje, dokud kontrakt nevyčerpá prostředky nebo gas. Ano, to je ten trik.
Jeden maličký omyl v pořadí, velký problém.
Proč je Reentrancy Attack důležitý
Záleží na tom, protože časové chyby přesouvají skutečné peníze velmi rychle. Navíc jde o jeden z klasických exploitů, který by měl každý vývojář a zvědavý uživatel umět rozpoznat na první pohled.
- Výhoda: Znát tento vzor vám pomůže odhalit rizikový kód a chránit prostředky.
- Pohled: Využívá veřejnou průhlednost, protože všechno na blockchain je viditelné a volatelné.
- Výskyt: Potkáte jej v DeFi, mostech, pokladnách a dokonce i při výplatách v řízení pro DAOs.
Držte se pravidla kontrola pak efekty pak interakce. Nejprve aktualizujte zůstatky, potom provádějte externí volání. Přidejte jednoduchý reentrancy guard pro vyšší bezpečnost.
Hlavní charakteristiky Reentrancy Attack
Tady je, co ho živí:
- Rekurze: Externí kód zavolá zpět do stejného kontraktu dříve, než dokončí svoje zpracování.
- Pořadí: Chyba se objeví, když odesílání prostředků nebo volání ven proběhne dříve než aktualizace stavu.
- Přesah: Může se rozkmitat přes více kontraktů, nejen v jedné funkci.
- Aktiva: Funguje s ETH, tokeny a i účetními kredity, pokud je kód napsaný špatně.
Varianty
Různé varianty, stejná bolest hlavy pro nepořádný kód:
- Single: Opakovaný znovuvstup do téže funkce.
- Cross: Znovuvstup přes jinou funkci ve stejném kontraktu.
- Multi: Znovuvstup přes dva nebo více kontraktů v cyklu.
- ReadOnly: Ovlivňování view funkcí nebo cenových orákulů, aby se oklamaly pozdější zápisy.
Oprava Reentrancy Attack není jen o jedné funkci. Projděte každé externí volání, přidejte testy pro neobvyklé řetězce volání a naplánujte pravidelné audity.
Příklad
Zneužití The DAO z roku 2016 použilo reentrancy smyčku při výběru před vymazáním zůstatků a během několika minut vyprázdnilo obrovský poklad.
Zajímavost
Komunitní heslo kontrola pak efekty pak interakce pochází z časných bezpečnostních průvodců a ujalo se, protože je krátké, snadno zapamatovatelné a funguje.
Shrnutí
Krátká verze, kterou si můžete pamatovat: pokud externí kód může zavolat váš kontrakt dříve, než dokončíte své vlastní účtování, předpokládejte, že to udělá, a můžete mu darovat peníze zdarma. To je Reentrancy Attack.
