Hvad er Reentrancy Attack?
En Reentrancy Attack opstår, når en kontrakt overgiver kontrol til en anden kontrakt under et kald, og den eksterne kode hopper tilbage ind i den første kontrakt, før den når at opdatere sine registre. Det tidsmæssige trick gør det muligt for angriberen at gentage følsomme handlinger som udbetalinger igen og igen. Forestil dig at bede om en tilbagebetaling og så bevæge dig tilbage til skranken, før kassereren låser kassen.
“Kun gammel kode kan blive ramt af en Reentrancy Attack.” Det er ikke sandt. Enhver kontrakt, der foretager et eksternt kald før den låser sin egen tilstand, kan være sårbar, hvis logikken er dårligt skrevet.
Hvordan Reentrancy Attack virker
Kort historie. En typisk smart kontrakt har en udbetalingsfunktion, som sender midler til den, der anmoder. Hvis den sender midlerne først og først rydder saldoen senere, kan en angriber smutte ind med et callback og bede om mere, før saldoen sættes til nul.
- Start: Angriberen indsætter nogle midler for at se legitim ud.
- Kald: Angriberen udløser udbetalingsfunktionen på målkontrakten.
- Fallback: Målet sender midler, hvilket kører angriberens fallbackfunktion.
- Gentag: Den fallbackfunktion kalder udbetalingsfunktionen igen, før saldoen opdateres.
- Tømning: Løkken fortsætter, indtil kontrakten mangler midler eller gas. Ja, det er tricket.
Én lille fejl i rækkefølgen, stort problem.
Hvorfor Reentrancy Attack er vigtig
Det betyder noget, fordi tidsfejl flytter rigtige penge hurtigt. Derudover er det et af de klassiske angreb, som alle udviklere og nysgerrige brugere bør kunne genkende med det samme.
- Fordel: At kende mønstret hjælper dig med at få øje på risikabel kode og holde midler sikre.
- Perspektiv: Det trives på offentlig gennemsigtighed, da alt på en blockchain er synligt og kan kaldes.
- Relevans: Du vil møde det i DeFi, broer, kasser og endda i udbetalinger fra DAO'er.
Følg checks then effects then interactions. Opdater saldi først, og foretag så eksterne kald. Tilføj en simpel reentrancy guard for ekstra sikkerhed.
Vigtige kendetegn ved Reentrancy Attack
Her er, hvad der får det til at fungere:
- Rekursion: Ekstern kode kalder tilbage ind i samme kontrakt, før den er færdig.
- Rækkefølge: Fejlen opstår, når afsendelse af midler eller eksternt kald sker før opdatering af tilstanden.
- På tværs: Den kan hoppe mellem flere kontrakter, ikke kun en funktion.
- Aktiver: Fungerer med ETH, tokens og endda regnskabskreditter, hvis det er kodet dårligt.
Varianter
Forskellige variationer, samme hovedpine for dårligt skrevet kode:
- Enkelt: Genindtræden i den samme funktion gentagne gange.
- Tværgående: Genindtræden via en anden funktion i samme kontrakt.
- Flere: Genindtræden på tværs af to eller flere kontrakter i en løkke.
- Kun læsning: At påvirke views eller prisorakler for at snyde efterfølgende skrivninger.
At rette en Reentrancy Attack handler ikke kun om én funktion. Gennemgå hvert eksternt kald, tilføj tests for mærkelige kaldkæder, og planlæg regelmæssige revisioner.
Eksempel
I 2016 udnyttede The DAO en reentrancyløkke i udbetalingsfunktionen, før saldi blev nulstillet, hvilket tømte en massiv skattekiste på få minutter.
Sjov fakta
Fællesskabets huskeregel checks then effects then interactions stammer fra tidlige sikkerhedsguides og blev hængende, fordi den er kort, let at huske og virker.
Afrunding
Kort version du kan have i lommen: hvis udenlandsk kode kan kalde dig, før du er færdig med din egen bogføring, så antag, at den vil det, og du kan komme til at give den gratis penge. Det er en Reentrancy Attack.
