Che cos'è Reentrancy Attack?
Un Reentrancy Attack si verifica quando un contratto cede il controllo a un altro contratto durante una chiamata e quel codice esterno ritorna nel primo contratto prima che abbia terminato di aggiornare i suoi registri. Questo trucco di tempistica permette all'attaccante di ripetere azioni sensibili come i prelievi più e più volte. Immagina di chiedere un rimborso e poi tornare al banco prima che il cassiere chiuda la cassa.
“Solo il codice vecchio può essere colpito da un Reentrancy Attack.” Non è vero. Qualsiasi contratto che effettua una chiamata esterna prima di fissare il proprio stato può essere vulnerabile se la logica è scadente.
Come funziona Reentrancy Attack
Breve storia. Un tipico smart contract ha una funzione di prelievo che invia fondi al chiamante. Se invia i fondi prima e azzera il saldo dopo, un attaccante può infilare una callback e richiedere di più prima che il saldo venga impostato a zero.
- Inizio: L'attaccante deposita alcuni fondi per sembrare legittimo.
- Chiamata: L'attaccante attiva il prelievo nel contratto bersaglio.
- Fallback: Il contratto bersaglio invia i fondi, eseguendo la funzione di fallback dell'attaccante.
- Ripeti: Tale fallback richiama il prelievo di nuovo prima che il saldo venga aggiornato.
- Svuota: Il ciclo continua fino a quando il contratto non esaurisce i fondi o il gas. Sì, questo è il trucco.
Un piccolo errore d'ordine, grande problema.
Perché Reentrancy Attack è importante
Dovrebbe interessarti perché bug di tempistica spostano soldi veri, rapidamente. Inoltre, è uno di quegli exploit classici che ogni sviluppatore e utente curioso dovrebbe riconoscere a prima vista.
- Vantaggio: Conoscere il modello aiuta a individuare codice rischioso e proteggere i fondi.
- Prospettiva: Si alimenta sulla trasparenza pubblica poiché tutto su una blockchain è visibile e richiamabile.
- Rilevanza: Lo vedrai in DeFi, nei bridge, nelle tesorerie, persino nei pagamenti di governance per le DAOs.
Segui la regola checks then effects then interactions. Aggiorna i saldi prima, poi effettua le chiamate esterne. Aggiungi una semplice reentrancy guard per maggiore sicurezza.
Caratteristiche principali di Reentrancy Attack
Ecco cosa lo fa funzionare:
- Ricorsione: Codice esterno richiama lo stesso contratto prima che termini l'esecuzione.
- Ordine: Il bug si manifesta quando l'invio di fondi o la chiamata esterna avviene prima dell'aggiornamento dello stato.
- Cross: Può rimbalzare tra più contratti, non solo tra funzioni dello stesso.
- Asset: Funziona con ETH, token e anche con crediti contabili se il codice è scritto male.
Variazioni
Varianti diverse, stesso problema per codice scritto male:
- Singola: Rientro ripetuto nella stessa funzione.
- Cross: Rientro tramite una funzione diversa nello stesso contratto.
- Multi: Rientro attraverso due o più contratti in ciclo.
- ReadOnly: Influenzare viste o oracoli di prezzo per ingannare scritture successive.
Correggere un Reentrancy Attack non riguarda solo una funzione. Controlla ogni chiamata esterna, aggiungi test per catene di chiamate insolite e programma regolari audits.
Esempio
L'exploit del 2016 a The DAO sfruttò un ciclo di reentrancy sul prelievo prima che i saldi venissero azzerati, prosciugando un'enorme tesoreria in pochi minuti.
Curiosità
Il motto della community checks then effects then interactions proviene dalle prime guide di sicurezza ed è rimasto perché è corto, facile da ricordare e funziona.
Riepilogo
Versione breve da ricordare: se codice esterno può richiamarti prima che tu completi la tua contabilità, dai per scontato che lo farà e potresti consegnargli soldi gratuiti. Questo è un Reentrancy Attack.
