Повторная атака

Атака повторного входа — это класс уязвимостей смарт-контрактов, при которых вредоносный контракт использует вызов внешней функции для повторного входа в вызывающий контракт до завершения первоначального выполнения, что позволяет злоумышленнику многократно опустошать средства или манипулировать переменными состояния. Атака происходит, когда контракт отправляет эфир или токены на внешний адрес, обычно используя низкоуровневый механизм. call Этот метод, прежде чем обновить собственное внутреннее состояние, создает окно, в течение которого резервная функция получателя или функция приема может рекурсивно вызывать уязвимый контракт.

Канонический механизм работает следующим образом: контракт-жертва хранит отображение баланса и функцию вывода средств. Когда пользователь вызывает функцию вывода средств, контракт отправляет Ether на адрес вызывающего клиента, прежде чем обнулить его баланс. Если вызывающий клиент является вредоносным контрактом с резервной функцией, которая немедленно вызывает функцию вывода средств снова, проверка баланса контракта-жертвы по-прежнему показывает первоначальную сумму, поскольку обновление состояния еще не произошло. Этот рекурсивный процесс повторного входа продолжает истощать средства до тех пор, пока баланс Ether контракта-жертвы не будет исчерпан или не будет достигнут лимит стека вызовов.

Атаки с использованием реентрантности используют фундаментальное свойство виртуальной машины Ethereum (EVM) , согласно которому внешние вызовы передают управление выполнением вызываемой стороне до того, как будут выполнены последующие инструкции вызывающей стороны. Это делает реентрантность одной из самых опасных и хорошо изученных уязвимостей в разработке смарт-контрактов. Этот паттерн стал причиной некоторых из крупнейших финансовых потерь в истории децентрализованных финансов, включая печально известный взлом DAO в 2016 году, который привел к убыткам в размере около 60 миллионов долларов и в конечном итоге к хардфорку Ethereum, создавшему Ethereum Classic.

Современные варианты реентрантности выходят за рамки простой однофункциональной модели и включают в себя межфункциональную реентрантность (когда функция обратного вызова повторно входит в другую функцию, которая считывает устаревшее состояние), межконтрактную реентрантность (когда функция обратного вызова нацелена на другой контракт, который разделяет состояние с уязвимым контрактом) и реентрантность только для чтения (когда функция обратного вызова использует устаревшее состояние в функциях представления, используемых другими протоколами для расчета цен или обеспечения).

Происхождение и история

2015 год: Ethereum был запущен с Solidity в качестве основного языка смарт-контрактов. Конструкция EVM, в которой внешние вызовы передают управление выполнением и позволяют произвольное выполнение кода вызываемой стороне, создала фундаментальные условия для уязвимостей реентерабельности. В ранней документации Solidity не было явных предупреждений о рисках выполнения внешних вызовов до обновления состояния.

Июнь 2016: Децентрализованная автономная организация (DAO), которая привлекла около 150 миллионов долларов в ETH посредством продажи токенов, стала жертвой мошенничества из-за уязвимости повторного входа в свою систему. splitDAO функция. Злоумышленник развернул вредоносный контракт с специально созданной резервной функцией, которая вызывала обратную связь с DAO. splitDAO Функция рекурсивно истощила примерно 3.6 миллиона ETH (что на тот момент составляло около 60 миллионов долларов). Это остается самой масштабной атакой повторного входа в истории блокчейна.

Июль 2016 года: Сообщество Ethereum столкнулось с кризисом управления по вопросу о том, следует ли проводить хардфорк блокчейна для отмены взлома DAO. Это событие подвергло принцип «код — это закон», основополагающую предпосылку DAO, серьезному испытанию. Большинство членов сообщества, при поддержке Виталика Бутерина, высказались за условную интерпретацию принципа, проведя хардфорк на блоке 1 920 000 для возврата средств. Противники, утверждавшие, что «код — это закон» должен быть абсолютным и неизменным, продолжили работу оригинальной цепочки как Ethereum Classic (ETC).

2017-2018: Взлом DAO подтолкнул к внедрению подхода, ориентированного на безопасность, в разработку смарт-контрактов. OpenZeppelin выпустила свой ReentrancyGuard смарт-контракт, обеспечивающий стандартизированную защиту от повторного входа на основе мьютексов. Для удовлетворения растущей потребности в безопасности смарт-контрактов появились формальные инструменты верификации и компании по аудиту безопасности, такие как Trail of Bits и ConsenSys Diligence.

