Понимание атак повторного входа и способы их предотвращения 🔐

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)(
  5. Цикл продолжается. Деньги ушли 🚨

Удивительно, как это может быть простым, но в то же время разрушительным.

Уязвимый код примера 📝

Вот как выглядит уязвимый контракт: солидность функция 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)(; }

функция 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(;

balances[msg.sender] = 0; // Обновить ПЕРВЫЙ

)bool sent, ( = msg.sender.call{value: bal})""(; // ЗАТЕМ взаимодействовать
require)sent, "Не удалось отправить Ether"(;

}

Сначала обновите свое состояние. Взаимодействуйте позже. Всегда.

) 3. Глобальная защита 🌐

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

солидность контракт GlobalReentrancyGuard { bool private locked = false;

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

}

Пусть все ваши смарт-контракты наследуют это. Более безопасная экосистема.

Последние тренды 🔥

На сентябрь 2025 года эти атаки по-прежнему преследуют DeFi. Не совсем ясно, почему разработчики продолжают совершать одни и те же ошибки. Инструменты, такие как Slither, могут выявить эти проблемы. Echidna и Foundry помогают тестировать их 🚀

Безопасность — это не просто добавление модификатора. Это образ мышления.

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

ETH-2.79%
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • комментарий
  • Репост
  • Поделиться
комментарий
0/400
Нет комментариев
  • Закрепить