Можливі проблеми безпеки з ERC777 і контрактами на довільні дзвінки

Нещодавно, працюючи з одним із наших клієнтів, ми виявили цікаву помилку, яка потенційно може стати вектором атаки для деяких проектів DeFi. Ця помилка особливо пов’язана з добре відомим стандартом токенів ERC777. Крім того, це не просто проблема повторного входу, поширена серед відомих хакерів.

Ця стаття містить вичерпне пояснення ERC777, охоплюючи всі необхідні деталі. Є кілька ресурсів, щоб заглибитися в специфіку токенів ERC777, і ця стаття є цінним детальним посібником для тих, хто хоче дізнатися більше про токени ERC777.

В останній частині статті буде пояснено наші нещодавні відкриття.

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

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

ERC777 і його хук

Що таке ERC777

ERC777 є одним із стандартів токенів із гаком передачі. Ось опис EIP: , а ось практика ERC777 [4] .

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

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

Нижче наведено список деяких токенів ERC777 з певною ліквідністю в основній мережі Ethereum:

Kp6OQ2xMxjKs5X4G5V33hmMqR8TSwawzldCaPOtL.png

Коли трапляється хук

Токени ERC20 просто оновлюють баланс під час переказів. Але токени ERC777 роблять це:

  1. Зробіть виклик Hook на адресу ініціатора маркера

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

  3. Зробіть виклик Hook на адресу одержувача маркера

Це добре показано на токені VRA:

вихідний код:

Тепер давайте розглянемо код для цих викликів:

як ви бачили:

  1. Ця функція читає контракт під назвою implementer з _ERC1820_REGISTRY
  2. Якщо функція знаходить реалізатор, цей реалізатор викликається.

Давайте вивчимо цей реєстр і побачимо, що таке розробники.

Реєстр і розробники

Усі токени ERC777 пов’язані з контрактом Реєстру:

Ця адреса використовується маркерами ERC777 для зберігання набору одержувачів Hook. Ці приймачі хуків називаються «реалізаторами інтерфейсу».

Це означає, що Аліса може обрати Боба своїм розробником інтерфейсу. Якщо Аліса отримує або надсилає токени ERC777, Боб отримає гачок.

Аліса може керувати різними типами гаків. Тому, коли Аліса надсилає маркери, вона може вибрати Боба як реалізатора інтерфейсу, і лише коли Аліса отримує маркери, вона вибирає Тома як реалізатора.

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

Ці параметри зберігаються в цьому відображеному реєстрі:

_interfaceHash — це ідентифікатор реалізатора інтерфейсу, який вибрала Аліса для події.

І кожен може прочитати реалізатор інтерфейсу Аліси за допомогою цієї функції:

Як бачите, це функція, яку ми зустрічали раніше в коді VRA.

Змінна _TOKENS_SENDER_INTERFACE_HASH використовується як _interfaceHash, який може бути будь-яким байтом. Але маркер VRA використовує ці байти для ідентифікації цього типу хука:

Отримати хук

Щоб налаштувати функцію отримання Hook, Алісі потрібно лише викликати цю функцію в реєстрі та ввести адресу Боба як параметр _implementer.

Вона також повинна вказати _interfaceHash. Вона отримає цей _TOKENS_SENDER_INTERFACE_HASH із коду маркера VRA.

Є ще одна важлива деталь.

Після налаштування реалізатора для VRA вище Аліса також знатиме, що навіть якщо інші маркери ERC777 будуть передані, Боб отримає виклик. Такі як imBTC [5] , imBTC має той самий _interfaceHash для надісланих токенів.

Це пов’язано з тим, що всі токени ERC777 мають спільний договір реєстру для зберігання налаштувань Hook. Але токени ERC777 можуть призначати імена своїм хукам, і хоча іноді вони схожі, не завжди.

Як знайти токени ERC777

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

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

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

Цей реєстр єдина можливість?

Теоретично ніхто не може гарантувати, що якийсь маркер випадково використовує цей контракт 0x1820 як реєстр. Але ми можемо використовувати dune.com [8] Приходьте перевірити.

він повертає ці адреси

0x1820a4b7618bde71dce8cdc73aab6c95905fad24 0xc0ce3461c92d95b4e1d3abeb5c9d378b1e418030 0x820c4597fc3e4193282576750ea4fcfe34ddf0a7

Ми перевірили, і 0x1820 є єдиним реєстром з цінними маркерами ERC777. Токени інших реєстрів не такі цінні.

Загальна ситуація маркерів, що підключаються

ERC777 - це не тільки стандарт із Hooks. Також ERC223, ERC995 або ERC667. Вони не такі вже й незвичайні. Ви, мабуть, чули про токен LINK, який реалізує ERC667 [9] .

Вектор атаки за допомогою довільного виклику

Це нещодавно виявлений вектор атаки для одного з наших клієнтів.

Дослідники зазвичай припускають, що токени ERC777 здійснюють дзвінки абонентам і отримувачам. Але насправді ініціатор і приймач можуть вибрати будь-якого «Боба» як приймача гака.

Тож уявіть, що станеться в поєднанні з тими контрактами, які здійснюють довільні дзвінки на будь-яку адресу з будь-якими даними?

Існують довільні функції виклику, які можна широко використовувати в агрегаторах DEX, гаманцях і контрактах на кілька викликів.

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

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

Він може викликати будь-який інший метод.

Метод атаки:

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

Якщо агрегатор DEX розрахує, що найкращий шлях конверсії проходить через торгову пару DEX із токенами ERC777, у нього можуть виникнути проблеми.

Захистити

Після годин обговорень із клієнтами ми знайшли рішення, яке не порушує довільні дзвінки.

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

Говорю з досвіду

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

У цьому сенсі проекти, які дозволяють довільні виклики, повинні бути особливо уважними та розглядати інший вектор атаки для ERC777.

Переглянути оригінал
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
  • Нагородити
  • Прокоментувати
  • Репост
  • Поділіться
Прокоментувати
0/400
Немає коментарів
  • Закріпити