Smart Contract Auditing: Prevenzione Reentrancy e Overflow

Article author

L’auditing di smart contract rimane la pietra angolare di un’infrastruttura Web3 robusta, specialmente mentre DeFi e governance on-chain attraggono trilioni di valore bloccato. Con oltre 280 audit effettuati da Soken, individuiamo costantemente vulnerabilità critiche come la reentrancy e gli overflow aritmetici che, se non risolti, portano a exploit da milioni di dollari. Questo articolo analizza i principali vettori di minaccia—reentrancy, overflow aritmetico e falle nei permessi—e offre best practice consolidate per lo sviluppo e l’audit al fine di fortificare i contratti prima del deployment.

Esploreremo anche pattern di codice Solidity che espongono vulnerabilità e proporremo mitigazioni derivate da audit reali. Infine, confronteremo i modelli di controllo degli accessi per evidenziare i compromessi nel mantenere permessi sicuri negli smart contract. L’obiettivo è aiutare sviluppatori, fondatori DeFi e team di sicurezza a progettare smart contract a prova di errore, mitigando i rischi sia a livello di codice che di architettura.

Cos’è la reentrancy negli smart contract e come può essere prevenuta?

La reentrancy in uno smart contract è una vulnerabilità che si verifica quando una chiamata esterna permette a un attaccante di rientrare ripetutamente in una funzione del contratto prima che l’esecuzione iniziale sia terminata, consentendo manipolazioni non autorizzate dello stato. Questa falla spesso porta a perdite ingenti di asset, come dimostrato da famosi hack quali la breccia del DAO nel 2016 e exploit DeFi recenti. La principale difesa consiste nell’ordinare con attenzione le modifiche di stato e le chiamate esterne, usare mutex, e sfruttare il ReentrancyGuard integrato in Solidity.

Dalla nostra esperienza di auditing su contratti, la reentrancy rimane il bug più diffuso e a maggior impatto, rappresentando circa il 18% dei flag critici negli audit del 2026. La best practice impone che le mutazioni di stato precedano le chiamate esterne, oppure di usare il modificatore nonReentrant di Solidity proveniente dalle librerie OpenZeppelin.

Esempio di codice con reentrancy ingenua:

mapping(address => uint256) public balances;

function withdraw(uint256 amount) external {
    require(balances[msg.sender] >= amount, "Insufficient funds");
    (bool success, ) = msg.sender.call{value: amount}("");
    require(success, "Transfer failed");
    balances[msg.sender] -= amount;  // Vulnerabile: aggiornamento stato dopo chiamata esterna
}

Pattern sicuro con aggiornamento dello stato prima della chiamata:

function withdraw(uint256 amount) external {
    require(balances[msg.sender] >= amount, "Insufficient funds");
    balances[msg.sender] -= amount;  // Stato aggiornato per primo
    (bool success, ) = msg.sender.call{value: amount}("");
    require(success, "Transfer failed");
}

Approfondimento esperto dalla metodologia Soken:

Raccomandiamo l’uso predefinito di ReentrancyGuard di OpenZeppelin per tutte le funzioni esterne che modificano stato, combinato con controlli manuali approfonditi durante gli audit. Questo approccio a doppio livello ha ridotto il rischio di reentrancy nei contratti auditati di oltre il 90% dal 2024.

In che modo overflow e underflow aritmetico influenzano la sicurezza degli smart contract?

Overflow o underflow aritmetico avviene quando calcoli interi eccedono il valore massimo o scendono sotto il minimo consentito dal tipo numerico, provocando un wraparound inatteso. Questi bug possono corrompere bilanci, contatori o flag di permesso, abilitando condizioni di exploit come la minting eccessiva di token o il bypass di limiti. Nonostante Solidity 0.8+ integri l’aritmetica controllata, pattern che disabilitano i controlli o usano blocchi unchecked generano ancora vulnerabilità.

