Analise smart-contract
03.04.2024

Contratti intelligenti con funzione di pausa

Continuiamo la serie di articoli dedicati alla descrizione di schemi fraudolenti nei contratti smart. Oggi analizzeremo gli smart contract con funzione Pause.

Gli smart contract con funzione Pause forniscono la possibilità di interrompere temporaneamente o permanentemente alcune operazioni o funzioni all'interno del contratto. Se da un lato le funzioni di pausa possono essere utili per la sicurezza e la manutenzione, dall'altro rappresentano un potenziale rischio se vengono utilizzate dai truffatori. Per proteggersi e identificare le potenziali minacce, è necessario comprendere i rischi, i comuni schemi di frode e come riconoscerli in uno smart contract.

I pericoli degli smart contract con la funzione Pause:

  • Pausa non autorizzata: I truffatori possono ottenere il controllo della funzione Pause e interrompere il contratto senza la dovuta autorizzazione, con conseguenti interruzioni dell'attività o perdite finanziarie.

  • Ritardi ingannevoli: I contratti dannosi possono sospendere transazioni critiche, come prelievi o trasferimenti, con il pretesto di una manutenzione temporanea o di misure di sicurezza, con l'intento di negare agli utenti l'accesso ai propri beni.

  • False dichiarazioni di emergenza: I truffatori possono dichiarare falsamente emergenze o vulnerabilità per giustificare la sospensione del contratto e poi utilizzare i fondi degli utenti durante la pausa.

  • Pretesto di sicurezza: I contratti dannosi possono affermare che è stata scoperta una vulnerabilità di sicurezza, con conseguente attivazione della funzione di sospensione. In realtà, i truffatori potrebbero voler approfittare della situazione.

  • Schemi di emergenza: I truffatori possono utilizzare un linguaggio o scenari che inducono alla paura, ad esempio dichiarando un "tentativo di furto con scasso" o una "situazione di emergenza" per giustificare una pausa durante la quale possono commettere atti illegali.

Come si può determinare in modo indipendente se tali minacce sono presenti negli smart contract?

Se volete determinare da soli la presenza di funzioni di pausa nei contratti smart, i seguenti suggerimenti vi saranno utili.

  1. Esaminate il codice sorgente del contratto per vedere se esiste una funzione di pausa. Assicuratevi che il meccanismo di pausa sia ben documentato e abbia controlli di accesso appropriati.

  2. Scoprire chi controlla la funzione di pausa. Il possesso non autorizzato o non controllato della funzione di pausa è un problema potenziale.

  3. Leggete la documentazione e le specifiche del progetto per assicurarvi che forniscano informazioni chiare e accurate sulla funzione di pausa, sul suo scopo e sulle circostanze in cui può essere utilizzata.

  4. Verificate la trasparenza dell'uso della funzione di pausa. Assicurarsi che esistano procedure chiare per gestire e decidere se attivare o disattivare la funzione Pause.

  5. Prestare attenzione agli audit esterni della sicurezza degli smart contract, in particolare del meccanismo Pause. I revisori dovrebbero valutare la sicurezza e la trasparenza della funzione Pause.

  6. Osservare il comportamento del contratto e garantire che la funzione Pause sia attivata solo in circostanze legittime, come ad esempio per motivi di manutenzione o di sicurezza.

  7. Interagire con la comunità del progetto e con gli altri utenti per comprendere le loro esperienze e le loro preoccupazioni sull'uso della funzione Pause.

  8. Aggiornarsi con gli ultimi sviluppi della nostra comunità (canale Telegram) e con le migliori pratiche per il rilevamento delle frodi (il nostro blog e il nostro canale YouTube).

Per rilevare funzionalità potenzialmente dannose in uno smart contract Pause, è necessario eseguire la due diligence, esaminando il codice e la documentazione del progetto. Evitate i contratti con comportamenti sospetti o mancanza di trasparenza riguardo all'uso della funzionalità Pause.

Lo scanner di sicurezza di Lotus Market trova tutte le funzionalità Pause comuni (comprese quelle nascoste) nel 99,9% dei casi. Utilizzate il nostro abbonamento premium e proteggete i vostri fondi dalle minacce.

Proseguiamo con alcuni degli esempi più comuni della funzione Pausa che la piattaforma Lotus Market individua con successo.

independently determine

