Розуміння атак повторного входу та як їх запобігти 🔐

robot
Генерація анотацій у процесі

Атаки повторного входу на перший погляд здаються складними. Дозвольте мені пояснити їх простими словами та показати вам кілька способів захистити свої смартконтракти 🛡️

Що таке атака повторного входу? 🧐

Це коли ContractB викликає назад ContractA, поки ContractA все ще працює. Неприємні речі. Атакувальники люблять цю вразливість, щоб викачати кошти з контрактів 💸

Уявіть собі:

  • ContractA містить 10 ETH
  • ContractB вніс 1 ETH
  • ContractB тоді краде все

Механізм атаки 🕵️‍♂️

Вам потрібно дві ключові речі:

  1. attack() функція, щоб все почати
  2. fallback() функція для підступної частини

Потік йде так:

  1. ContractB розпочинає атаку (, яка викликає withdraw контракту ContractA )
  2. ContractA перевіряє баланс ContractB
  3. ContractA відправляє ETH до ContractB
  4. Це викликає зворотний виклик ContractB's ()
  5. Цикл триває. Гроші зникли 🚨

Досить дивно, як це може бути простим, але водночас руйнівним.

Приклад вразливого коду 📝

Ось як виглядає вразливий контракт: солідність функція withdrawAll() публічна { uint bal = balances[msg.sender]; require(bal > 0);

(bool відправлено, ) = msg.sender.call{value: bal}("");
require(sent, "Не вдалося надіслати Ефір");

balances[msg.sender] = 0; // Оновлення ПІСЛЯ відправлення? Велика помилка!

}

Атакувальний контракт робить наступне: солідність fallback() зовнішній платіжний { if(ether.balance >= 1 ether) etherStore.withdrawAll(); }

function attack() зовнішній платіжний { require(msg.value >= 1 ether); etherStore.deposit{значення: 1 ефір}(); etherStore.withdrawAll(); }

Три способи зупинити ці атаки 🛡️

( 1. модифікатор nonReentrant 🔒

солідність bool private locked = false;

модифікатор nonReentrant)### { require(!locked, "Не повторна"); заблоковано = істинно; _; locked = false; }

Додайте це до вразливих функцій. Просто, але ефективно.

( 2. Патерн Перевірок-Ефектів-Взаємодій 📊

Це важливо:

Солідність функція withdrawAll)### публічна { uint bal = balances[msg.sender]; require(bal > 0);

balances[msg.sender] = 0; // Оновити ПЕРШИЙ

(bool sent, ) = msg.sender.call{value: bal}(""); // ТОГДІ взаємодіяти
require(sent, "Не вдалося надіслати Ether");

}

Спочатку оновіть свій стан. Взаємодійте пізніше. Завжди.

( 3. Глобальний захист 🌐

Для більших проектів:

солідність contract GlobalReentrancyGuard { bool private locked = false;

модифікатор globalNonReentrant)### {
    require(!locked, "Немає повторного входу");
    заблоковано = true;
    _;
    locked = false;
}

}

Нехай всі ваші контракти успадковують це. Безпечніша екосистема.

Останні тенденції 🔥

Станом на вересень 2025 року, ці атаки все ще турбують DeFi. Не зовсім зрозуміло, чому розробники продовжують робити ті ж самі помилки. Інструменти, такі як Slither, можуть виявити ці проблеми. Echidna та Foundry допомагають тестувати їх 🚀

Безпека - це не просто додавання модифікатора. Це менталітет.

Будьте пильними там! 🛡️

ETH2.07%
Переглянути оригінал
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
  • Нагородити
  • Прокоментувати
  • Репост
  • Поділіться
Прокоментувати
0/400
Немає коментарів
  • Закріпити