Wat is Reentrancy Attack?
Een Reentrancy Attack is wanneer een contract tijdens een oproep controle doorgeeft aan een ander contract en die externe code terugspringt naar het eerste contract voordat dat zijn gegevens heeft bijgewerkt. Die timingtruc laat de aanvaller toe om gevoelige handelingen zoals opnames keer op keer te herhalen. Stel je voor dat je om een terugbetaling vraagt en terug naar de balie sluipt voordat de kassier de kassa afsluit.
“'Alleen oude code kan worden getroffen door een Reentrancy Attack.'” Dat is niet waar. Elk contract dat een externe oproep doet voordat het zijn eigen status vergrendelt kan kwetsbaar zijn als de logica slordig is.
Hoe Reentrancy Attack werkt
Kort verhaal. Een typisch smart contract heeft een withdrawfunctie die fondsen naar de aanroeper stuurt. Als het eerst de fondsen stuurt en de balans pas later leegmaakt, kan een aanvaller een callback binnensluipen en opnieuw om meer vragen voordat de balans op nul wordt gezet.
- Start: De aanvaller stort wat fondsen om er legitiem uit te zien.
- Oproep: De aanvaller activeert withdraw op het doelcontract.
- Fallback: Het doel stuurt fondsen, wat de fallbackfunctie van de aanvaller uitvoert.
- Herhaal: Die fallback roept withdraw opnieuw aan voordat de balans is bijgewerkt.
- Leegmaken: De lus gaat door tot het contract geen fondsen of gas meer heeft. Ja, dat is de truc.
Een klein foutje in de volgorde, groot probleem.
Waarom Reentrancy Attack belangrijk is
Het is van belang omdat timingfouten echt geld snel kunnen verplaatsen. Bovendien is dit een klassiek exploit dat iedere ontwikkelaar en geïnteresseerde gebruiker direct zou moeten herkennen.
- Voordeel: Het herkennen van het patroon helpt je risicovolle code te zien en fondsen veilig te houden.
- Perspectief: Het profiteert van openbare transparantie omdat alles op een blockchain zichtbaar en aanroepbaar is.
- Relevantie: Je ziet het in DeFi, bridges, schatkisten en zelfs in uitbetalingen voor DAOs.
Volg eerst checks then effects then interactions. Werk eerst saldi bij en doe daarna externe oproepen. Voeg een eenvoudige reentrancy guard toe voor extra veiligheid.
Belangrijkste kenmerken van Reentrancy Attack
Dit is wat het doet:
- Recursie: Externe code roept opnieuw hetzelfde contract aan voordat dat klaar is.
- Volgorde: De fout ontstaat wanneer het sturen van fondsen of een externe oproep gebeurt voordat de status is bijgewerkt.
- Cross: Het kan tussen meerdere contracten heen en weer springen, niet alleen binnen één functie.
- Assets: Werkt met ETH, tokens en zelfs boekhoudkundige tegoeden als het slecht geprogrammeerd is.
Varianten
Verschillende vormen, zelfde probleem bij slordige code:
- Single: Herhaaldelijk opnieuw betreden van dezelfde functie.
- Cross: Opnieuw betreden via een andere functie binnen hetzelfde contract.
- Multi: Opnieuw betreden over twee of meer contracten in een lus.
- ReadOnly: Beïnvloeden van views of prijsorakels om latere schrijfbewerkingen te misleiden.
Het verhelpen van een Reentrancy Attack gaat niet over slechts één functie. Controleer elke externe oproep, voeg tests toe voor vreemde oproepketens en plan regelmatige audits.
Voorbeeld
De exploit van The DAO in 2016 gebruikte een reentrancylus bij withdraw voordat balansen werden geleegd, waardoor in enkele minuten een enorme schatkist werd leeggehaald.
Leuk weetje
De community catchphrase 'checks then effects then interactions' komt uit vroege beveiligingsgidsen en bleef hangen omdat het kort, makkelijk te onthouden en effectief is.
Samenvatting
Korte versie om bij de hand te houden: als externe code je kan aanroepen voordat je je eigen administratie afmaakt, ga ervan uit dat het gebeurt en je mogelijk gratis geld weggeeft. Dat is een Reentrancy Attack.
