Блог

Автоматический перевод · Читать на английском

Модуль SSO 2 — Уязвимости смарт-контрактов: глубокое погружение в атаки повторного входа

Смарт-контракты обеспечивают прозрачность, но несут риски. В этой статье раскрываются такие уязвимости, как повторный вход, на примере потери DAO в $150 млн. Целочисленное переполнение привело к потере BeautyChain в $900 млн. DAOMaker потерял $4 млн из-за ошибок контроля доступа. Атаки с флеш-кредитами привели к потере Harves Finance в $38 млн.

Автор Markos Mebellis

Модуль SSO 2 — Уязвимости смарт-контрактов: глубокое погружение в атаки повторного входа
На этой странице

Смарт-контракты революционизируют мировые отрасли благодаря эффективности, прозрачности и неизменяемости. Однако их открытый и автоматизированный дизайн также подвергает их рискам. Чтобы максимально раскрыть их потенциал и минимизировать угрозы, важно понимать их уязвимости и возможные пути атак. Создание и поддержка этих контрактов требуют внимания и соблюдения лучших практик. В этой статье рассматриваются распространённые уязвимости с примерами из реального мира для лучшего понимания. Давайте посмотрим следующую статью, предоставленную Salus Security.

Ключевые уязвимости:

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

Повторный вход в одну функцию: Это происходит, когда контракт взаимодействует с вредоносным контрактом, позволяя последнему повторно войти в функцию. Например, вредоносные контракты могут непрерывно повторно входить в функцию 'withdrawBalance', выводя больше эфира до обновления балансов.

Известные атаки:

  • The DAO (2016): После привлечения $150 млн он был взломан из-за уязвимостей в коде. Это привело к расколу сети Ethereum.
  • PolyDex (2021): Потерял $500 тыс. из-за атаки повторного входа на смарт-контракт PLX Locker.
  • Bacon Protocol (2022): Потерпел убыток в $1 млн из-за ошибки повторного входа в функции lend().
  • Lendf.Me (2020): Потерял примерно $24,7 млн в нескольких криптовалютах.

**Повторный вход между функциями:** Возникает из-за общих состояний между разными функциями и слабой защиты от повторного входа. Пример с 'balances' выше показывает, что несмотря на защиту 'withdrawAll', злоумышленники всё ещё могут использовать функцию 'transfer'.

Печально известные инциденты:

  • DFX Finance (2022): Потерял более $7 млн из-за атаки, использующей функцию без защиты от повторного входа.
  • Hundred Finance (2022): Потерял около $6,5 млн после атаки повторного входа, использующей функцию borrowFresh.
  • Fei Protocol (2022): Потерял около $80 млн из-за атаки, использующей лазейку повторного входа.

**Повторный вход между контрактами:** Является результатом общих состояний между разными контрактами и неправильной последовательности изменения переменных. Даже если функции имеют защиту, другие функции, такие как 'burnAccount', всё ещё могут быть использованы.

Известные атаки:

  • Rari Capital (2021): Потерял примерно $10 млн (~2600 ETH) менее чем за час.
  • ValueDefi (2021): Потерял 5345.314 WBNB из-за неверных расчётов долей, которые полагались на внешние данные.

Повторный вход только для чтения:

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

Примечательные атаки:

  • QuickSwap (2022): Злоумышленники неправомерно использовали флеш-кредит для изменения спотовой цены актива, похитив 138 ETH и 700 токенов MATIC. Это стало возможным из-за ошибки в оракуле Curve LP.
  • dForce (2023): Ошибка повторного входа только для чтения была в коде, обращающемся к оракулам цен в сетях Arbitrum и Optimism с Curve Finance.
  • Sentimente (2023): Атака, использующая ошибку повторного входа только для чтения, привела к краже $1 млн. К счастью, 90% было возвращено злоумышленником.
  • Sturdy (2023): Потерял примерно 442 ETH из-за проблемы повторного входа только для чтения в Balancer, где цена B-stETH-STABLE была подделана.

Предотвращение уязвимости повторного входа:

  1. Всегда соблюдайте шаблон проверка-эффект-взаимодействие.
  2. Применяйте защиту от повторного входа для всех чувствительных операций.
  3. Тщательно обрабатывайте каждый внешний вызов.

Целочисленное переполнение:

Когда вычисления превышают пределы, происходит переполнение, часто приводящее либо к крошечным, либо к огромным значениям.

Иллюстративные атаки:

  • BeautyChain (2018): Злоумышленники получили 10^58 BEC через целочисленное переполнение, сбыв ошеломляющие $900 млн.
  • Poolz (2023): Привело к потере примерно $665 000 в сетях Ethereum, Binance и Polygon.