2020 год: Взрывной рост DeFi Summer привлёк миллиарды долларов в смарт-контракты , резко повысив риски уязвимостей, связанных с повторным входом в систему. Композитность протоколов DeFi («денежные конструкторы») создала риски повторного входа между контрактами, которые было сложнее обнаружить и проверить, чем уязвимости в отдельных контрактах.

Апрель 2020 года: Инцидент с Uniswap/Lendf.me привёл к утечке примерно 25 миллионов долларов на обеих платформах в результате атаки повторного входа, использующей механизмы обратного вызова токенов ERC-777. При этом подавляющая часть потерь (около 24.5 миллионов долларов) пришлась на Lendf.me (протокол кредитования dForce). Это продемонстрировало, что атака повторного входа не ограничивается прямыми переводами ETH, а может быть вызвана стандартными механизмами обратного вызова токенов.

Июль 2023 года: Curve Finance подверглась разрушительной атаке реентерабельности из-за ошибки компилятора в Vyper (версии 0.2.15, 0.2.16 и 0.3.0), которая привела к сбою блокировки реентерабельности. Из нескольких пулов Curve было изъято около 70 миллионов долларов, что доказывает, что защита от реентерабельности может давать сбои на уровне компилятора языка, а не только на уровне логики контракта.

2024-2026: Реентрантность только для чтения стала новой проблемой, вызывающей опасения, особенно в протоколах, которые полагаются на функции представления других контрактов для ценообразования. Риски реентрантности между цепочками также материализовались, поскольку протоколы-мосты и многоцепочечные архитектуры DeFi создали новые поверхности для атак, где несоответствия состояний между цепочками могли быть использованы.

«Взлом DAO стал моментом, когда сообщество Ethereum осознало, что код — это закон, но в законе могут быть ошибки. Это коренным образом навсегда изменило наше представление о безопасности смарт-контрактов».
– Виталик Бутерин, размышляя об инциденте 2016 года.

Простыми словами

Представьте, что кассир в банке проверяет баланс вашего счета, выдает вам наличные, а затем обновляет выписку, отражая снятие средств. Атака повторного входа — это как вернуться к тому же кассиру до обновления выписки и попросить еще одно снятие средств. Кассир по-прежнему видит ваш первоначальный баланс и выдает вам еще наличные. Вы продолжаете возвращаться, пока хранилище не опустеет.

Представьте себе торговый автомат, который выдает напиток, а затем списывает деньги с вашей предоплаченной карты. Если бы вы могли нажать кнопку еще раз в тот момент, когда напиток начинает выходить, но до того, как с карты будут списаны средства, вы бы получили несколько напитков по цене одного. Атака с использованием повторного входа (reentrancy attack) использует этот разрыв между «дать предмет» и «зафиксировать, что я дал предмет».

Представьте себе вращающуюся дверь в отеле. Обычно вы проходите, швейцар отмечает ваш вход, и вы заходите внутрь. Но в случае попытки повторного входа вы заходите во вращающуюся дверь, и прежде чем швейцар успевает отметить ваш вход, вы разворачиваетесь и входите снова, и снова, и снова, каждый раз выглядя как «новый» посетитель, потому что швейцар так и не успел обновить свой список.

Это похоже на очередь на кассе, где кассир выдает вам продукты, а затем сканирует их. Если бы вы могли мгновенно вернуться в начало очереди с той же тележкой, кассир продолжал бы выдавать вам все больше и больше продуктов, потому что на кассе по-прежнему отображается полная сумма оплаты. В конце концов, в магазине заканчиваются товары.

Важно: атаки с использованием механизма повторного входа нацелены на сам код контракта, а не на механизм консенсуса блокчейна. Блокчейн точно записывает каждую транзакцию, включая вредоносные. Именно поэтому предотвращение должно происходить на уровне разработки смарт-контрактов с помощью безопасных шаблонов кодирования, аудита и формальной верификации. Блокчейн не может отличить законный вывод средств от атаки с использованием механизма повторного входа.

Основные технические характеристики