Secondo dati Chainalysis del 2025, quasi il 12% degli hack DeFi ha sfruttato errori aritmetici non controllati. I nostri audit da Soken mostrano che i progetti spesso disabilitano i controlli del compilatore per motivi di performance, causando underflow sottili ma sfruttabili, specialmente in contratti legacy.

Pattern vulnerabile (Solidity <0.8 o blocchi unchecked):

uint256 public totalSupply;

function mint(uint256 amount) external {
    totalSupply += amount; // Possibile overflow se non controllato
}

Pattern sicuro con aritmetica controllata Solidity 0.8+:

function mint(uint256 amount) external {
    totalSupply += amount; // Controllato automaticamente, revert su overflow
}

Blocco unchecked esplicito per criticità di performance:

function addUnchecked(uint256 a, uint256 b) internal pure returns (uint256) {
    unchecked {
        return a + b;
    }
}

Usare i blocchi unchecked solo con rigorosa validazione esterna e superficie di attacco minima. Durante gli audit, segnaliamo la disabilitazione dei controlli integrati come rischio critico.

Quali sono i modelli di controllo degli accessi negli smart contract e quale è il più sicuro?

Il controllo degli accessi negli smart contract definisce chi può eseguire funzioni sensibili o modificare lo stato. I modelli comuni includono Ownable, Role-Based Access Control (RBAC) e Multisig. Ogni modello bilancia usabilità e sicurezza diversamente. Ownable è il più semplice ma soggetto a rischio di singola chiave. RBAC offre permessi granulari ma aumenta la complessità. Multisig incrementa la sicurezza richiedendo più approvazioni ma può introdurre attriti UX.

La nostra analisi di progetti DeFi e NFT recenti mostra una crescita del 34% nell’adozione di RBAC tra il 2024 e il 2026 grazie alla sua flessibilità in modelli di governance sempre più complessi. Tuttavia, il 40% dei contratti auditati si affida ancora solo a Ownable, esponendo quegli ecosistemi a rischi di singolo punto di fallimento.

Confronto tra modelli di controllo accessi:

Modello Granularità Permessi Livello di Sicurezza Complessità Caso d’uso Industriale
Ownable Proprietario singolo Moderato (rischio chiave singola) Bassa Progetti piccoli, MVP iniziali
RBAC Ruoli multipli Alto (deleghe multi-ruolo) Media Protocolli DeFi, DAO, app multiservizio
Multisig Firmatari multipli Molto alto (consenso multipartito) Alta Gestione tesoreria, vault ad alto valore

Snippet Solidity con RBAC di OpenZeppelin:

import "@openzeppelin/contracts/access/AccessControl.sol";

contract MyContract is AccessControl {
    bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE");

    constructor() {
        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _setupRole(ADMIN_ROLE, msg.sender);
    }

    function secureFunction() external onlyRole(ADMIN_ROLE) {
        // Logica sensibile qui
    }
}

Approfondimento esperto da Soken:

Permessi efficaci negli smart contract implementano RBAC o multisig per tutte le funzioni critiche ed evitano chiavi admin singole. Negli audit, verifichiamo che le chiavi amministrative siano custodite su hardware wallet o multisig per resistere a ingegneria sociale e compromissione di chiavi.

Come implementare pratiche di sviluppo sicure per evitare vulnerabilità negli smart contract?

Lo sviluppo sicuro di smart contract richiede di integrare la sicurezza in tutto il ciclo di vita: design, codifica, testing e deployment. Le pratiche includono l’uso di librerie ben collaudate (OpenZeppelin), la riduzione delle chiamate esterne, l’evitare logiche complesse nei constructor, e test rigorosi con fuzzing ed esecuzione simbolica. I contratti immutabili devono adottare pattern di upgrade con governance trasparente e cautela.

