Атаки повторного входа кажутся запутанными на первый взгляд. Позвольте мне объяснить их простыми словами и показать вам несколько способов защитить ваши смарт-контракты 🛡️
Что такое атака повторного входа? 🧐
Это происходит, когда ContractB вызывает обратно ContractA, в то время как ContractA все еще работает. Плохие дела. Злоумышленники любят эту уязвимость, чтобы изымать средства из контрактов 💸
Представьте себе:
ContractA держит 10 ETH
ContractB положил 1 ETH
ContractB затем крадет все
Механизм атаки 🕵️♂️
Вам нужно две ключевые вещи:
attack() функция, чтобы начать всё
fallback() функция для хитрой части
Поток идет следующим образом:
ContractB начинает атаку (, которая вызывает withdraw)( ContractA
ContractA проверяет баланс ContractB
ContractA отправляет ETH на ContractB
Это вызывает резервный контракт ContractB)(
Цикл продолжается. Деньги ушли 🚨
Удивительно, как это может быть простым, но в то же время разрушительным.
Уязвимый код примера 📝
Вот как выглядит уязвимый контракт:
солидность
функция withdrawAll)( публичная {
uint bal = balances[msg.sender];
require)bal > 0(;
)bool отправлено, ( = msg.sender.call{value: bal})""(;
require)sent, "Не удалось отправить эфир"(;
balances[msg.sender] = 0; // Обновление ПОСЛЕ отправки? Большая ошибка!
}
Атакующий контракт делает следующее:
солидность
fallback)( внешняя кредиторская задолженность {
if)etherStore.balance >= 1 ether(
etherStore.withdrawAll)(;
}
Пусть все ваши смарт-контракты наследуют это. Более безопасная экосистема.
Последние тренды 🔥
На сентябрь 2025 года эти атаки по-прежнему преследуют DeFi. Не совсем ясно, почему разработчики продолжают совершать одни и те же ошибки. Инструменты, такие как Slither, могут выявить эти проблемы. Echidna и Foundry помогают тестировать их 🚀
Безопасность — это не просто добавление модификатора. Это образ мышления.
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
Понимание атак повторного входа и способы их предотвращения 🔐
Атаки повторного входа кажутся запутанными на первый взгляд. Позвольте мне объяснить их простыми словами и показать вам несколько способов защитить ваши смарт-контракты 🛡️
Что такое атака повторного входа? 🧐
Это происходит, когда ContractB вызывает обратно ContractA, в то время как ContractA все еще работает. Плохие дела. Злоумышленники любят эту уязвимость, чтобы изымать средства из контрактов 💸
Представьте себе:
Механизм атаки 🕵️♂️
Вам нужно две ключевые вещи:
Поток идет следующим образом:
Удивительно, как это может быть простым, но в то же время разрушительным.
Уязвимый код примера 📝
Вот как выглядит уязвимый контракт: солидность функция withdrawAll)( публичная { uint bal = balances[msg.sender]; require)bal > 0(;
}
Атакующий контракт делает следующее: солидность fallback)( внешняя кредиторская задолженность { if)etherStore.balance >= 1 ether( etherStore.withdrawAll)(; }
функция attack)( внешняя кредиторская задолженность { require)msg.value >= 1 ether(; etherStore.deposit{значение: 1 эфир})(; etherStore.withdrawAll)(; }
Три способа остановить эти атаки 🛡️
) 1. nonReentrant Модификатор 🔒
твердость bool private locked = false;
модификатор nonReentrant###( { require)!locked, "Нет повторного входа"(; locked = true; _; заблокировано = ложь; }
Добавьте это к уязвимым функциям. Просто, но эффективно.
) 2. Паттерн Проверок-Эффектов-Взаимодействий 📊
Это крайне важно:
твердость функция withdrawAll###( публичная { uint bal = balances[msg.sender]; require)bal > 0(;
}
Сначала обновите свое состояние. Взаимодействуйте позже. Всегда.
) 3. Глобальная защита 🌐
Для больших проектов:
солидность контракт GlobalReentrancyGuard { bool private locked = false;
}
Пусть все ваши смарт-контракты наследуют это. Более безопасная экосистема.
Последние тренды 🔥
На сентябрь 2025 года эти атаки по-прежнему преследуют DeFi. Не совсем ясно, почему разработчики продолжают совершать одни и те же ошибки. Инструменты, такие как Slither, могут выявить эти проблемы. Echidna и Foundry помогают тестировать их 🚀
Безопасность — это не просто добавление модификатора. Это образ мышления.
Будьте бдительны там! 🛡️