Механизм реентрантности в деталях

  1. Злоумышленник развертывает вредоносный контракт со специально разработанной резервной (или приемной) функцией.
  2. Злоумышленник вызывает функцию вывода средств уязвимого контракта из вредоносного контракта.
  3. Уязвимый контракт проверяет баланс злоумышленника. Проверка проходит успешно, потому что злоумышленник внес средства на свой счет.
  4. Уязвимый контракт отправляет ETH на адрес контракта злоумышленника, используя низкоуровневый механизм. call со значением
  5. Перед тем как исполнение вернется к следующей строке уязвимого контракта (обновление баланса), EVM передает управление контракту злоумышленника.
  6. Функция резервного копирования злоумышленника автоматически выполняется при получении ETH и немедленно вызывает функцию вывода средств.
  7. Уязвимый контракт повторно выполняет функцию вывода средств. Поскольку баланс не был обновлен, проверка проходит успешно.
  8. Шаги с 4 по 7 повторяются рекурсивно до тех пор, пока баланс ETH контракта не будет исчерпан или не будет достигнут лимит газа.
  9. Только после завершения последнего рекурсивного вызова стек вызовов разворачивается, и наконец выполняется обновление баланса из первого вызова. Но средства уже закончились.

Схема «Проверки-Эффекты-Взаимодействия»

  • Проверяет: Проверьте все условия и требования (например, require(balances[msg.sender] >= amount))
  • Эффекты: Обновите все внутренние переменные состояния (например, balances[msg.sender] -= amount)
  • Взаимодействия: Выполнять внешние вызовы (например, msg.sender.call{value: amount}("")) только после всех изменений в состоянии штата

Такой порядок гарантирует, что даже если во время этапа взаимодействия произойдет повторный вызов, состояние уже будет обновлено, и последующие проверки баланса завершатся неудачей. Этот шаблон является наиболее важной защитой от повторного вызова и предписывается всеми основными руководствами по стилю Solidity и аудиторскими фирмами.

OpenZeppelin ReentrancyGuard

  • Обеспечивает nonReentrant Модификатор, использующий переменную мьютекса (взаимного исключения) для предотвращения повторного входа.
  • Модификатор устанавливает блокировку состояния перед выполнением функции и сбрасывает её после завершения.
  • Если при активной блокировке происходит повторный вызов защищенной функции, транзакция отменяется.
  • В реализации используется переменная состояния типа uint256 (1 = не введено, 2 = введено), а не логическая переменная для оптимизации газа.
  • Широко распространены в сфере DeFi: Aave, Compound, Uniswap V3 и сотни других протоколов используют ReentrancyGuard или аналогичные алгоритмы.

Варианты реентрантности

  • Реентрантность с одной функцией: Классическая атака, при которой резервная функция вызывает ту же уязвимую функцию. Это был шаблон взлома DAO.
  • Перекрестная функциональная реентрантность: Функция резервного копирования вызывает другую функцию в том же контракте, которая считывает устаревшую переменную состояния, что позволяет использовать уязвимость через вторичный путь.
  • Повторное участие в рамках различных контрактов: Функция обратного вызова нацелена на другой контракт, который разделяет состояние или доверительные отношения с уязвимым контрактом, используя уязвимость компоновки в DeFi.
  • Реентрантность только для чтения: Функция обратного вызова вызывает функцию представления, которая возвращает устаревшее состояние, используемое затем сторонним протоколом для ценообразования, оценки залогового обеспечения или передачи данных в оракул. Прямого оттока средств не происходит, но становится возможной косвенная эксплуатация.
  • Реентрантность ERC-777: Стандарт токенов ERC-777 включает в себя обработчики обратных вызовов (tokensReceived) которые выполняют код на стороне получателя, создавая векторы реентрантности в протоколах, обрабатывающих токены ERC-777 без защиты.

Инструменты обнаружения и предотвращения

  • Статический анализ: Такие инструменты, как Slither (от Trail of Bits), автоматически обнаруживают закономерности реентерации в коде Solidity посредством анализа потока управления.
  • Формальная верификация: Такие инструменты, как Certora Prover, математически подтверждают невозможность повторного входа в соответствии со спецификацией контракта.
  • Фаззинг: Программы Echidna и Foundry используют фаззинг-тесты с произвольными входными данными для обнаружения реентрантности и других уязвимостей.
  • Аудиты безопасности: Профессиональные аудиторские фирмы (Trail of Bits, OpenZeppelin, Consensys Diligence, Halborn) вручную проверяют код контрактов на наличие уязвимостей, связанных с повторным входом в систему, и других подобных проблем.
  • Награды за обнаружение ошибок: Такие платформы, как Immunefi, стимулируют «белых» хакеров обнаруживать уязвимости реентрантности до того, как ими воспользуются злоумышленники.

Преимущества недостатки