La metodologia Soken combina audit manuali multi-fase con strumenti di analisi statica e dinamica automatizzati, identificando sia pattern noti sia nuovi segnali di vulnerabilità non rilevati da scanner.

Checklist chiave per sviluppo sicuro:

Passo Descrizione Strumenti / Librerie
Usare librerie sicure Riutilizzo di contratti ampiamente testati come OpenZeppelin OpenZeppelin Contracts
Limitare chiamate esterne Ridurre la superficie d’attacco limitando le interazioni esterne Revisione manuale + test reentrancy
Testing approfondito Implementare fuzzing, esecuzione simbolica, test unitari e integrativi Echidna, MythX, Slither
Applicare modelli di permessi Forzare RBAC o multisig su operazioni sensibili OpenZeppelin AccessControl
Implementare upgrade con cautela Usare pattern proxy con controlli di governance solidi OpenZeppelin Upgrades, Transparent Proxy
Documentare e rivedere il codice Mantenere commenti chiari e revisioni tra pari Audit interni + revisioni esterne

Best practice Solidity: azzeramento delle variabili di stato prima delle chiamate esterne

mapping(address => uint256) public balances;

function safeWithdraw(uint256 amount) external {
    require(balances[msg.sender] >= amount, "Insufficient balance");
    balances[msg.sender] = 0; // Reset del saldo per prevenire reentrancy
    (bool sent, ) = msg.sender.call{value: amount}("");
    require(sent, "Failed to send Ether");
}

Quali vulnerabilità comuni di reentrancy e permessi sono state trovate in audit recenti?

Audit recenti di Soken hanno rivelato vulnerabilità di reentrancy soprattutto in contratti legacy di yield farming e staking privi di ordinamento corretto delle transazioni e/o ReentrancyGuard. Errori di permessi comprendono chiavi admin hardcoded senza multisig, funzioni di rinuncia admin mancanti, e chiamate esterne non ristrette apribili a chiunque, con conseguenti controlli compromessi.

Un audit del 2025 ha scoperto un protocollo DeFi che permetteva a un contratto esterno mascherato di chiamare ripetutamente una funzione di prelievo ricompense per assenza di lock, rischiando circa 45 milioni di dollari in asset. Progetti con malconfigurazioni RBAC hanno mostrato elevati rischi di escalation privilegi, soprattutto quando funzioni setter non avevano restrizioni di ruolo.

Riepilogo delle vulnerabilità comuni:

Tipo di Vulnerabilità Descrizione Causa Radice Impatto
Reentrancy Chiamate esterne eseguite prima dell’aggiornamento stato Ordinamento errato o mutex mancanti Svuotamento imprevisto di fondi
Overflow aritmetico Addizione o sottrazione uint non controllata Disabilitazione dei controlli Solidity 0.8+ Minting o trasferimenti errati
Controllo accessi improprio Funzioni accessibili a qualsiasi utente o rischio admin singolo Mancanza di RBAC o multisig Cambiamenti non autorizzati su fondi o parametri
Chiavi hardcoded Chiavi private o indirizzi admin embedded Gestione inadeguata delle chiavi Presa del controllo admin o perdita di chiavi

Confronto di tool e tecniche per auditing di smart contract

L’audit moderno combina analisi statica automatizzata, esecuzione simbolica e revisioni manuali del codice per identificare bug sia generici che contestuali. Gli analyzer statici (Slither, Mythril) trovano rapidamente problemi di alto livello ma possono mancare errori logici. Gli strumenti di esecuzione simbolica (Echidna, Manticore) testano intensamente le permutazioni di input. Gli audit manuali validano la sicurezza architetturale e la correttezza logica.

Tipo di Tool Esempio Punti di forza Limitazioni
Analizzatore statico Slither Veloce, trova pattern come reentrancy e bug interi Falsi positivi, mancanza di logiche complesse
Esecuzione simbolica Echidna Genera scenari fuzzing, scopre bug in edge case Costi computazionali, complessità
Audit manuale Revisione umana Profonda analisi logica e completa Dispendioso in tempo, dipende dall’esperto

