Šta je reentrancy napad?
Reentrancy napad nastaje kada ugovor tokom poziva prepusti kontrolu drugom ugovoru, a taj spoljni kod se vrati u prvi ugovor pre nego što on završi ažuriranje svoje evidencije. Ovaj trik s tempiranjem omogućava napadaču da iznova ponavlja osetljive radnje, poput isplata. Zamislite da tražite povraćaj novca, a zatim se ušunjate nazad do šaltera pre nego što blagajnik zaključa kasu.
„Samo stari kod može biti meta reentrancy napada.“ Nije tačno. Svaki ugovor koji upućuje spoljašnji poziv pre nego što zaključa sopstveno stanje može biti ranjiv ako je logika nemarno napisana.
Kako funkcioniše reentrancy napad
Evo kratke priče. Tipičan pametni ugovor ima funkciju za isplatu koja šalje sredstva pozivaocu. Ako prvo pošalje sredstva, a tek kasnije ažurira stanje salda, napadač može da ubaci povratni poziv i zatraži još pre nego što saldo bude postavljen na nulu.
- Početak: Napadač uplati nešto sredstava kako bi delovao legitimno.
- Poziv: Napadač pokreće isplatu u ciljnom ugovoru.
- Fallback: Ciljni ugovor šalje sredstva, čime se pokreće fallback funkcija napadača.
- Ponavljanje: Ta fallback funkcija ponovo poziva isplatu pre nego što se saldo ažurira.
- Pražnjenje: Petlja se nastavlja sve dok ugovor ne ostane bez sredstava ili gasa. Da, u tome je trik.
Jedna sitna greška u redosledu, veliki problem.
Zašto je reentrancy napad važan
Važno je da ovo razumete jer greške u tempiranju mogu brzo da odnesu pravi novac. Osim toga, ovo je jedan od klasičnih napada koje bi svaki graditelj i radoznali korisnik trebalo odmah da prepozna.
- Prednost: Poznavanje ovog obrasca pomaže vam da uočite rizičan kod i zaštitite sredstva.
- Perspektiva: Napad se oslanja na javnu transparentnost, jer je sve na blokčejnu vidljivo i dostupno za pozivanje.
- Relevantnost: Možete ga sresti u DeFi-ju, mostovima, trezorima, pa čak i u isplatama po osnovu upravljanja za DAO organizacije.
Pratite redosled: provere, izmene stanja, pa interakcije. Prvo ažurirajte salda, a tek onda upućujte spoljašnje pozive. Dodajte jednostavnu zaštitu od reentrancy napada za dodatnu sigurnost.
Ključne karakteristike reentrancy napada
Evo šta ga pokreće:
- Rekurzija: Spoljni kod ponovo poziva isti ugovor pre nego što on završi.
- Redosled: Do greške dolazi kada se sredstva šalju ili se upućuje spoljašnji poziv pre ažuriranja stanja.
- Unakrsno pozivanje: Napad može da se prebacuje između više ugovora, a ne samo jedne funkcije.
- Sredstva: Može da pogodi ETH, tokene, pa čak i obračunske kredite ako je kod loše napisan.
Varijante
Različiti oblici, ista muka za nemarno napisan kod:
- Jednostruki: Ponovljeno pozivanje iste funkcije.
- Unakrsni: Ponovni ulazak preko druge funkcije u istom ugovoru.
- Višestruki: Ponovni ulazak kroz dva ili više ugovora u petlji.
- ReadOnly: Uticanje na funkcije za čitanje ili cenovne orakle kako bi se obmanule kasnije izmene stanja.
Otklanjanje reentrancy napada ne svodi se na jednu funkciju. Proverite svaki spoljašnji poziv, dodajte testove za neobične lance poziva i redovno zakazujte revizije.
Primer
Napad na The DAO iz 2016. iskoristio je petlju reentrancy poziva prilikom isplate, pre nego što su salda bila ažurirana, i za nekoliko minuta ispraznio ogroman trezor.
Zanimljivost
Izraz „prvo provere, zatim izmene stanja, pa interakcije“ potiče iz ranih vodiča za bezbednost. Ustalio se zato što je kratak, lako se pamti i funkcioniše.
Zaključak
Ukratko, ovo zapamtite: ako spoljni kod može da vas pozove pre nego što završite sopstveno vođenje evidencije, računajte na to da će pokušati — i mogli biste mu dati besplatan novac. To je reentrancy napad.