Преимущества (понимания процесса реентрантности)Недостатки (риски повторного вхождения в дыхательные пути)
Осведомленность о безопасности: Понимание принципа реентрантности является основополагающим для написания безопасных смарт-контрактов. Это первая уязвимость, о которой рассказывается на каждом курсе по безопасности Solidity.Катастрофические финансовые потери: Один-единственный эксплойт, использующий уязвимость повторного входа, может истощить все средства протокола за одну транзакцию, как это продемонстрировали взлом DAO на 60 миллионов долларов и эксплойт Curve на 70 миллионов долларов.
Установленные средства защиты: Хорошо задокументированные схемы предотвращения повторного входа (проверки-эффекты-взаимодействия, ReentrancyGuard) позволяют избежать повторного входа, если разработчики следуют передовым практикам.Эволюция векторов атак: Продолжают появляться новые варианты, такие как реентрантность только для чтения и реентрантность между контрактами, опережая осведомленность разработчиков и существующие инструменты обнаружения.
Экосистема инструментов: Развитая экосистема статических анализаторов, фаззеров и инструментов формальной верификации позволяет автоматически обнаруживать большинство шаблонов повторного входа до развертывания.Риски на уровне компилятора: Взлом Curve Finance в 2023 году доказал, что средства защиты от повторного входа могут дать сбой из-за ошибок в самом компиляторе, создавая дополнительный уровень риска, неподвластный контролю разработчиков.
Рост аудиторской отрасли: Распространенность повторного входа в систему способствовала росту индустрии профессионального аудита смарт-контрактов, что повысило общую безопасность экосистемы.Усиление компонуемости: Компонуемая архитектура DeFi, напоминающая «денежный конструктор», означает, что уязвимость повторного входа в одном протоколе может распространиться на множество взаимосвязанных протоколов.
Обмен знаниями в сообществе: Распространённые случаи использования уязвимостей, приводящих к повторному входу в систему, стали поводом для обширного анализа причин сбоев, появления образовательных ресурсов с открытым исходным кодом и отраслевых улучшений в области безопасности.Ложное чувство безопасности: Разработчики, применяющие ReentrancyGuard к некоторым функциям, могут упустить пути реентрантности между функциями или контрактами, что приведет к неполной защите.
Бонусы за обнаружение уязвимостей: Серьезность проблемы реентрантности привела к тому, что протоколы предлагают существенные вознаграждения за обнаружение уязвимостей (часто более 1 миллиона долларов), стимулируя поиск уязвимостей «белыми хакерами» вместо их эксплуатации «черными хакерами».Накладные расходы на газ: Защита от повторного входа увеличивает стоимость газа при каждом вызове защищенной функции, что приводит к усугублению ситуации в высокочастотных операциях DeFi и может повлиять на конкурентоспособность протокола.
Уроки управления: Взлом DAO преподал блокчейн-сообществу важные уроки об управлении, неизменности данных и роли социального слоя в реагировании на сбои на уровне кода.Необратимость эксплойтов: В отличие от традиционных финансов, где мошеннические транзакции можно отменить, уязвимости повторного входа в неизменяемые блокчейны являются необратимыми, если сообщество не согласится на спорный хардфорк.

Управление рисками

Практики разработки смарт-контрактов

  • Всегда следуйте шаблону «проверки-эффекты-взаимодействия»: обновляйте все переменные состояния перед выполнением любых внешних вызовов.
  • Примените OpenZeppelin nonReentrant модификатор для каждой функции, которая выполняет внешние вызовы или передает значение.
  • Избегать использования transfer() и send() для переводов ETH в новых контрактах. Хотя они ограничивают газ до 2,300 (предотвращая повторный вход), они могут перестать работать при изменениях EIP и переоценке газа.
  • Используйте схему платежей «pull-over-push»: вместо прямой отправки средств позвольте пользователям выводить собственные средства, уменьшая поверхность атаки.

Протоколы аудита и тестирования

  • Требуйте проведения как минимум двух независимых аудитов безопасности от авторитетных фирм, прежде чем заключать контракты, связанные со значительными активами.
  • Перед развертыванием запускайте статический анализ с помощью Slither и Mythril для каждого контракта. Эти инструменты автоматически выявляют наиболее распространенные шаблоны повторного входа.
  • Разработайте подробные наборы фаззинг-тестов с использованием Echidna или Foundry, специально предназначенные для проверки сценариев реентерабельности.
  • При интеграции с внешними протоколами, особенно с теми, которые используют стандарты токенов с частыми обратными вызовами, такие как ERC-777, необходимо проводить анализ реентрантности между контрактами.

