Что такое Reentrancy Attack?
Reentrancy Attack: это ситуация, когда контракт отправляет управление другому контракту во время вызова, и внешний код возвращается в первый контракт до того, как тот успел обновить свои записи. Эта синхронизационная уловка позволяет злоумышленнику повторять чувствительные операции, например снятие средств, снова и снова. Представьте, что вы просите возврат денег, а затем возвращаетесь к кассе до того, как кассир закрыл кассу.
«Только старый код может пострадать от Reentrancy Attack.» Неправда. Любой контракт, который выполняет внешний вызов до того, как зафиксирует своё состояние, может быть уязвим при небрежной логике.
Как работает Reentrancy Attack
Короткая история. Типичный смарт контракт имеет функцию вывода средств, которая отправляет средства вызывающему. Если она сначала отправляет средства, а затем очищает баланс, злоумышленник может вставить обратный вызов и запросить больше до того, как баланс будет обнулён.
- Начало: Злоумышленник вносит немного средств, чтобы выглядеть как обычный пользователь.
- Вызов: Злоумышленник инициирует вывод в целевом контракте.
- Обратный вызов: Целевой контракт отправляет средства, что запускает функцию обратного вызова злоумышленника.
- Повтор: Этот обратный вызов снова вызывает вывод до того, как баланс обновится.
- Опустошение: Цикл продолжается, пока у контракта не кончатся средства или газ. Да, в этом и заключается приём.
Одна небольшая ошибка в порядке действий, большая проблема.
Почему Reentrancy Attack имеет значение
Это важно, потому что ошибки синхронизации быстро приводят к реальным денежным потерям. К тому же это классический эксплойт, который должен уметь распознавать каждый разработчик и пользователь.
- Польза: Знание этой схемы помогает обнаруживать рискованный код и защищать средства.
- Особенность: Он процветает на публичной прозрачности, так как всё в блокчейне видно и доступно для вызова.
- Применение: Вы встретите его в DeFi, на мостах, в казначействах и даже в выплатах по управлению для DAO.
Следуйте правилу: проверки, затем изменения состояния, затем взаимодействия. Сначала обновляйте балансы, затем выполняйте внешние вызовы. Добавьте простой механизм защиты от повторного входа для дополнительной безопасности.
Ключевые характеристики Reentrancy Attack
Вот что лежит в основе:
- Рекурсия: Внешний код возвращается в тот же контракт до его завершения.
- Порядок действий: Ошибка проявляется, когда отправка средств или внешний вызов происходят до обновления состояния.
- Пересечение: Она может переходить между несколькими контрактами, а не ограничиваться одной функцией.
- Активы: Работает с ETH, токенами и даже внутренними кредитами при плохой реализации.
Варианты
Разные варианты, одна и та же головная боль для небрежного кода:
- Одиночный: Повторный вход в ту же функцию многократно.
- Перекрёстный: Повторный вход через другую функцию внутри того же контракта.
- Мульти: Повторный вход через два или более контрактов в цикле.
- Только для чтения: Влияние на view функции или ценовые оракулы, чтобы ввести в заблуждение последующие записи.
Исправление Reentrancy Attack касается не только одной функции. Проверьте каждый внешний вызов, добавьте тесты для необычных цепочек вызовов и запланируйте регулярные аудиты.
Пример
Эксплойт 2016 года на The DAO использовал цикл повторного входа при выводе средств до очистки балансов, опустошив крупное казначейство за считанные минуты.
Интересный факт
Фраза сообщества «проверки, затем эффекты, затем взаимодействия» взяты из ранних руководств по безопасности и прижилась благодаря своей краткости, запоминаемости и эффективности.
Вывод
Краткая версия для запоминания: если внешний код может вызвать вас до того, как вы закончите свою учётную работу, предполагайте, что он это сделает, и вы рискуете отдать ему бесплатные средства. Это и есть Reentrancy Attack.
