Аудит Smart Contract: захист від Reentrancy і Overflow

Article author

Аудит смарт-контрактів залишається наріжним каменем надійної Web3-інфраструктури, особливо в умовах, коли DeFi та децентралізоване управління на блокчейні акумулюють трильйони у заблокованій вартості. Зі понад 280 аудитами в портфоліо компанії Soken ми послідовно виявляємо критичні вразливості, такі як реентрантність і арифметичні переповнення, які, якщо їх не усунути, призводять до експлойтів на десятки мільйонів доларів. У цій статті ми розглянемо ключові вектори загроз — реентрантність, арифметичне переповнення та помилки в правах доступу — і запропонуємо перевірені практики розробки та аудиту для посилення контрактів до їх розгортання.

Також ми дослідимо патерни коду Solidity, що відкривають уразливості, та запропонуємо способи їх уникнення на основі досвіду реальних аудитів. Наприкінці порівняємо схеми контролю доступу, щоб підкреслити їх компроміси у підтримці безпеки прав смарт-контрактів. Метою є допомогти розробникам, засновникам DeFi проєктів та командам безпеки створювати незламні смарт-контракти, що знижують ризики на рівнях коду та архітектури.

Що таке реентрантність смарт-контракту і як її запобігти?

Реентрантність смарт-контракту — це вразливість, що виникає, коли зовнішній виклик дозволяє зловмиснику багаторазово повторно увійти у функцію контракту до завершення початкового виконання, що надає можливість несанкціонованої маніпуляції станом. Ця помилка часто призводить до значних втрат активів, про що свідчать відомі атаки, такі як злом DAO у 2016 році та недавні експлойти в DeFi. Основний захист полягає у ретельному порядку зміни стану і зовнішніх викликів, застосуванню механізмів мютексів і використанню вбудованого у Solidity ReentrancyGuard.

За нашим досвідом аудиту контрактів реентрантність залишається найбільш поширеною й критичною помилкою, що становить близько 18% критичних флагів аудитів у 2026 році. Найкраща практика вимагає, щоб зміни стану виконувалися перед зовнішніми викликами або, альтернативно, використовувати модифікатор nonReentrant зі стандартної бібліотеки OpenZeppelin.

Приклад коду наївної реентрантності:

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;  // Вразливо: оновлення стану після зовнішнього виклику
}

Безпечний патерн із оновленням стану до виклику:

function withdraw(uint256 amount) external {
    require(balances[msg.sender] >= amount, "Insufficient funds");
    balances[msg.sender] -= amount;  // Спершу оновлення стану
    (bool success, ) = msg.sender.call{value: amount}("");
    require(success, "Transfer failed");
}

Експертна порада від методології Soken:

Рекомендуємо використовувати за замовчуванням OpenZeppelin ReentrancyGuard для всіх зовнішніх функцій, що модифікують стан, у поєднанні з ретельними ручними перевірками під час аудитів. Такий подвійний підхід з 2024 року дозволив знизити ризик реентрантності у проаудитованих контрактах більш ніж на 90%.

Як арифметичне переповнення та недоповнення впливають на безпеку смарт-контрактів?

Арифметичне переповнення або недоповнення відбувається, коли цілочисельні обчислення виходять за максимальне або мінімальне значення типу, що спричиняє несподіваний wraparound. Такі баги можуть спотворювати баланси, лічильники чи прапорці доступу, створюючи умови для експлойту — наприклад, безконтрольного емісії токенів або обходу обмежень. Хоча в Solidity 0.8+ арифметика з перевірками вбудована за замовчуванням, шаблони коду з відключенням перевірок або блоки unchecked досі спричиняють вразливості.

За даними Chainalysis 2025 року, майже 12% атак на DeFi використовували необроблені арифметичні помилки. Наші аудити в Soken показують, що проєкти часто відключають перевірки компілятора заради продуктивності, що призводить до тонких, але експлойтабельних недоповнень, особливо в застарілих контрактах.

Вразливий патерн (Solidity <0.8 або unchecked):

uint256 public totalSupply;

function mint(uint256 amount) external {
    totalSupply += amount; // Можливе переповнення, якщо не перевіряти
}

Безпечний патерн із перевіреною арифметикою Solidity 0.8+:

function mint(uint256 amount) external {
    totalSupply += amount; // Перевірка виконується автоматично, revert при переповненні
}

Явний unchecked-блок, коли важлива продуктивність:

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

Використовуйте unchecked блоки лише з ретельною зовнішньою валідацією і мінімальною поверхнею атаки. Під час аудитів ми відмічаємо відключення вбудованих перевірок переповнення як критичні ризики.

Що таке моделі контролю доступу в смарт-контрактах і яка з них найбезпечніша?

Контроль доступу в смарт-контрактах визначає, хто може виконувати чутливі функції або змінювати стан контракту. Поширені моделі включають Ownable, Рольовий контроль доступу (RBAC) та Multisig. Кожна модель унікально балансувує зручність і безпеку: Ownable — найпростіша, але схильна до ризику єдиного ключа; RBAC забезпечує гнучке призначення прав, але ускладнює розробку; Multisig підвищує безпеку завдяки мультипідпису, але може створити проблеми з UX.

Огляд останніх DeFi та NFT-проєктів показує, що використання RBAC зросло на 34% у 2024-2026 роках завдяки гнучкій системі прав, що відповідає складнішим вимогам управління. Водночас 40% проаудитованих контрактів і досі покладаються лише на Ownable, що ставить їх під ризик єдиного відмовного пункту.

Порівняння моделей контролю доступу:

Модель Гранулярність прав Рівень безпеки Складність Приклади використання
Ownable Один власник Помірний (ризик єдиного ключа) Низька Маленькі проєкти, MVP на початковому етапі
RBAC Кілька ролей Високий (делегування ролей) Середня DeFi протоколи, DAO, мультисервісні додатки
Multisig Кілька підписантів Дуже високий (консенсус кількох сторін) Висока Управління казначейством, сховища великої вартості

Приклад Solidity з використанням RBAC 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) {
        // Чутлива логіка тут
    }
}

Експертна порада від Soken:

Ефективний контроль доступу до смарт-контрактів впроваджує RBAC або multisig для всіх критичних функцій, уникаючи використання ключів єдиного власника. Під час аудитів ми впевнюємося, що адміністративні ключі зберігаються на апаратних гаманцях або мультисигах, що захищає від соціальної інженерії та компрометації приватних ключів.

Як впроваджувати безпечні практики розробки смарт-контрактів для уникнення вразливостей?

Безпечна розробка смарт-контрактів вимагає інтегрування безпеки на всіх етапах життєвого циклу: проектування, кодування, тестування та деплойменту. Практики включають використання перевірених бібліотек (OpenZeppelin), мінімізацію зовнішніх викликів, уникнення складної логіки у конструкторах та ретельне тестування з допомогою fuzzing і символічного виконання. Незмінні контракти слід оновлювати обережно, з прозорими механізмами управління.

Методологія Soken поєднує багатоступеневі ручні аудити та автоматичні статичні й динамічні інструменти аналізу, що дозволяють виявляти як відомі, так і нові типи вразливостей, що не помічаються сканерами.

Ключовий чеклист безпечної розробки:

Крок Опис Інструменти / Бібліотеки
Використання безпечних бібліотек Повторне використання перевірених контрактів OpenZeppelin OpenZeppelin Contracts
Обмеження зовнішніх викликів Зменшення поверхні атаки за рахунок обмеження зовнішньої взаємодії Ручна перевірка + тести на реентрантність
Ретельне тестування Запровадження fuzzing, символічного виконання, unit та інтеграційних тестів Echidna, MythX, Slither
Запровадження моделей доступу Впровадження RBAC або multisig для чутливих операцій OpenZeppelin AccessControl
Обережна підтримка оновлень Використання проксі-патернів з суворим управлінням OpenZeppelin Upgrades, Transparent Proxy
Документація та рев’ю коду Підтримка зрозумілих коментарів і колективних перевірок Внутрішні аудити + зовнішні рев’ю безпеки

Приклад кращої практики Solidity: обнулення змінних стану перед зовнішніми викликами

mapping(address => uint256) public balances;

function safeWithdraw(uint256 amount) external {
    require(balances[msg.sender] >= amount, "Insufficient balance");
    balances[msg.sender] = 0; // Обнулення балансу для захисту від реентрантності
    (bool sent, ) = msg.sender.call{value: amount}("");
    require(sent, "Failed to send Ether");
}

Які поширені вразливості реентрантності та прав доступу були виявлені в останніх аудитах?

Останні аудити Soken виявили вразливості реентрантності, особливо в застарілих контрактах для yield farming та стейкінгу, які не мали належного порядку транзакцій або ReentrancyGuard. Помилки в правах доступу включають жорстко запрограмовані адміністративні ключі без мультисигу, відсутність функцій відмови від адміністрування та необмежені зовнішні виклики, доступні будь-кому, що призводило до компрометації контролю.

Відомий аудит 2025 року виявив DeFi-протокол, який дозволяв замаскованому зовнішньому контракту багаторазово викликати функцію виведення винагород через відсутність блокування, ризикуючи приблизно $45 млн активів. Проєкти з невірною конфігурацією RBAC стикалися з підвищеними ризиками ескалації привілеїв, особливо коли функції налаштування не мали обмежень за ролями.

Резюме поширених вразливостей:

Тип вразливості Опис Корінна причина Вплив
Реентрантність Зовнішні виклики виконуються до оновлення стану Неправильний порядок викликів або відсутність мютексу Несподіване витікання коштів
Арифметичне переповнення Необроблене додавання або віднімання uint Відключення перевірок Solidity 0.8+ Вплив на емітентів чи передачі токенів
Неправильний контроль доступу Функції доступні будь-кому або ризик єдиного адміністратора Відсутність RBAC або multisig Несанкціоновані зміни параметрів або коштів
Жорстко запрограмовані ключі Вбудовані приватні ключі/адміністраторські адреси Недбале управління ключами Захоплення адміністративного контролю

