Возможные проблемы безопасности с ERC777 и произвольными контрактами вызовов

Недавно, работая с одним из наших клиентов, мы обнаружили интересную ошибку, которая может стать вектором атаки для некоторых проектов DeFi. Эта ошибка особенно связана с известным стандартом токенов ERC777. Кроме того, это не просто проблема повторного входа, распространенная среди известных хакеров.

В этой статье представлено исчерпывающее объяснение ERC777, включая все необходимые детали. Существует несколько ресурсов для изучения особенностей токенов ERC777, и эта статья является ценным подробным руководством для всех, кто хочет узнать больше о токенах ERC777.

В последней части статьи будут объяснены наши недавние выводы.

Краткое описание вектора атаки

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

ERC777 и его хук

Что такое ERC777

ERC777 — один из стандартов токенов с переносным хуком. Вот описание EIP: , а вот практика ERC777 [4] 。

Основной мотивацией для внедрения токенов ERC777 является имитация поведения собственных передач токенов. Запуская смарт-контракты при получении токенов, разработчики могут выполнять определенную логику для расширения функциональности и создания более динамичных взаимодействий с токенами.

Однако эти дополнительные вызовы в процессе передачи отличают ERC777 от токенов ERC20. Эти хуки представляют собой новый вектор атаки, который может повлиять на смарт-контракты, не предназначенные для обработки дополнительных вызовов во время передачи токенов. Такое неожиданное поведение создает риски безопасности для этих контрактов.

Ниже приведен список некоторых токенов ERC777 с некоторой ликвидностью в основной сети Ethereum:

Kp6OQ2xMxjKs5X4G5V33hmMqR8TSwawzldCaPOtL.png

Когда происходит хук

Токены ERC20 просто обновляют баланс во время переводов. Но токены ERC777 делают это:

  1. Сделать вызов Hook на адрес инициатора токена

  2. Обновить баланс

  3. Вызовите хук на адрес получателя токена.

Это хорошо показано в токене VRA:

исходный код:

Теперь давайте рассмотрим код этих вызовов:

как вы видели:

  1. Эта функция считывает контракт под названием «реализатор» из _ERC1820_REGISTRY.
  2. Если функция находит исполнителя, вызывается этот исполнитель.

Давайте изучим этот реестр и посмотрим, что такое реализаторы.

Реестр и разработчики

Все токены ERC777 связаны с контрактом Реестра:

Этот адрес используется токенами ERC777 для хранения установленных получателей ловушек. Эти получатели ловушек называются «реализаторами интерфейса».

Это означает, что Алиса может выбрать Боба в качестве разработчика своего интерфейса. Если Алиса получает или отправляет токены ERC777, Боб получает хук.

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

В большинстве случаев она также может выбирать разных реализаторов интерфейса для разных токенов.

Эти настройки хранятся в этом сопоставленном реестре:

_interfaceHash — это идентификатор реализации интерфейса, выбранного Алисой для события.

И любой может прочитать реализацию интерфейса Алисы с помощью этой функции:

Как видите, это та самая функция, с которой мы столкнулись ранее в коде VRA.

Переменная _TOKENS_SENDER_INTERFACE_HASH используется как _interfaceHash, который может быть любым байтом. Но токен VRA использует эти байты для идентификации этого типа хука:

Получить хук

Чтобы настроить функцию приема ловушек, Алисе нужно только вызвать эту функцию в реестре и ввести адрес Боба в качестве параметра _implementer.

Она также должна указать _interfaceHash. Она получит этот _TOKENS_SENDER_INTERFACE_HASH из кода токена VRA.

Есть еще одна важная деталь.

После настройки средства реализации для VRA, описанного выше, Алиса также будет знать, что даже если будут переданы другие токены ERC777, вызов будет получен Бобом. Например, imBTC [5] , imBTC имеет одинаковый _interfaceHash на отправленных токенах.

Это связано с тем, что все токены ERC777 используют один и тот же контракт реестра для хранения настроек хуков. Но токены ERC777 могут присваивать имена своим хукам, и хотя иногда они похожи, но не всегда.

Как найти токены ERC777

Вызов реестра является функцией всех ERC777. Так что мы можем попробовать dune.com [6] для вызова всех смарт-контрактов, которые вызывают реестр.

Мы можем использовать этот скрипт SQL. На самом деле, мы должны были дополнительно отфильтровать адреса токенов, но, по крайней мере, мы отлично начали и в итоге получили 78 адресов.

Примечание переводчика: таблица следов дюн [7] Запишет внутреннюю запись вызова транзакции.

Является ли этот реестр единственной возможностью?

Теоретически никто не может гарантировать, что какой-то токен использует этот контракт 0x1820 в качестве реестра. Но мы можем использовать dune.com [8] Приходите проверить.

он возвращает эти адреса

0x1820a4b7618bde71dce8cdc73aab6c95905fad24 0xc0ce3461c92d95b4e1d3abeb5c9d378b1e418030 0x820c4597fc3e4193282576750ea4fcfe34ddf0a7

Мы проверили, и 0x1820 — единственный реестр с ценными токенами ERC777. Токены других реестров не так ценны.

Общая ситуация с токенами Hookable

ERC777 — это не только стандарт с хуками. Также ERC223, ERC995 или ERC667. Они не такие уж необычные. Вы, должно быть, слышали о токене LINK, реализующем ERC667. [9] 。

Вектор атаки с использованием произвольного вызова

Это недавно обнаруженный вектор атаки одного из наших клиентов.

Исследователи обычно предполагают, что токены ERC777 совершают звонки вызывающим и получателям. Но на самом деле инициатор и получатель могут выбрать любого «Боба» в качестве получателя крюка.

Итак, представьте, что произойдет, если объединить эти контракты, которые делают произвольные вызовы на любой адрес с любыми данными?

Существуют произвольные функции вызова, которые можно широко использовать в агрегаторах DEX, кошельках и контрактах с несколькими вызовами.

Примечание переводчика: Функция произвольного вызова означает, что в контракте есть такая функция:

функция ute(целевой адрес, значение uint, сигнатура строковой памяти, байты данных памяти, uint eta) общедоступная оплата;

Он может вызывать любой другой метод.

Метод атаки:

  1. Злоумышленник находит целевой контракт (Target), допускающий произвольные вызовы функций
  2. Злоумышленник вызывает цель:
  3. registy1820.setInterfaceImplementer(Target, hookHash, Attacker)
  4. Теперь наш Атакующий является реализатором Target
  5. Злоумышленник будет вызываться с помощью hookHash, используемого в токене ERC777.
  6. Всякий раз, когда целевой контракт (Target) получает токены ERC777, злоумышленник получает вызов Hook.
  7. Следующие атаки различаются в зависимости от целевого кода:
  • Злоумышленник может повторно войти, когда некоторые пользователи выполняют функции в целевом контракте
  • Злоумышленник может откатиться напрямую, так что транзакция пользователя будет восстановлена напрямую

Если агрегатор DEX посчитает, что лучший путь конвертации — через торговую пару DEX с токенами ERC777, то могут возникнуть проблемы.

Защищать

После нескольких часов обсуждений с клиентами мы нашли решение, которое не прерывает произвольные вызовы.

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

Исходя из опыта

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

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

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