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

На этой странице
Смарт-контракты революционизируют мировые отрасли благодаря эффективности, прозрачности и неизменяемости. Однако их открытый и автоматизированный дизайн также подвергает их рискам. Чтобы максимально раскрыть их потенциал и минимизировать угрозы, важно понимать их уязвимости и возможные пути атак. Создание и поддержка этих контрактов требуют внимания и соблюдения лучших практик. В этой статье рассматриваются распространённые уязвимости с примерами из реального мира для лучшего понимания. Давайте посмотрим следующую статью, предоставленную 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 была подделана.
Предотвращение уязвимости повторного входа:
- Всегда соблюдайте шаблон проверка-эффект-взаимодействие.
- Применяйте защиту от повторного входа для всех чувствительных операций.
- Тщательно обрабатывайте каждый внешний вызов.
Целочисленное переполнение:
Когда вычисления превышают пределы, происходит переполнение, часто приводящее либо к крошечным, либо к огромным значениям.
Иллюстративные атаки:
- BeautyChain (2018): Злоумышленники получили 10^58 BEC через целочисленное переполнение, сбыв ошеломляющие $900 млн.
- Poolz (2023): Привело к потере примерно $665 000 в сетях Ethereum, Binance и Polygon.
Меры против целочисленного переполнения:
- Используйте безопасные методы вычислений, такие как библиотека safeMath.
- Уделяйте приоритет проверке границ, чтобы результаты оставались в допустимом диапазоне.
- Используйте компилятор Solidity версии 0.8.0 или новее для встроенного обнаружения переполнения.
Контроль доступа:
Уязвимости контроля доступа возникают из-за отсутствия строгих ограничений доступа к функциям, выполняющим критически важные операции.
- Известные атаки:
- DAOMaker (2021): Огромные ~$4 млн были выведены после того, как
initфункция осталась уязвимой. - GymNetwork (2022): Злоумышленники использовали ошибку аутентификации в depositFromOtherContract(), что позволило незаконно увеличить баланс без каких-либо фактических платежей. Потери? Около 2 475,91 WBNB.
- Tempdao (2023): Небрежный подход к контролю доступа для функции migrateStake привёл к потере более $2,34 млн.
Уязвимость контроля доступа
- Описание: Уязвимости, возникающие из-за недостаточных механизмов ограничения, регулирующих доступ и привилегии к определённым операциям в системе.
Меры предотвращения:
- Строгая проверка разрешений: Всегда применяйте строгие протоколы разрешений для функций, особенно тех, которые выполняют чувствительные операции.
- Механизм мультиподписи: Для задач, требующих совместного принятия решений, используйте протоколы мультиподписи, требующие нескольких одобрений перед выполнением чувствительных операций.
Распространённые векторы атак
- Описание: Различные методы или каналы, с помощью которых злоумышленники эксплуатируют уязвимости в системе, прежде всего в смарт-контрактах.
Известные примеры:
- Атаки с флеш-кредитами: Использует функцию мгновенного заимствования в системах децентрализованных финансов для осуществления вредоносных действий.
- Фронтраннинг: Злоумышленники узнают о предстоящей транзакции другого пользователя и действуют на её основе, предлагая более высокую плату за газ.
Атака с флеш-кредитом
- Описание: Хотя FlashLoan сам по себе не является атакой, это функция DeFi, позволяющая пользователям мгновенно брать крупные суммы без залога. Её эксплуатировали из-за логических ошибок во взаимодействиях и связях контрактов.
Известные атаки:
- Harves Finance (26.10.2020): Привело к потере $38 млн.
- InverseFinance (16.6.2022): Привело к потере 53.2445 WBTC и 99,976.29 USDT.
- NewFreeDAO (8.9.2022): Слито 4 481 WBNB, что эквивалентно примерно $1,25 млн.
- Lodestar (2022.12.11): Эксплуатация через манипуляцию ценой оракула.
- 0vix (2023.4.28): Привело к потере $2 млн в сети Polygon.
Рекомендации по предотвращению:
- Учитывайте особенности Flashloan при разработке проекта.
- Для точного определения цены используйте средневзвешенное по времени значение или несколько оракулов.
Опережение
- Описание: Злоумышленник узнаёт о транзакции другого пользователя из мемпула и использует это, предлагая более высокую комиссию за газ.
Известные атаки:
- Sushi Badger Digg (25.01.2021): Привело к потере 81,68 ETH.
- Пул Sushiswap Ape-ETH (17.05.2022): Злоумышленник получил прибыль около 0,3 ETH.
- Uniswap (2023.4.2): Потеря около 25 миллионов долларов в результате сэндвич-атаки.
Рекомендации по предотвращению:
- Используйте защиту от проскальзывания при торговле.
- Совершайте сделки в непиковые часы, особенно на волатильных рынках.
- Используйте FlashBot rpc от 1inch для отправки сделок напрямую майнерам, минуя memPool.
Итоги
Поздравляем! Вы завершили Модуль 2 — Уязвимости смарт-контрактов: глубокое погружение в атаки повторного входа и распространённые эксплойты
Давайте повторим изученное:
Уязвимости повторного входа - Злоумышленники используют пробелы, повторно входя в функции до их полного завершения.
- Повторный вход в одну функцию: Вредоносный контракт повторно входит в функцию другого контракта.
- Межфункциональный повторный вход: Общие состояния между разными функциями эксплуатируются из-за слабой защиты от повторного входа.
- Межконтрактный повторный вход: Использует общие состояния между разными контрактами.
- Read-Only Reentrancy: Использует функцию, выдающую ошибочные результаты при несогласованном состоянии.
Integer Overflow - Вычисления, превышающие установленные лимиты, что приводит к экстремальным значениям.
Уязвимости контроля доступа - Возникают из-за отсутствия строгих ограничений доступа к важным функциям.
Распространённые векторы атак - Методы, с помощью которых злоумышленники эксплуатируют уязвимости системы.
**FlashLoan Attack **- Функция DeFi, позволяющая мгновенно брать крупные займы без залога, но эксплуатируемая из-за логических ошибок.
Атака опережения (Front-running)- Злоумышленники узнают о ожидающих транзакциях и извлекают выгоду, предлагая более высокую плату за газ.
Эта статья предоставлена вам:
