Аналіз смарт-контрактів
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