Esempio 1: funzione di base della Pausa


  contract BasicPauseToken {
    address public owner;
    bool public paused;

    constructor() {
        owner = msg.sender;
        paused = false;
    }

    modifier whenNotPaused() {
        require(!paused, "Contract is paused");
        _;
    }

    function pause() public {
        require(msg.sender == owner, "Only the owner can pause");
        paused = true;
    }

    function unpause() public {
        require(msg.sender == owner, "Only the owner can unpause");
        paused = false;
    }

    function transfer(address to, uint256 amount) public whenNotPaused {
        // Transfer logic when the contract is not paused
    }
}

Consigli per l'identificazione: Cercare un contratto con funzioni come pause e unpause o funzioni simili che possano alternare lo stato di pausa.

Controllare la presenza di un modificatore di tipo whenNotPaused applicato a certe funzioni per assicurarsi che possano essere eseguite solo quando il contratto non è sospeso.

Verificare il meccanismo di controllo degli accessi, che dovrebbe consentire solo al proprietario o alle persone autorizzate di sospendere e revocare la sospensione di un contratto.

Esempio 2: Pausa attivata a tempo


  contract TimeActivatedPauseToken {
    address public owner;
    bool public paused;
    uint256 public pauseStartTime;
    uint256 public pauseDuration;

    constructor(uint256 _duration) {
        owner = msg.sender;
        paused = false;
        pauseStartTime = 0;
        pauseDuration = _duration;
    }

    modifier whenNotPaused() {
        require(!paused, "Contract is paused");
        _;
    }

    function pause() public {
        require(msg.sender == owner, "Only the owner can pause");
        paused = true;
        pauseStartTime = block.timestamp;
    }

    function unpause() public {
        require(msg.sender == owner, "Only the owner can unpause");
        require(block.timestamp >= pauseStartTime + pauseDuration, "Pause duration not over");
        paused = false;
    }

    function transfer(address to, uint256 amount) public whenNotPaused {
        // Transfer logic when the contract is not paused
    }
}

Consigli per l'identificazione: Cercare un contratto con un meccanismo di pausa attivato dal tempo in cui la pausa e l'annullamento della pausa hanno una durata specifica.

Verificare se esiste un modificatore di tipo whenNotPaused applicato a determinate funzioni. Assicuratevi che il contratto imponga la durata della pausa e ne consenta l'annullamento solo dopo che è trascorso il periodo di tempo specificato.

Quando si identificano le funzioni di pausa in uno smart contract, è fondamentale esaminare il codice, i controlli di accesso e lo scopo del meccanismo di pausa. Esaminate attentamente la documentazione e il modello di gestione del contratto e confrontatevi con la comunità del progetto per valutare la legittimità del contratto e se è adatto allo scopo. Esercitate sempre cautela e conducete una due diligence prima di impegnarvi in qualsiasi transazione o investimento che coinvolga contratti sospendibili.

time-activated pause

Esempio 3: Funzione di pausa condizionale


  
  contract ConditionalPauseToken {
    address public owner;
    bool public paused;

    constructor() {
        owner = msg.sender;
        paused = false;
    }

    modifier whenNotPaused() {
        require(!paused || msg.sender == owner, "Contract is paused");
        _;
    }

    function pause() public {
        require(msg.sender == owner, "Only the owner can pause");
        paused = true;
    }

    function unpause() public {
        require(msg.sender == owner, "Only the owner can unpause");
        paused = false;
    }

    function transfer(address to, uint256 amount) public whenNotPaused {
        // Transfer logic when the contract is not paused, except for the owner
    }
}

Consigli per l'identificazione: Cercate un contratto con un meccanismo di pausa condizionale che permetta al proprietario di eseguire determinate transazioni anche se il contratto è sospeso.

Verificate se il modificatore di tipo whenNotPaused si applica alle funzioni che richiedono che il contratto sia in uno stato non in pausa.

Esempio 4: Funzione di pausa di emergenza


  contract EmergencyPauseToken {
    address public owner;
    bool public paused;

    constructor() {
        owner = msg.sender;
        paused = false;
    }

    modifier whenNotPaused() {
        require(!paused || msg.sender == owner, "Contract is paused");
        _;
    }

    function pause() public {
        require(msg.sender == owner, "Only the owner can pause");
        paused = true;
    }

    function emergencyPause() public {
        require(msg.sender == owner, "Only the owner can initiate emergency pause");
        paused = true;
    }

    function unpause() public {
        require(msg.sender == owner, "Only the owner can unpause");
        paused = false;
    }

    function transfer(address to, uint256 amount) public whenNotPaused {
        // Transfer logic when the contract is not paused, except for the owner
    }
}

Consigli per l'identificazione: Cercate un contratto con una funzione di pausa di emergenza che permetta al proprietario di sospendere immediatamente il contratto anche senza le procedure di sospensione standard.