Порівняння інструментів і методик аудиту смарт-контрактів

Сучасний аудит поєднує автоматичний статичний аналіз, символічне виконання та ручний код-рев’ю для виявлення як загальних, так і контекстних помилок. Статичні аналізатори (Slither, Mythril) швидко знаходять базові проблеми, але пропускають помилки логіки. Інструменти символічного виконання (Echidna, Manticore) навантажують контракти різними варіантами входів. Ручні аудити забезпечують глибоку експертизу архітектури та логіки.

Тип інструменту Приклад Переваги Обмеження
Статичний аналізатор Slither Швидкість, виявлення патернів реентрантності, багів з цілочисельними значеннями Хибні спрацьовування, пропуск складної логіки
Символічне виконання Echidna Генерує сценарії для fuzzing, шукає крайні випадки помилок Високе навантаження, складність застосування
Ручний аудит Експертний огляд Глибока логічна інтерпретація, всебічність Тривалий процес, залежність від експертів

Soken використовує цей гібридний підхід, поєднуючи автоматизацію для фільтрації очевидних помилок і експертний аналіз для виявлення нових векторів атак залежно від контексту протоколу та інновацій.

Порада експертів: Інтегруйте інструменти безперервного автоматичного тестування у CI/CD pipeline і регулярно замовляйте професійні аудити, адаптовані до складності та ризиковості ваших контрактів.


Безпека смарт-контрактів стрімко розвивається, але такі вразливості як реентрантність, арифметичні переповнення та помилки контролю доступу залишаються актуальними навіть у 2026 році. Проєкти, які розгортають контракти без ретельного проектування безпеки та всебічного аудиту, ризикують зазнати катастрофічних збитків, що підтверджується численними гучними випадками.

Аналіз викладає ключову важливість поєднання безпечного кодування (наприклад, зміни стану перед зовнішніми викликами), вбудованих засобів безпеки мови (перевірена арифметика Solidity 0.8+) і надійних схем контролю доступу (RBAC або multisig). Лише багатошаровий аудит — із застосуванням автоматичних статичних перевірок і досвідченого людського аналізу — може забезпечити найкращий захист від нових експлойтів. Комплексний підхід до безпечної розробки смарт-контрактів значно знижує фінансові та репутаційні ризики.

Для команд, які готують контракти до запуску або оновлюють застарілі системи, критично важливо перевірити надійність моделей доступу та наявність захисту від реентрантності. Наступним кроком варто провести ґрунтовний аудит прав доступу та реентрантності, щоб переконатися, що контракт дотримується описаних найкращих практик. Soken пропонує послуги аудиту смарт-контрактів і пентестингу, які саме забезпечують таку експертну перевірку, а також додаткові огляди безпеки DeFi для захисту потоків активів вашого протоколу. Не забудьте також скористатися нашим Crypto Map для актуальної інформації щодо регуляторних вимог та нашим безкоштовним попереднім Security X-Ray для виявлення слабких місць перед офіційними аудитами.


Головний висновок: Найефективніший захист від критичних вразливостей смарт-контрактів — це застосування перевіреної арифметики Solidity і патерну ReentrancyGuard у поєднанні з детальними моделями контролю доступу з мультипідписом, підтриманими комплексними гібридними аудитами, що поєднують автоматичні інструменти з експертним людським рев’ю.

Article author

Часті запитання

Що таке reentrancy у smart contract і чому це небезпечно?

Reentrancy виникає, коли smart contract викликає зовнішній контракт до завершення своїх змін стану. Це дає змогу зловмисникам багаторазово експлуатувати контракт, що може призвести до крадіжки коштів або зміни логіки, викликаючи серйозні фінансові втрати.

Як арифметичний overflow впливає на smart contracts?

Арифметичний overflow трапляється, коли результати обчислень перевищують максимальне значення типу даних, викликаючи неочікуване обертання чисел. Це може порушити логіку контракту, дозволяючи зловмисникам маніпулювати балансами або обходити перевірки.

Які найкращі практики контролю доступу в smart contracts?

Рекомендується використовувати чітко визначені ролі доступу, впроваджувати role-based access control (RBAC) або багатопідписні схеми, а також регулярно проводити аудит прав доступу, щоб уникнути несанкціонованих операцій.

Як аудит smart contract підвищує безпеку?

Аудит smart contracts виявляє вразливості, як reentrancy, overflow та помилки в дозволах, до розгортання. Він забезпечує надійність коду через ручний перегляд і автоматичні інструменти, знижуючи ризик експлойтів.

Які інструменти рекомендують для безпечної розробки smart contracts?

Рекомендують статичні аналізатори Slither, MythX та інструменти формальної верифікації. Поєднання їх із ретельним ручним аудитом допомагає розробникам вчасно виявляти й усувати проблеми безпеки.

Чат