Атаки повторного входу на перший погляд здаються складними. Дозвольте мені пояснити їх простими словами та показати вам кілька способів захистити свої смартконтракти 🛡️
Що таке атака повторного входу? 🧐
Це коли ContractB викликає назад ContractA, поки ContractA все ще працює. Неприємні речі. Атакувальники люблять цю вразливість, щоб викачати кошти з контрактів 💸
Уявіть собі:
ContractA містить 10 ETH
ContractB вніс 1 ETH
ContractB тоді краде все
Механізм атаки 🕵️♂️
Вам потрібно дві ключові речі:
attack() функція, щоб все почати
fallback() функція для підступної частини
Потік йде так:
ContractB розпочинає атаку (, яка викликає withdraw контракту ContractA )
ContractA перевіряє баланс ContractB
ContractA відправляє ETH до ContractB
Це викликає зворотний виклик ContractB's ()
Цикл триває. Гроші зникли 🚨
Досить дивно, як це може бути простим, але водночас руйнівним.
Приклад вразливого коду 📝
Ось як виглядає вразливий контракт:
солідність
функція 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();
}
Нехай всі ваші контракти успадковують це. Безпечніша екосистема.
Останні тенденції 🔥
Станом на вересень 2025 року, ці атаки все ще турбують DeFi. Не зовсім зрозуміло, чому розробники продовжують робити ті ж самі помилки. Інструменти, такі як Slither, можуть виявити ці проблеми. Echidna та Foundry допомагають тестувати їх 🚀
Безпека - це не просто додавання модифікатора. Це менталітет.
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
Розуміння атак повторного входу та як їх запобігти 🔐
Атаки повторного входу на перший погляд здаються складними. Дозвольте мені пояснити їх простими словами та показати вам кілька способів захистити свої смартконтракти 🛡️
Що таке атака повторного входу? 🧐
Це коли ContractB викликає назад ContractA, поки ContractA все ще працює. Неприємні речі. Атакувальники люблять цю вразливість, щоб викачати кошти з контрактів 💸
Уявіть собі:
Механізм атаки 🕵️♂️
Вам потрібно дві ключові речі:
Потік йде так:
Досить дивно, як це може бути простим, але водночас руйнівним.
Приклад вразливого коду 📝
Ось як виглядає вразливий контракт: солідність функція withdrawAll() публічна { uint bal = balances[msg.sender]; require(bal > 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);
}
Спочатку оновіть свій стан. Взаємодійте пізніше. Завжди.
( 3. Глобальний захист 🌐
Для більших проектів:
солідність contract GlobalReentrancyGuard { bool private locked = false;
}
Нехай всі ваші контракти успадковують це. Безпечніша екосистема.
Останні тенденції 🔥
Станом на вересень 2025 року, ці атаки все ще турбують DeFi. Не зовсім зрозуміло, чому розробники продовжують робити ті ж самі помилки. Інструменти, такі як Slither, можуть виявити ці проблеми. Echidna та Foundry допомагають тестувати їх 🚀
Безпека - це не просто додавання модифікатора. Це менталітет.
Будьте пильними там! 🛡️