Операционная безопасность

  • Развертывайте контракты за обновляемыми прокси-моделями или с механизмами аварийной паузы, которые могут остановить вывод средств при обнаружении повторного входа.
  • Отслеживайте активность в блокчейне на предмет необычных моделей вывода средств (например, быстрые рекурсивные вызовы одной и той же функции в рамках одной транзакции) с помощью таких инструментов, как Forta или OpenZeppelin Defender.
  • Разработайте процедуры реагирования на инциденты, включая приостановку действия контрактов, каналы связи и стратегии возврата средств.
  • Поддерживайте программы вознаграждения за обнаружение уязвимостей с выплатами, пропорциональными общей заблокированной стоимости (TVL) в протоколе.

Риск интеграции DeFi

  • При работе с внешними протоколами перед интеграцией проверьте защиту от повторного входа во внешний контракт.
  • Не следует предполагать, что внешние функции представления возвращают согласованное состояние во время выполнения обратного вызова. Это вектор реентерабельности только для чтения.
  • Внедрите механизмы защиты от повторного входа на уровне границ протокола, а не только на уровне отдельных функций, чтобы предотвратить цепочки повторного входа между контрактами.

Культурная значимость

Атака с использованием механизма повторного входа занимает уникальное место в блокчейн-культуре как событие, разрушившее наивную философию «код — это закон» и заставившее сообщество Ethereum столкнуться с противоречием между неизменностью и прагматизмом. Взлом DAO в 2016 году был не просто технической уязвимостью. Это был экзистенциальный момент для Ethereum, разделивший сообщество на два философских лагеря, один из которых породил Ethereum Classic.

«Предполагалось, что DAO докажет работоспособность децентрализованного управления. Вместо этого она доказала, что написание безопасного кода сложнее, чем кто-либо предполагал».
– Фил Дайан, исследователь безопасности смарт-контрактов

В культуре разработчиков реентрантность стала своего рода обрядом посвящения. Обучение каждого разработчика Solidity начинается с изучения взлома DAO, и вопрос «проверяли ли вы наличие реентрантности?» является наиболее часто задаваемым вопросом при проверке кода смарт-контрактов. В челленджах Damn Vulnerable DeFi и Ethernaut уровни реентрантности рассматриваются как базовые упражнения.

Взлом Curve Finance в июле 2023 года вновь разжег дискуссию о реентерабельности, на этот раз сосредоточившись на возможности того, что ошибки на уровне компилятора могут подорвать защиту, правильно реализованную разработчиками. Ошибка компилятора Vyper, отключавшая блокировки реентерабельности, продемонстрировала, что безопасность при разработке смарт-контрактов требует доверия не только к собственному коду, но и ко всей цепочке инструментов. Этот урок глубоко затронул этику блокчейн-сообщества, основанную на минимальных предположениях о доверии.

В криптотвиттере и на форумах DeFi уязвимости реентрантности анализируются в режиме реального времени с той же интенсивностью, что и новостные сообщения. «Белые хакеры», обнаружившие и ответственно раскрывшие уязвимости реентрантности, прославляются как герои сообщества, а посмертные анализы эксплойтов становятся одним из самых распространенных технических материалов в экосистеме. Термин «реентрантность» вышел за рамки своего технического определения и стал культурным обозначением постоянно существующего противоречия между скоростью инноваций и строгостью безопасности в децентрализованных финансах.

Примеры из реального мира

Взлом DAO (июнь 2016 г.)

Сценарий: DAO, децентрализованный фонд венчурного капитала, хранил ETH на сумму около 150 миллионов долларов, внесенных тысячами инвесторов. splitDAO Эта функция позволяла инвесторам выводить свою пропорциональную долю средств в «дочернюю DAO».

Реализация: Злоумышленник развернул вредоносный внешний контракт с резервной функцией, предназначенной для рекурсивного вызова функций DAO. splitDAO Эта функция отправляла ETH в контракт злоумышленника перед обновлением внутреннего баланса. Поскольку баланс никогда не обнулялся между рекурсивными вызовами, злоумышленник продолжал выкачивать средства в течение нескольких часов, похитив примерно 3.6 миллиона ETH (около 60 миллионов долларов).

Результат: Сообщество Ethereum провело хардфорк на блоке 1 920 000, чтобы восстановить украденные средства, что привело к разделению Ethereum (ETH) и Ethereum Classic (ETC). Это событие сделало реентрантность самой печально известной уязвимостью в истории смарт-контрактов и стало катализатором всей индустрии безопасности смарт-контрактов.

Эксплойт Vyper от Curve Finance (30 июля 2023 г.)

