Анализ смарт-контрактов
03.04.2024

Смарт-контракты с функцией Pause

Продолжаем серию статей, посвященных описанию мошеннических схем в смарт-контрактах. Сегодня мы разберем смарт-контракты с функцией Pause.

Смарт-контракты с функциями Pause предоставляют возможность временно или постоянно останавливать выполнение определенных операций или функций в рамках контракта. Хотя функции Pause могут быть полезны для обеспечения безопасности и обслуживания, они также представляют потенциальную опасность, если их используют мошенники. Чтобы обезопасить себя и выявить потенциальные угрозы, необходимо понимать риски, распространенные схемы мошенничества и способы их распознавания в смарт-контракте.

Опасности смарт-контрактов с функцией Pause:

  • Несанкционированная пауза: Мошенники могут получить контроль над функцией Pause и остановить работу контракта без соответствующего разрешения, что может привести к сбоям в работе или финансовым потерям.

  • Обманчивые задержки (Deceptive Delays): Вредоносные контракты могут приостанавливать критически важные операции, такие как снятие средств или их перевод, под видом временного обслуживания или мер безопасности, намереваясь при этом лишить пользователей доступа к своим активам.

  • Ложные заявления о чрезвычайных ситуациях: Мошенники могут ложно заявлять о чрезвычайных ситуациях или уязвимостях, чтобы оправдать приостановку действия контракта, а затем использовать средства пользователей во время паузы.

  • Предлог безопасности (Security Pretext): Вредоносные контракты могут утверждать, что обнаружена уязвимость в системе безопасности, в результате чего активируется функция приостановки. В действительности мошенники могут намереваться воспользоваться ситуацией.

  • Форс-мажорные схемы (Emergency Schemes): Мошенники могут использовать вызывающие страх формулировки или сценарии, например, заявлять о "попытке взлома" или "чрезвычайной ситуации", чтобы оправдать паузу, во время которой они могут совершить противоправные действия.

Как самостоятельно определить наличие подобных угроз в смарт-контрактах?

Если Вы хотите самостоятельно определять наличие функций Pause в смарт-контрактах, то следующие советы будут в этом полезны.

  1. Изучите исходный код контракта на предмет наличия функции Pause. Убедитесь, что механизм паузы хорошо документирован и имеет надлежащие средства контроля доступа.

  2. Выясните, кто контролирует функцию Pause. Несанкционированное или непроверенное владение функцией Pause является потенциальной проблемой.

  3. Ознакомьтесь с документацией и техническим описанием проекта, чтобы убедиться, что в них содержится четкая и точная информация о функции Pause, ее назначении и обстоятельствах, при которых она может быть использована.

  4. Проверьте прозрачность (Transparency) использования функции Pause. Обратите внимание на наличие четких процедур управления и принятия решений по активации или деактивации паузы.

  5. Обратите внимание на внешние аудиты безопасности смарт-контракта, в особенности на механизм паузы. Аудиторы должны оценить безопасность и прозрачность функции Pause.

  6. Следите за поведением контракта и убедитесь, что функция Pause активируется только в законных обстоятельствах, например, при проведении технического обслуживания или по соображениям безопасности.

  7. Взаимодействуйте с сообществом проекта и другими пользователями, чтобы понять их опыт и проблемы, связанные с использованием функции Pause.

  8. Будьте в курсе последних событий в нашем сообществе (Телеграм-канал) и лучших практик по выявлению мошенничества (наш Блог и YouTube-канал).

Чтобы обнаружить потенциально вредоносный функционал в смарт-контракте с функцией паузы, необходимо провести комплексную проверку, тщательно изучить код и документацию проекта. Избегайте контрактов с подозрительным поведением или отсутствием прозрачности в отношении использования функции Pause.

Сканер безопасности Lotus Market находит все распространенные (в том числе скрытые) функции Pause в 99,9% случаев. Используйте нашу премиум подписку и защитите свои средства от угроз.

Далее мы рассмотрим несколько наиболее распространенных примеров функции Pause, которые успешно находит Платформа Lotus Market.

independently determine

Пример 1: Базовая функция Pause


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

Советы по выявлению: Ищите контракт с функциями типа pause и unpause или аналогичными функциями, которые могут переключать состояние паузы.

