Analise smart-contract
03.04.2024

Contrats intelligents avec fonction Pause

Nous poursuivons la série d'articles consacrés à la description de stratagèmes frauduleux dans les contrats intelligents. Aujourd'hui, nous allons analyser les smart contracts dotés de la fonction Pause.

Les smart contracts dotés de la fonction Pause offrent la possibilité d'arrêter temporairement ou définitivement certaines opérations ou fonctions au sein du contrat. Si les fonctions Pause peuvent être utiles pour la sécurité et la maintenance, elles représentent également un risque potentiel si elles sont utilisées par des fraudeurs. Pour vous protéger et identifier les menaces potentielles, vous devez comprendre les risques, les schémas de fraude courants et la manière de les reconnaître dans un contrat intelligent.

Les dangers des contrats intelligents avec la fonctionnalité Pause :

  • Pause non autorisée : Les fraudeurs peuvent prendre le contrôle de la fonction Pause et arrêter le contrat sans autorisation appropriée, ce qui peut entraîner une interruption de l'activité ou une perte financière.

  • Délais trompeurs : Les contrats malveillants peuvent suspendre des transactions critiques, telles que les retraits ou les transferts, sous prétexte de maintenance temporaire ou de mesures de sécurité, dans le but de priver les utilisateurs de l'accès à leurs actifs.

  • Fausses allégations d'urgence : Les fraudeurs peuvent prétendre à tort qu'il y a des urgences ou des vulnérabilités pour justifier la suspension d'un contrat, puis utiliser les fonds des utilisateurs pendant la pause.

  • Prétexte de sécurité : Les contrats malveillants peuvent prétendre qu'une faille de sécurité a été découverte, ce qui entraîne l'activation de la fonction de suspension. En réalité, les fraudeurs peuvent avoir l'intention de profiter de la situation.

  • Schémas d'urgence : Les fraudeurs peuvent utiliser un langage ou des scénarios induisant la peur, en invoquant par exemple une "tentative de cambriolage" ou une "situation d'urgence" pour justifier une pause pendant laquelle ils peuvent commettre des actes illégaux.

Comment pouvez-vous déterminer de manière indépendante si de telles menaces sont présentes dans les contrats intelligents ?

Si vous souhaitez déterminer par vous-même la présence de fonctions de pause dans les smart contracts, les conseils suivants vous seront utiles.

  1. Examinez le code source du contrat pour voir s'il existe une fonction de pause. Assurez-vous que le mécanisme de pause est bien documenté et qu'il dispose de contrôles d'accès appropriés.

  2. Découvrez qui contrôle la fonction Pause. La possession non autorisée ou non contrôlée de la fonction Pause constitue un problème potentiel.
  3. Lisez la documentation et les spécifications du projet pour vous assurer qu'elles fournissent des informations claires et précises sur la fonction Pause, son objectif et les circonstances dans lesquelles elle peut être utilisée.
  4. Vérifiez la transparence de l'utilisation de la fonction Pause. Assurez-vous qu'il existe des procédures claires pour gérer et décider d'activer ou de désactiver la fonction Pause.

  5. Prêtez attention aux audits externes de la sécurité des contrats intelligents, en particulier du mécanisme Pause. Les auditeurs devraient évaluer la sécurité et la transparence de la fonction Pause.

  6. Observer le comportement du contrat et s'assurer que la fonction Pause n'est activée que dans des circonstances légitimes, telles que des raisons de maintenance ou de sécurité.

  7. Engager avec la communauté du projet et d'autres utilisateurs pour comprendre leurs expériences et leurs préoccupations concernant l'utilisation de la fonction Pause.

  8. Se tenir au courant des dernières évolutions de notre communauté (chaîne Telegram) et des meilleures pratiques en matière de détection des fraudes (notre blog et notre chaîne YouTube).

Pour détecter une fonctionnalité potentiellement malveillante dans un contrat intelligent Pause, vous devez faire preuve de diligence raisonnable, en examinant minutieusement le code et la documentation du projet. Évitez les contrats présentant un comportement suspect ou un manque de transparence concernant l'utilisation de la fonctionnalité Pause.

Le scanner de sécurité de Lotus Market trouve toutes les fonctionnalités Pause courantes (y compris cachées) dans 99,9 % des cas. Utilisez notre abonnement premium et protégez vos fonds des menaces.

Par la suite, nous allons examiner quelques-uns des exemples les plus courants de la fonction Pause que la plateforme Lotus Market trouve avec succès.

independently determine

Exemple 1 : Fonction Pause de base


  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
    }
}

Conseils pour l'identification: Recherchez un contrat avec des fonctions comme pause et unpause ou des fonctions similaires qui peuvent basculer l'état de pause.