Меры против целочисленного переполнения:

  1. Используйте безопасные методы вычислений, такие как библиотека safeMath.
  2. Уделяйте приоритет проверке границ, чтобы результаты оставались в допустимом диапазоне.
  3. Используйте компилятор Solidity версии 0.8.0 или новее для встроенного обнаружения переполнения.

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

  • Известные атаки:
  • DAOMaker (2021): Огромные ~$4 млн были выведены после того, как init функция осталась уязвимой.
  • GymNetwork (2022): Злоумышленники использовали ошибку аутентификации в depositFromOtherContract(), что позволило незаконно увеличить баланс без каких-либо фактических платежей. Потери? Около 2 475,91 WBNB.
  • Tempdao (2023): Небрежный подход к контролю доступа для функции migrateStake привёл к потере более $2,34 млн.

Уязвимость контроля доступа

  • Описание: Уязвимости, возникающие из-за недостаточных механизмов ограничения, регулирующих доступ и привилегии к определённым операциям в системе.

Меры предотвращения:

  1. Строгая проверка разрешений: Всегда применяйте строгие протоколы разрешений для функций, особенно тех, которые выполняют чувствительные операции.
  2. Механизм мультиподписи: Для задач, требующих совместного принятия решений, используйте протоколы мультиподписи, требующие нескольких одобрений перед выполнением чувствительных операций.

Распространённые векторы атак

  • Описание: Различные методы или каналы, с помощью которых злоумышленники эксплуатируют уязвимости в системе, прежде всего в смарт-контрактах.

Известные примеры:

  • Атаки с флеш-кредитами: Использует функцию мгновенного заимствования в системах децентрализованных финансов для осуществления вредоносных действий.
  • Фронтраннинг: Злоумышленники узнают о предстоящей транзакции другого пользователя и действуют на её основе, предлагая более высокую плату за газ.

Атака с флеш-кредитом

  • Описание: Хотя FlashLoan сам по себе не является атакой, это функция DeFi, позволяющая пользователям мгновенно брать крупные суммы без залога. Её эксплуатировали из-за логических ошибок во взаимодействиях и связях контрактов.

Известные атаки:

  1. Harves Finance (26.10.2020): Привело к потере $38 млн.
  2. InverseFinance (16.6.2022): Привело к потере 53.2445 WBTC и 99,976.29 USDT.
  3. NewFreeDAO (8.9.2022): Слито 4 481 WBNB, что эквивалентно примерно $1,25 млн.
  4. Lodestar (2022.12.11): Эксплуатация через манипуляцию ценой оракула.
  5. 0vix (2023.4.28): Привело к потере $2 млн в сети Polygon.

Рекомендации по предотвращению:

  1. Учитывайте особенности Flashloan при разработке проекта.
  2. Для точного определения цены используйте средневзвешенное по времени значение или несколько оракулов.

Опережение

  • Описание: Злоумышленник узнаёт о транзакции другого пользователя из мемпула и использует это, предлагая более высокую комиссию за газ.

Известные атаки:

  1. Sushi Badger Digg (25.01.2021): Привело к потере 81,68 ETH.
  2. Пул Sushiswap Ape-ETH (17.05.2022): Злоумышленник получил прибыль около 0,3 ETH.
  3. Uniswap (2023.4.2): Потеря около 25 миллионов долларов в результате сэндвич-атаки.

Рекомендации по предотвращению:

  1. Используйте защиту от проскальзывания при торговле.
  2. Совершайте сделки в непиковые часы, особенно на волатильных рынках.
  3. Используйте FlashBot rpc от 1inch для отправки сделок напрямую майнерам, минуя memPool.

Итоги

Поздравляем! Вы завершили Модуль 2 — Уязвимости смарт-контрактов: глубокое погружение в атаки повторного входа и распространённые эксплойты

Давайте повторим изученное:

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

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

Integer Overflow - Вычисления, превышающие установленные лимиты, что приводит к экстремальным значениям.

Уязвимости контроля доступа - Возникают из-за отсутствия строгих ограничений доступа к важным функциям.

Распространённые векторы атак - Методы, с помощью которых злоумышленники эксплуатируют уязвимости системы.

**FlashLoan Attack **- Функция DeFi, позволяющая мгновенно брать крупные займы без залога, но эксплуатируемая из-за логических ошибок.

Атака опережения (Front-running)- Злоумышленники узнают о ожидающих транзакциях и извлекают выгоду, предлагая более высокую плату за газ.

Эта статья предоставлена вам:

Резюме — иллюстрация