Потенциальные уязвимости в смарт-контрактах
Несмотря на то, что смарт-контракты являются новаторскими, они не застрахованы от недостатков, которыми могут воспользоваться злонамеренные стороны.
Неадекватная проверка входных данных — распространенная слабость, которая позволяет злоумышленникам влиять на выполнение контракта, предоставляя неожиданные входные данные. Более того, неправильное применение бизнес-логики может привести к появлению уязвимостей из-за неожиданного поведения или логических пробелов в контракте. Более того, при неправильной обработке небезопасные внешние вызовы, например, связанные с интерфейсами с внешними источниками данных или другими контрактами, могут создавать уязвимости.
Атаки повторного входа — это слабые места, которые возникают, когда контракт вызывает другой контракт извне, прежде чем завершить свои собственные изменения состояния. Это позволяет вызываемому контракту повторно войти в вызывающий контракт и, возможно, снова выполнить некоторые из его операций. Это может привести к непредвиденным действиям и позволить злоумышленникам изменить состояние контракта, тем самым истощая средства или вызывая другие негативные последствия.
Учитывая возможность таких атак, разработчикам также следует проявлять осторожность при работе с внешними контрактами или источниками данных, гарантируя правильную обработку внешних вызовов во избежание непредвиденного поведения и уязвимостей. Они могут помочь в защите смарт-контрактов от развивающихся угроз, уделяя пристальное внимание процедурам безопасности, таким как тестирование смарт-контрактов.
Что такое повторные атаки в смарт-контрактах?
В смарт-контрактах атаки повторного входа происходят, когда контракт вызывает другой контракт или функцию извне, прежде чем завершить изменение собственного состояния.
Это позволяет вызываемому контракту повторно войти в вызывающий контракт и, возможно, снова выполнить части своих операций, что может привести к непредвиденному и зачастую злонамеренному поведению. Например, ситуация, когда контракт A вызывает контракт B для отправки средств, а затем изменяет свое собственное состояние.
Код контракта B может содержать функцию обратного вызова, которая позволяет ему повторно войти в контракт A и, возможно, повторно выполнить передаточную функцию до того, как контракт A завершит изменения своего состояния. Это позволит злоумышленнику несколько раз получить деньги из контракта А, прежде чем завершить первоначальную транзакцию.
Еще одним известным примером является печально известный взлом децентрализованной автономной организации (DAO) на блокчейне Ethereum в 2016 году. Злоумышленник рекурсивно удалил средства из DAO, воспользовавшись недостатком повторного входа в коде смарт-контракта, что в конечном итоге привело к краже эфира (ETH) на миллионы долларов.
Более того, несколько протоколов децентрализованного финансирования (DeFi), включая Uniswap, Lendf.Me, BurgerSwap, SURGEBNB, Cream Finance и Siren Protocol, понесли значительные финансовые потери из-за эксплойтов повторного входа. Эти нарушения привели к потерям от 3,5 до 25 миллионов долларов, что подчеркивает постоянную угрозу, которую представляют уязвимости повторного входа в пространстве DeFi.
Как работают повторные атаки
Атаки с повторным входом используют последовательное выполнение функций смарт-контракта вместе с внешними вызовами для формирования цикла, в котором злоумышленники могут выполнять определенные функции несколько раз до их завершения, что может привести к вредоносному поведению и несанкционированному выводу средств.
Прежде чем жертва завершит изменение своего состояния, контракт злоумышленника эффективно «обманывает» контракт жертвы, заставляя его вернуться к контракту злоумышленника. Это действие может привести к повторяющемуся снятию средств или другому небрежному поведению.
На изображении выше показана повторная атака на смарт-контракт. Контракт злоумышленника вызывает функцию «withdraw()» жертвы, которая отправляет эфир перед обновлением баланса. Затем срабатывает резервная функция злоумышленника, который снова рекурсивно вызывает метод вывода() для вывода средств из контракта жертвы. Эта атака использует неспособность жертвы обновить баланс перед отправкой средств.
Давайте разберем, как работают повторные атаки, на упрощенном примере:
Смарт-контракт с функцией «вывода»
Предположим, что существует смарт-контракт цифрового кошелька, который позволяет пользователям выводить средства. Помимо отслеживания балансов пользователей, этот контракт имеет функцию вывода средств, которая облегчает вывод средств. Функция вывода обычно позволяет пользователям выводить свои токены или эфир из смарт-контракта в свой личный кошелек.
Взаимодействие с пользователем и выполнение функций
Пользователь самостоятельно запрашивает вывод средств со своего кошелька. Они используют функцию вывода средств, чтобы ввести желаемую сумму вывода.
Функция вывода средств проверяет, достаточно ли у пользователя денег для вывода средств при ее вызове. Он переводит необходимые средства на выбранный пользователем адрес, если требования удовлетворены.
Внешний вызов
Вот здесь-то и проявляется слабость. Прежде чем вывод средств отразится на балансе пользователя, контракт осуществляет внешний вызов другого контракта или аккаунта.
Рекурсивный вызов
Если код внешнего контракта включает функцию, которая может снова вызвать исходный контракт (например, другую функцию вывода), то создается рекурсивный цикл. Это позволяет снова вызвать метод вывода до его завершения.
Реентерабельность эксплуатации
Затем злоумышленник использует вредоносный контракт, чтобы воспользоваться этим циклом. Контракт злоумышленника быстро вызывает функцию вывода средств кошелька еще раз перед обновлением баланса во время вызова контрактом кошелька внешнего контракта.
Резервная функция
В определенных ситуациях злоумышленник может использовать резервную функцию смарт-контракта — уникальную функцию, которая срабатывает, когда контракт получает вызов без каких-либо данных или эфира. Атаки повторного входа могут осуществляться путем многократного вызова резервной функции во время обработки средств.
Государственное манипулирование и неоднократный вывод средств
Контракт злоумышленника может неоднократно использовать функцию вывода средств в рамках одной и той же транзакции, поскольку контракт кошелька задерживает обновление баланса до получения внешних вызовов. В результате это упрощает вывод средств без разрешения, что позволяет злоумышленнику украсть больше, чем он имеет право по закону. Впоследствии это наносит существенные финансовые потери пользователям контракта кошелька.
Последствия повторных атак
Атаки с повторным входом имеют серьезные последствия для пользователей смарт-контрактов, поскольку они могут привести к значительным финансовым потерям.
Одним из наиболее непосредственных последствий повторной атаки является несанкционированное снятие или манипулирование денежными средствами, хранящимися в уязвимом смарт-контракте. Злоумышленники используют уязвимость для неоднократного вывода средств из контракта, истощая его баланс и потенциально вызывая значительные финансовые потери для пользователей, которые инвестировали или хранили активы в затронутом контракте.
Кроме того, вера пользователей в безопасность и целостность смарт-контрактов и технологии блокчейна в целом может быть ослаблена повторными атаками. Уязвимости повторного входа могут иметь катастрофические последствия, о чем свидетельствуют громкие события, такие как взлом DAO в 2016 году на блокчейне Ethereum, который повлек за собой огромные финансовые потери и нанес ущерб репутации сообщества.
Помимо краткосрочных финансовых последствий, повторные атаки могут иметь долгосрочные последствия, такие как внимание регулирующих и юридических органов, снижение доверия инвесторов и вред репутации блокчейн-платформ и проектов. Восприятие уязвимости к атакам может заставить пользователей проявлять осторожность при взаимодействии со смарт-контрактами или инвестировании в децентрализованные приложения (DApps), тем самым препятствуя внедрению и расширению технологии блокчейна.
Как смягчить атаки повторного входа
Внедрение лучших практик создания и аудита смарт-контрактов необходимо для смягчения угроз повторного входа.
Это включает в себя использование известных библиотек кода с хорошей репутацией в области безопасности, что является одним из способов добиться этого. Эти библиотеки прошли тщательное тестирование и экспертную оценку, что снижает вероятность появления уязвимостей.
Разработчикам также следует использовать проверки безопасности, такие как конструкция «проверки-эффекты-взаимодействие», которая сводит к минимуму вероятность повторных атак, гарантируя, что изменения состояния происходят атомарно. Дополнительную линию защиты от таких уязвимостей можно добавить, используя устойчивые к повторному входу среды разработки смарт-контрактов, если они доступны.
Разработчикам с меньшей вероятностью придется вручную добавлять средства защиты, поскольку эти платформы часто включают встроенные методы и меры безопасности, специально предназначенные для предотвращения повторных атак. Однако, поскольку безопасность блокчейна все еще развивается, разработчики должны продолжать искать новые угрозы и слабые места.