Vérifiez la présence d'un modificateur de type whenNotPaused appliqué à certaines fonctions pour garantir qu'elles ne peuvent être exécutées que lorsque le contrat n'est pas suspendu.

Vérifiez le mécanisme de contrôle d'accès, qui doit permettre uniquement au propriétaire ou aux personnes autorisées de suspendre et de révoquer la suspension d'un contrat.

Exemple 2 : Pause activée par le temps


  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
    }
}

Conseils pour l'identification: Recherchez un contrat avec un mécanisme de pause activé par le temps dans lequel la pause et l'annulation de la pause ont une durée spécifique.

Vérifiez s'il existe un modificateur de type whenNotPaused appliqué à certaines fonctions. Assurez-vous que le contrat applique la durée de la pause et ne permet de l'annuler qu'après l'écoulement de la période spécifiée.

Lors de l'identification des fonctions de pause dans un contrat intelligent, il est essentiel d'examiner le code, les contrôles d'accès et l'objectif du mécanisme de pause. Examinez soigneusement la documentation et le modèle de gestion des contrats, et engagez-vous avec la communauté du projet pour évaluer la légitimité du contrat et savoir s'il est adapté à l'objectif visé. Faites toujours preuve de prudence et de diligence raisonnable avant de vous engager dans une transaction ou un investissement impliquant des contrats suspensifs.

time-activated pause

Exemple 3 : Fonction de pause conditionnelle


  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
    }
}

Conseils pour l'identification: Recherchez un contrat avec un mécanisme de pause conditionnelle qui permet au propriétaire d'effectuer certaines transactions même si le contrat est suspendu.

Vérifiez si le modificateur de type whenNotPaused s'applique aux fonctions qui requièrent que le contrat soit dans un état non suspendu.

Exemple 4 : Fonction de pause d'urgence


  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
    }
}

Conseils pour l'identification: Recherchez un contrat avec une fonction de pause d'urgence qui permet au propriétaire de suspendre immédiatement le contrat même sans les procédures de suspension standard.

Vérifiez la présence d'un modificateur de type whenNotPaused pour déterminer quelles opérations sont restreintes lorsque le contrat est suspendu.

Portez attention aux fonctions de pause d'urgence du contrat et assurez-vous que leur utilisation est étroitement contrôlée et bien documentée.

Faites correspondre les fonctions de suspension du contrat à son modèle de gouvernance et à ses processus de prise de décision pour activer et désactiver la fonction de suspension.

Exemple 5 : Pause contrôlée par le propriétaire avec limite de temps


  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
    }
}

Conseils pour l'identification: Recherchez un contrat avec une pause contrôlée par le propriétaire qui inclut une durée spécifique de la pause et de l'annulation de la pause.

Vérifiez la présence d'un modificateur de type whenNotPaused appliqué aux fonctions appropriées pour restreindre les opérations lorsque le contrat est suspendu.

owner-controlled pause with time limit

Exemple 6 : Pause tierce avec limite de temps


  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
    }
}

Conseils pour l'identification: Recherchez un contrat avec un mécanisme de suspension géré par un tiers, dans lequel ce dernier peut suspendre et déconnecter le contrat avec une durée déterminée.

Vérifiez la présence d'un modificateur de type whenNotPaused pour déterminer quelles opérations sont restreintes lorsqu'un contrat est suspendu.

S'assurer que les mécanismes de contrôle d'accès aux fonctions de pause dans le contrat, qu'elles soient détenues par le propriétaire, gérées par la communauté ou par un tiers, sont transparents et bien conçus.

Lorsqu'une fonction de pause est identifiée dans un contrat intelligent, une analyse approfondie du code doit être effectuée, les contrôles d'accès doivent être testés, et l'objectif et le modèle de contrôle du mécanisme de pause doivent être compris. Il est essentiel de faire preuve de diligence raisonnable et de s'engager auprès de la communauté du projet pour évaluer la légitimité du contrat et déterminer s'il est adapté à l'objectif visé. Faites toujours preuve de prudence et effectuez des recherches appropriées avant de conclure des contrats qui offrent une option de pause afin d'atténuer les risques potentiels.

 

Nous espérons que ces exemples vous ont aidé à mieux comprendre les schémas de la fonction Pause dans les contrats intelligents.

 

 

Dans la mesure où toutes les informations de la blockchain sont ouvertes (à condition, bien sûr, que le code source du contrat soit vérifié), armé de ces connaissances, vous pouvez étudier les smart contracts de manière indépendante et identifier les différentes arnaques.

 

Toutefois, nous avons déjà fait tout cela pour vous ! Souscrivez à un abonnement premium et accédez à des filtres exclusifs sur les caractéristiques des smart contracts et à des analyses fraîches. Augmentez vos chances d'investir avec succès dans des jetons rentables.

Regards, Lotus Market team.

All posts

Connect to a wallet

Metamask