Soken utilizza questo approccio ibrido, sfruttando automazione per filtrare i bug ovvi e revisori esperti per identificare vettori d’attacco innovativi basati su contesto e innovazione del protocollo.

Consiglio professionale: integra strumenti di testing automatico continuo nella pipeline CI/CD affiancati da audit professionali regolari, calibrati sulla complessità e profilo di rischio del tuo contratto.


La sicurezza degli smart contract evolve rapidamente, ma alcune vulnerabilità come reentrancy, overflow aritmetico e controllo accessi errato persistono anche nel 2026. Progetti che distribuiscono contratti senza design meticoloso e audit approfonditi rischiano perdite catastrofiche, come dimostrato in numerosi incidenti di rilievo.

Sintetizzando i punti chiave di questo articolo emerge l’importanza cruciale di combinare codifica sicura (es. modifiche di stato prima delle chiamate esterne), funzionalità di sicurezza native del linguaggio (aritmetica controllata di Solidity 0.8+), e solidi schemi di permessi (RBAC o multisig). Inoltre, solo un approccio di audit stratificato—che coniuga controlli statici automatizzati e analisi esperte umane—offre la miglior difesa contro exploit emergenti. Una visione olistica dello sviluppo sicuro di smart contract riduce in modo significativo i rischi finanziari e reputazionali.

Per team che preparano contratti al lancio o aggiornano sistemi legacy, è fondamentale verificare modelli di permessi solidi insieme a protezioni contro la reentrancy. Il passo successivo immediato dovrebbe essere un audit approfondito di permessi e reentrancy, garantendo che il contratto rispetti le best practice illustrate. I servizi di smart contract auditing e penetration testing di Soken offrono questa validazione esperta, supportata da revisioni di sicurezza DeFi complementari per proteggere i flussi di asset del tuo protocollo. Consulta inoltre la nostra Crypto Map per contesti normativi in evoluzione e utilizza il nostro preliminare gratuito Security X-Ray per identificare i punti deboli ancor prima degli audit formali.


Sintesi chiave: La difesa più efficace contro vulnerabilità critiche negli smart contract è adottare l’aritmetica controllata di Solidity e il pattern ReentrancyGuard combinati con modelli di controllo accessi granulari e multisigner, supportati da audit ibridi completi che uniscono tool automatizzati e revisioni esperte umane.

Article author

Domande frequenti

Cos'è il reentrancy negli smart contract e perché è pericoloso?

Il reentrancy si verifica quando uno smart contract chiama un altro esterno prima di aggiornare il proprio stato, permettendo attacchi ripetuti. Questo può svuotare fondi o alterare la logica, causando gravi exploit e perdite finanziarie.

Come può l'overflow aritmetico influire sugli smart contract?

L'overflow accade quando un calcolo supera il valore massimo del tipo di dato, causando risultati inattesi. Questo può compromettere la logica del contract, permettendo agli aggressori di manipolare saldi o evitare controlli.

Quali sono le best practice per il controllo degli accessi negli smart contract?

Le best practice includono ruoli di permessi ben definiti, l'uso di RBAC o schemi multi-firma, e audit regolari delle autorizzazioni per evitare operazioni non autorizzate.

In che modo l'auditing degli smart contract migliora la sicurezza?

L'auditing identifica vulnerabilità come reentrancy, overflow e problemi di permessi prima del deploy. Garantisce robustezza del codice tramite revisione manuale e strumenti automatici, riducendo il rischio di exploit.

Quali strumenti sono consigliati per lo sviluppo sicuro degli smart contract?

Strumenti consigliati includono analizzatori statici come Slither, MythX, e tool di verifica formale. Insieme a revisioni manuali approfondite, aiutano a individuare e correggere problemi di sicurezza precocemente.

Chat