Проверьте наличие модификатора типа whenNotPaused, применяемого к определенным функциям, чтобы гарантировать, что они могут быть выполнены только тогда, когда контракт не приостановлен.

Проверьте механизм контроля доступа, который должен позволять только владельцу или уполномоченным лицам приостанавливать и отменять приостановку контракта.

Пример 2: Пауза, активируемая по времени


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

Советы по выявлению: Ищите контракт с механизмом паузы, активизируемым временем, в котором пауза и отмена паузы имеют определенную продолжительность.

Проверьте наличие модификатора типа whenNotPaused, применяемого к определенным функциям. Убедитесь в том, что контракт обеспечивает соблюдение длительности паузы и позволяет отменить ее только по истечении указанного срока.

При выявлении функций Pause в смарт-контракте крайне важно изучить код, средства контроля доступа и назначение механизма паузы. Тщательно изучите документацию и модель управления контрактом, а также взаимодействуйте с сообществом проекта, чтобы оценить легитимность контракта и соответствие его целям. Всегда проявляйте осторожность и проводите due diligence перед участием в любых сделках или инвестициях, связанных с контрактами с возможностью приостановки.

time-activated pause

Пример 3: Функция условной паузы


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

Советы по выявлению: Ищите контракт с механизмом условной паузы, который позволяет владельцу выполнять определенные операции, даже если контракт приостановлен.

Проверьте, не применяется ли модификатор типа whenNotPaused к функциям, которые требуют, чтобы контракт находился в состоянии без паузы.

Пример 4: Функция экстренной паузы


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

Советы по выявлению: Ищите контракт с функцией экстренной паузы, которая позволяет владельцу немедленно приостановить выполнение контракта даже без стандартных процедур приостановки.

Проверьте наличие модификатора типа whenNotPaused, чтобы определить, какие операции ограничиваются при приостановке контракта.

Обратите внимание на функции аварийной паузы контракта и убедитесь, что их использование строго контролируется и хорошо документируется.

Сопоставьте функции приостановки контракта с его моделью управления и процессами принятия решений по активации и деактивации функции приостановки.

Пример 5: Управляемая владельцем пауза с ограничением по времени


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

Советы по выявлению: Ищите контракт с управляемой владельцем паузой, которая включает в себя определенную продолжительность приостановки и отмены паузы.

Проверьте наличие модификатора типа whenNotPaused, применяемого к соответствующим функциям для ограничения операций, когда контракт приостановлен.

owner-controlled pause with time limit

Пример 6: Пауза третьей стороны с ограничением по времени


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

Советы по выявлению: Ищите контракт с управляемым третьей стороной механизмом приостановки, когда третья сторона может приостанавливать и отключать контракт с заданной продолжительностью.

Проверьте наличие модификатора типа whenNotPaused, чтобы определить, какие операции ограничиваются, когда контракт приостановлен.

Убедитесь, что механизмы контроля доступа к функциям Pause в контракте, независимо от того, принадлежат ли они владельцу, управляются сообществом или третьими лицами, являются прозрачными и хорошо проработанными.

При выявлении функции Pause в смарт-контракте следует провести тщательный анализ кода, проверить средства контроля доступа, понять назначение и модель управления механизмом паузы. Очень важно провести комплексную экспертизу и взаимодействовать с сообществом проекта, чтобы оценить легитимность контракта и его соответствие поставленным целям. Всегда проявляйте осторожность и проводите надлежащие исследования перед заключением контрактов, предлагающих возможность приостановки, чтобы снизить потенциальные риски.

 

Надеемся, что эти примеры помогли Вам лучше разобраться со схемами функции Pause в смарт-контрактах.

 

Поскольку вся информация в блокчейне открыта (конечно, при условии верифицированного исходного кода контракта), то вооружившись этими знаниями Вы можете самостоятельно изучать смарт-контракты и выявлять различные схемы скама.

Однако, мы все уже сделали за Вас! Подключайте премиум подписку и откройте для себя доступ к эксклюзивным фильтрам по функциям смарт-контрактов и свежую аналитику. Повысьте шансы на успешные инвестиции в прибыльные токены.

С уважением, команда Lotus Market.

All posts

Connect to a wallet

Metamask