Сценарий: Было создано несколько пулов ликвидности Curve Finance (alETH/ETH, msETH/ETH, pETH/ETH и CRV/ETH) с использованием смарт-контрактов Vyper, которые включали в себя @nonreentrant Декораторы — аналог ReentrancyGuard в Solidity для Vyper.

Реализация: Ошибка в версиях компилятора Vyper 0.2.15, 0.2.16 и 0.3.0 привела к следующему: @nonreentrant Блокировка компилировалась некорректно, что фактически отключало защиту от повторного входа во время выполнения, несмотря на то, что в исходном коде она отображалась правильно. Злоумышленники использовали это для повторного входа в функции пула во время вывода ликвидности, манипулируя ценами и выводя средства. Эксплойт был нацелен на remove_liquidity функция, которая отправляла токены вызывающей стороне перед полным обновлением состояния пула.

Результат: Примерно 70 миллионов долларов были выведены из нескольких пулов. Несколько «белых хакеров» и боты MEV руководили некоторыми атаками, вернув часть средств. Инцидент выявил критический риск того, что ошибки на уровне компилятора подрывают меры безопасности на уровне приложений, и привел к детальному аудиту компилятора Vyper.

Атака Uniswap/Lendf.me по протоколу ERC-777 (апрель 2020 г.)

Сценарий: Протокол Lendf.me от dForce, платформа кредитования, поддерживал imBTC — токен стандарта ERC-777 со встроенными механизмами обратного вызова. Когда пользователь получал токены imBTC, токен ERC-777 tokensReceived В результате атаки с использованием хука был выполнен код, встроенный в контракт получателя. Uniswap также стал объектом аналогичной атаки, совокупный ущерб по обеим платформам составил приблизительно 25 миллионов долларов, причем подавляющая часть пришлась на Lendf.me.

Реализация: Злоумышленник воспользовался уязвимостью tokensReceived Обратный вызов во время функции предоставления: когда Lendf.me отправлял imBTC на контракт злоумышленника в рамках операции предоставления/заимствования, обратный вызов повторно входил в функцию предоставления Lendf.me, искусственно завышая баланс залога злоумышленника. С помощью завышенного залога злоумышленник заимствовал все доступные активы из протокола.

Результат: Из Lendf.me было выведено около 24.5 миллионов долларов, потери на Uniswap были меньше. Злоумышленник в конечном итоге вернул средства после частичной идентификации. Этот инцидент подчеркнул риски повторного входа, характерные для обратных вызовов токенов ERC-777, и побудил многие протоколы DeFi явно внести в черный список или добавить защиту для стандартов токенов с поддержкой обратных вызовов.

Эксплойт протокола Rari Capital / Fei (апрель 2022 г.)

Ситуация: Кредитные пулы Fuse компании Rari Capital позволяли пользователям предоставлять и заимствовать различные токены. Несколько пулов Fuse принимали токены с механизмами обратного вызова, обеспечивающими повторный доступ во время процесса заимствования.

Реализация: Злоумышленник использовал уязвимость повторного входа в систему. borrow Взаимодействие функции с токенами, поддерживающими обратный вызов. Повторно войдя в систему во время обратного вызова для заимствования, злоумышленник манипулировал учетом пула, чтобы заимствовать больше средств, чем позволяло его обеспечение, и повторил этот процесс в нескольких пулах Fuse.

Результат: В результате кражи было похищено около 80 миллионов долларов из нескольких пулов Fuse. Компании Rari Capital и Fei Protocol, которые недавно объединились, не смогли вернуть средства, что в конечном итоге привело к закрытию протокола. Эта уязвимость подчеркнула риски повторного входа в составные протоколы кредитования с разрешительным белым списком токенов.

Сравнительная таблица