Verificate la presenza di un modificatore di tipo whenNotPaused per determinare quali operazioni sono limitate quando il contratto è sospeso.

Prestare attenzione alle funzioni di pausa di emergenza del contratto e assicurarsi che il loro uso sia strettamente controllato e ben documentato.

Abbinare le funzioni di sospensione del contratto al suo modello di governance e ai processi decisionali per l'attivazione e la disattivazione della funzione di sospensione.

Esempio 5: Pausa controllata dal proprietario con limite di tempo


  contract TimedPauseToken {
    address public owner;
    bool public paused;
    uint256 public pauseStartTime;
    uint256 public pauseDuration;

    constructor(uint256 _duration) {
        owner = msg.sender;
        paused = false;
        pauseStartTime = 0;
        pauseDuration = _duration;
    }

    modifier whenNotPaused() {
        require(!paused, "Contract is paused");
        _;
    }

    function pause() public {
        require(msg.sender == owner, "Only the owner can pause");
        paused = true;
        pauseStartTime = block.timestamp;
    }

    function unpause() public {
        require(msg.sender == owner, "Only the owner can unpause");
        require(block.timestamp >= pauseStartTime + pauseDuration, "Pause duration not over");
        paused = false;
    }

    function transfer(address to, uint256 amount) public whenNotPaused {
        // Transfer logic when the contract is not paused
    }
}

Consigli per l'identificazione: Cercare un contratto con una pausa controllata dal proprietario che includa una durata specifica della pausa e l'annullamento della pausa.

Verificate la presenza di un modificatore di tipo whenNotPaused applicato alle funzioni appropriate per limitare le operazioni quando il contratto è sospeso.

owner-controlled pause with time limit

Esempio 6: pausa di terzi con limite di tempo


  contract ThirdPartyTimedPauseToken {
    address public owner;
    address public thirdParty;
    bool public paused;
    uint256 public pauseStartTime;
    uint256 public pauseDuration;

    constructor(address _thirdParty, uint256 _duration) {
        owner = msg.sender;
        thirdParty = _thirdParty;
        paused = false;
        pauseStartTime = 0;
        pauseDuration = _duration;
    }

    modifier whenNotPaused() {
        require(!paused || msg.sender == owner || msg.sender == thirdParty, "Contract is paused");
        _;
    }

    function pause() public {
        require(msg.sender == thirdParty, "Only the third party can pause");
        paused = true;
        pauseStartTime = block.timestamp;
    }

    function unpause() public {
        require(msg.sender == thirdParty, "Only the third party can unpause");
        require(block.timestamp >= pauseStartTime + pauseDuration, "Pause duration not over");
        paused = false;
    }

    function transfer(address to, uint256 amount) public whenNotPaused {
        // Transfer logic when the contract is not paused, except for the owner and the third party
    }
}

Consigli per l'identificazione: Cercare un contratto con un meccanismo di sospensione gestito da terzi, in cui la terza parte può sospendere e disconnettere il contratto con una durata stabilita.

Verificare la presenza di un modificatore di tipo whenNotPaused per determinare quali operazioni sono limitate quando un contratto è sospeso.

Assicurarsi che i meccanismi di controllo dell'accesso alle funzioni di pausa nel contratto, siano essi di proprietà, gestiti dalla comunità o da terzi, siano trasparenti e ben progettati.

Quando si identifica una funzione di pausa in uno smart contract, è necessario eseguire un'analisi approfondita del codice, testare i controlli di accesso e comprendere lo scopo e il modello di controllo del meccanismo di pausa. È fondamentale condurre una due diligence e confrontarsi con la comunità del progetto per valutare la legittimità del contratto e se è adatto allo scopo. Esercitate sempre cautela e conducete una ricerca adeguata prima di stipulare contratti che offrono un'opzione di pausa per mitigare i potenziali rischi.

 

Speriamo che questi esempi vi abbiano aiutato a comprendere meglio gli schemi della funzione di pausa negli smart contract.

 

 

Dal momento che tutte le informazioni della blockchain sono aperte (a condizione, ovviamente, che il codice sorgente del contratto sia verificato), armati di queste conoscenze potrete studiare in modo indipendente i contratti smart e identificare i vari schemi di truffa.

 

Tuttavia, abbiamo già fatto tutto questo per voi! Sottoscrivete un abbonamento premium e avrete accesso a filtri esclusivi sulle caratteristiche dei contratti intelligenti e a nuove analisi. Aumenta le tue possibilità di investire con successo in token redditizi.

Ciao, team Lotus Market.

All posts

Connect to a wallet

Metamask