ХарактеристикаПовторная атакаФлэш-кредитная атакаАтака с использованием манипуляций с оракулом
Вектор атакиРекурсивные внешние вызовы перед обновлением состоянияНеобеспеченные кредиты, использующие логику протокола в рамках одной транзакции.Передача ложных данных о ценах в смарт-контракты с помощью манипулированных или устаревших оракулов.
Основная причинаНарушение схемы «проверки-эффекты-взаимодействия»Логика протокола, предполагающая, что заемщики несут реальные финансовые риски.Опора на данные из одного источника или на легко поддающиеся манипулированию источники цен.
Требуемый капиталМинимальная сумма (достаточная лишь для инициирования первого вывода средств).Ноль (срочные кредиты по своей сути не обеспечены залогом)Переменная (от нуля при использовании экспресс-кредитов до значимой при прямой манипуляции рынком)
Первичная защитаReentrancyGuard, проверки-эффекты-взаимодействия, извлечение шаблонов платежейМногоблочная TWAP, минимальные периоды блокировки, разделение заимствования и предложения.Децентрализованные оракулы (Chainlink), TWAP, многоисточниковые потоки цен, автоматические выключатели.
Исторический ущерб60 млн долларов (DAO, 2016), 70 млн долларов (Curve, 2023), 80 млн долларов (Rari, 2022)Более 130 млн долларов (Cream Finance, 2021 г.), 182 млн долларов (Beanstalk, 2022 г.)Более 100 млн долларов (Mango Markets, 2022 г.), 130 млн долларов (Cream Finance, 2021 г.)
Сложность обнаруженияУмеренная сложность: инструменты статического анализа выявляют большинство закономерностей, но варианты с перекрестными контрактами и только для чтения выявляются сложнее.Высокий уровень: требует понимания сложной многоэтапной логики транзакций.Высокий уровень сложности: отличить манипуляцию от законной рыночной деятельности по своей сути трудно.
Влияние блокчейнаЭто стало причиной хардфорка Ethereum (разделения ETH и ETC).Внедрил инновации в области защиты электромобилей и организации транзакций.Это привело к широкому распространению Chainlink и стандартов оракулов TWAP.

Связанные условия

  • Умный договор: Самоисполняемые программы, развернутые в блокчейне, которые автоматически обеспечивают соблюдение условий соглашения. Технология реентрантности использует уязвимости в логике смарт-контрактов.
  • DAO: Децентрализованная автономная организация на платформе Ethereum, которая в 2016 году пострадала от самой известной атаки повторного входа (reentrancy attack), приведшей к хардфорку ETH/ETC.
  • Резервная функция: Специальная функция Solidity, которая выполняется при получении контрактом ETH или при вызове неизвестной функции. Механизм, посредством которого запускаются обратные вызовы реентерабельности.
  • Паттерн проверки-эффекты-взаимодействия: Безопасный шаблон кодирования, который предписывает выполнять все обновления состояния до внешних вызовов, предотвращая повторный вход в систему по своей сути.
  • OpenZeppelin: Ведущая библиотека смарт-контрактов с открытым исходным кодом, предоставляющая проверенные в реальных условиях средства обеспечения безопасности, включая ReentrancyGuard, используемые большинством основных протоколов DeFi.
  • Срочная ссуда: Необеспеченный заем, который необходимо взять и погасить в рамках одной транзакции. Часто используется в сочетании с повторным доступом или другими методами эксплуатации для достижения максимального эффекта.
  • Ethereum Classic (ETC): Продолжение оригинальной цепочки Ethereum, которая отказалась от форка после взлома DAO, сохранив цепочку, в которой эксплойт реентрантности остался неотмененным.
  • Формальная проверка: Математическое доказательство того, что смарт-контракт работает в соответствии со своей спецификацией. Может однозначно доказать отсутствие уязвимостей, связанных с повторным входом.
  • ЭРК-777: Усовершенствованный стандарт токенов со встроенными механизмами обратного вызова, который создал новые уязвимости для атак с использованием повторного входа в протоколы DeFi.
  • Мьютекс (взаимное исключение): Механизм управления параллельным доступом, адаптированный для смарт-контрактов в виде защитных механизмов от повторного входа, предотвращающих одновременное выполнение защищенных функций.
  • Вайпер: Язык смарт-контрактов, похожий на Python, для EVM. Ошибка компилятора Vyper привела к уязвимости повторного входа в Curve Finance 2023, несмотря на корректную защиту на уровне приложения.
  • MEV (максимальное извлекаемое значение): Ценность, которую производители блоков могут извлечь, переупорядочивая транзакции. Боты MEV иногда опережают уязвимости повторного входа, чтобы захватить или вернуть украденные средства.

FAQ

В: Что же такое атака с возвратом (reentrancy attack) простыми словами?

Атака повторного входа происходит, когда смарт-контракт отправляет деньги на внешний адрес до того, как будет зафиксирован факт отправки. Получателем может быть вредоносный контракт, который немедленно запрашивает дополнительные средства, и поскольку запись еще не обновлена, уязвимый контракт считает, что у злоумышленника все еще находится его первоначальный баланс. Это повторяется многократно, истощая средства контракта.

В: Как происходил взлом DAO и почему он был настолько значительным?

DAO представляла собой инвестиционный фонд в размере 150 миллионов долларов на платформе Ethereum. splitDAO Функция вывода средств отправляла ETH пользователям перед обновлением их баланса до нуля. Злоумышленник развернул вредоносный контракт, функция резервного копирования которого вызывала обратное действие. splitDAO Каждый раз, когда происходила операция получения ETH, система рекурсивно теряла около 60 миллионов долларов. Взлом был настолько масштабным, что сообщество Ethereum провело хардфорк всего блокчейна, чтобы обратить его вспять, разделив Ethereum на ETH и Ethereum Classic — определяющий момент в истории управления блокчейном.

В: Могут ли происходить атаки повторного входа в блокчейны, отличные от Ethereum?

Да. Реентрантность возможна в любом блокчейне, поддерживающем смарт-контракты с внешними вызовами, передающими управление исполнением. Это включает в себя EVM-совместимые цепочки, такие как BNB Chain, Polygon, Avalanche и Arbitrum. В цепочках, не поддерживающих EVM, таких как Solana, используются другие модели исполнения, которые затрудняют, но не делают невозможным традиционный реентрантизм. Среда выполнения Solana предотвращает рекурсивные вызовы CPI (межпрограммные вызовы) к одной и той же программе в рамках одной инструкции, но шаблоны, подобные межпрограммному реентрантизму, все еще могут возникать.

В: Что представляет собой модель «проверки-эффекты-взаимодействия», и как она предотвращает повторное возникновение проблем?

Паттерн "проверки-эффекты-взаимодействия" — это дисциплина программирования, требующая выполнения трех шагов в строгой последовательности: во-первых, проверка всех условий (например, достаточно ли у пользователя средств на балансе?); во-вторых, обновление всех переменных состояния (например, обнуление баланса пользователя); в-третьих, взаимодействие с внешними контрактами (например, отправка ETH). Обновление состояния перед внешним вызовом приведет к тому, что любой реентерабельный коллбэк столкнется с уже обновленным состоянием и не пройдет проверку, предотвращая тем самым эксплойт.

В: Что такое реентрантность только для чтения, и почему она опасна?

Реентрантность только для чтения возникает, когда функция обратного вызова во время внешнего обращения позволяет злоумышленнику считывать устаревшее состояние из функций представления. Даже если средства напрямую не выводятся из уязвимого контракта, другие протоколы, которые используют эти функции представления для ценообразования, расчета залога или данных оракула, получат некорректные значения. Это может быть использовано для получения кредитов с недостаточным обеспечением или манипулирования ценами в подключенных протоколах DeFi, что делает это тонким, но потенциально разрушительным вектором атаки.

В: Как произошла уязвимость в Curve Finance в 2023 году, несмотря на наличие защиты от повторного входа?

Финансовые пулы Curve Finance были созданы на языке Vyper и корректно использовали следующие функции: @nonreentrant Декоратор для предотвращения реентерабельности. Однако ошибка в версиях компилятора Vyper 0.2.15, 0.2.16 и 0.3.0 привела к некорректной компиляции блокировки реентерабельности — блокировка фактически никогда не устанавливалась во время выполнения, хотя в исходном коде она отображалась корректно. Это означало, что защита от реентерабельности существовала на бумаге, но была незаметно удалена во время компиляции. Эксплойт продемонстрировал, что безопасность смарт-контрактов зависит не только от корректного кода приложения, но и от корректности всей цепочки инструментов, включая компилятор.

В: Какие инструменты могут использовать разработчики для обнаружения уязвимостей реентерабельности до развертывания?

Разработчикам следует использовать многоуровневый подход: (1) инструменты статического анализа, такие как Slither и Mythril, которые автоматически сканируют код на наличие шаблонов реентерабельности, (2) фаззинг-тестирование с помощью Echidna или Foundry Forge, которые проверяют контракты со случайными входными данными, (3) формальная верификация с помощью таких инструментов, как Certora Prover, которые математически доказывают отсутствие реентерабельности, и (4) профессиональные аудиты безопасности от таких компаний, как Trail of Bits, OpenZeppelin или Halborn. Ни один инструмент не может выявить все варианты, поэтому необходима стратегия многоуровневой защиты.

Источники

Проверьте свои собственные цифры

Бесплатный калькулятор UEEx возвращает цену ликвидации, использование маржи и комиссии для любого размера позиции.

Еженедельный дайджест UEEx

Анализ рынка и предупреждения о ценных бумагах, которые читают 10 000 трейдеров.