Риски DeFi: почему пользователи протоколов теряют деньги?
4 февраля хакер заработал $2.8 млн на атаке хранилища DeFi-проекта yEarn.Finance, а сам проект в общей сложности лишился активов на $11 млн. Преступник воспользовался уязвимостью в протоколе проекта, которая позволила ему манипулировать ценами монет, хранящихся в yEarn.Finance. И это не уникальный случай — в прошлом году из-за похожих уязвимостей различных DeFi-протоколов хакеры вывели в общей сложности со всех платформ свыше $120 млн. Разобрались, какими уязвимостями DeFi-протоколов пользуются мошенники и что предпринимают команды проектов для решения этой проблемы.
Как yEarn.Finance потерял $11 млн
4 февраля хакер вывел $2.8 млн из пула v1 yDAI проекта yEarn.Finance, воспользовавшись уязвимостью его протокола. А в общей сложности пул лишился активов на $11 млн.
yEarn.Finance — это агрегатор доходности и поставщик ликвидности для кредитных платформ в DeFi. Пользователи проекта вносят свои средства в коллективные пулы, которые также выступают в роли хранилища их активов. Затем монеты пользователей yEarn.Finance предоставляются другим DeFi-проектам для обеспечения ликвидности. Взамен они получают вознаграждение, зарабатывая более 20% годовых. По данным DeFi Pulse, в контрактах yEarn.Finance заблокированы активы на сумму чуть более $493 млн.
В день взлома разработчики yEarn.Finance опубликовали подробный отчет о случившимся инциденте. Разберем его шаг за шагом:
1. Хакер воспользовался мгновенными кредитами (флэш-кредиты, flash loans), которые не требуют залога, если возвращаются в рамках одной сделки. Таким образом он занял у кредитных протоколов dYdX и Aave по 116 000 ЕТН и 99 000 ЕТН на сумму в $342 млн.
2. Используя полученные эфиры в качестве нового залога, он занял еще 134 млн в стейблкоинах Tether (USDT) и 129 млн в долларовом стейблкоине DAI через кредитный протокол Compound Finance.
3. Хакер добавил 134 млн в стейблкоине USDC и 36 млн в DAI в пул Curve 3pool, некоторая часть которых была также конвертирована в токен пула 3CRV*.
*Curve 3pool — пул, который позволяет пользователям держать различные стейблкоины, включая DAI, USDT и USDC, и легко обменивать их друг на друга. А нативный токен пула 3CRV основывается на этих трех стейблкоинах и представляет собой акцию пула.
4. Затем он вывел 165 млн USDT из пула Curve 3pool. В результате в пуле создался дисбаланс из-за резкого снижения числа монет USDT в соотношении с USDC и DAI. Как итог — стоимость USDC и DAI упала.
5. После этого хакер несколько раз депонировал заемные активы в хранилище yEarn.Finance, постепенно снижая сумму ввода.
Вот как это выглядело на первом круге:
- Хакер внес 93 млн DAI в хранилище v1 yDAI. В результате хранилище yEarn.Finance внесло обратно в пул Curve 3pool депозит в DAI по более низкой цене, чтобы закрыть дисбаланс.
- Затем хакер снова добавил 165 млн USDT в пул Curve 3pool.
- После чего он вывел 92.3 млн DAI из хранилища v1 yDAI, а 0.7 млн DAI остались в пуле Curve 3pool.
- Затем хакер вывел 165 млн USDT из пула Curve 3pool, что снова привело к дисбалансу в отношении USDC и DAI.
Таким образом злоумышленник вносил и выводил 165 млн USDT в Curve 3pool, чтобы манипулировать стоимостью DAI в пуле. Эксплойт был нацелен на то, чтобы получать выгоду путем обмена заработанных токенов поставщика ликвидности на стабильные монеты USDT. Другими словами, каждый раз, когда хакер повторял свои действия, он получал все больше токенов DAI, которые позже конвертировались в USDT.
5. После того как описанная выше схема была проведена несколько раз подряд, преступник вместо 165 млн USDT вывел 39.4 млн DAI и 134 млн USDС и закрыл свои кредиты на платформах кредитования Compound Finance, dYdX и Aave.
Атака длилась 38 минут и дорого обошлась злоумышленнику. Его итоговая прибыль составила около $2.8 млн — у хакера осталось 513 000 в DAI, 1.7 млн в USDT и 506 000 в токенах пула 3CRV. Остальные $8.2 млн ушли на комиссии и вознаграждение стейкерам пулов.
В свою очередь команде yEarn.Finance понадобилось 11 минут, чтобы остановить действия преступника. Это позволило им сохранить 24 млн из 35 млн DAI, хранящихся в пуле. А на следующий день, 5 февраля, они исправили уязвимость протокола, которая сделала эту атаку возможной. Тогда же технический директор Tether Паоло Ардуино в своем Twitter сообщил, что компания заморозила 1.7 млн USDT, украденных в ходе атаки.
Как хакеры используют мгновенные кредиты
Случай с yEarn.Finance далеко не единственный, когда злоумышленники смогли воспользоваться мгновенными кредитами для реализации атаки.
По данным Ciphertrace, за первые 10 месяцев прошлого года хакеры вывели из DeFi около $100 млн. Примерно в половине случаев для этого они использовали мгновенные кредиты.
По более поздним данным Block Research, в 2020 году было совершено 15 крупных взломов DeFi-протоколов на общую сумму $120 млн — хакеры смогли вывести за каждую атаку от $135 000 до $ 25 млн. Из них удалось вернуть $45.6 млн.
Как работают мгновенные кредиты? Они позволяют занимать средства без залога и использовать кредитное плечо, не рискуя своими собственными активами. Гарантия возврата средств в том, что кредит возвращается в рамках той же сделки, в которой они были получены. Если этого не происходит, то вся сделка отменяется, а кредит возвращается предоставившей его стороне.
Обычные пользователи используют мгновенные кредиты для арбитража — заработка на разнице цен на разных площадках. С помощью такого кредита трейдер покупает монеты дешевле на одной бирже и продает дороже на другой, гасит кредит, а прибыль оставляет себе. Все это происходит в рамках одной сделки в смарт-контракте. Рисков нет — если кредит нечем гасить, контракт просто отменит транзакцию.
С помощью мгновенных кредитов злоумышленники могут финансировать свои атаки на DeFi-протоколы. При этом они берут на себя мало рисков — если атака по какой-либо причине потерпит неудачу, транзакция возвращается, а это означает, что злоумышленник ничего не теряет, кроме затрат на комиссии. А потенциальная прибыль, наоборот — весьма значительна. Без мгновенных кредитов хакерам пришлось бы рисковать собственным капиталом на огромные суммы.
Подчеркнем, что мгновенные кредиты — просто инструмент, с помощью которого злоумышленники используют уязвимости в смарт-контрактах DeFi-протоколов. Если бы смарт-контракты были построены более надежно, атаки с помощью мгновенных кредитов были бы невозможны.
Атака на ценовой блокчейн-оракул
Чаще всего хакеры используют мгновенные кредиты для финансирования атаки на централизованный ценовой оракул.
Как это работает? Ценовой блокчейн-оракул — это сторонний сервис, который собирает внешние данные за пределами блокчейна, необходимые для проведения транзакций. Чаще всего речь идет о ценах монет — оракулы собирают данные о стоимости коинов с разных бирж и сообщают их смарт-контрактам. Это нужно, чтобы верно рассчитать размер обеспечения кредита.
Если в алгоритме DeFi-протокола есть уязвимость, хакер может обмануть оракул и использующий его смарт-контракт, манипулируя ценами активов и выкачивая средства из контрактов.
В общих чертах схема работает так:
- Злоумышленники мгновенно заимствуют, обменивают, депонируют и снова заимствуют большое количество токенов. Это позволяет им занимать суммы, многократно превышающие стоимость первоначального залога.
- Если у оракула есть уязвимость, он воспримет это как резкое повышение цены выбранного токена на одной бирже.
- Если оракул использует ценовые данные лишь с одной биржи, он сочтет эти изменения истинными и станет доступным для манипуляции — он может разрешить продажу или покупку активов по цене выше или ниже рыночной.
Вот несколько примеров атак с манипуляцией ценовым оракулом DeFi-протоколов в 2020 году:
- Февраль: хакер за две атаки вывел $1 млн из протокола bZx;
- Октябрь: хакер вывел $24 млн из Harvest Finance;
- Ноябрь: хакеры вывели $7.4 млн из Value DeFi и $3.3 млн из Cheese Bank;
- Декабрь: хакер вывел $7.7 млн из Warp Finance.
Рассмотрим, как это работает, на примере взлома Harvest Finance. Если опустить технические детали, хакер манипулировал ценами стейблкоинов. Он обменивал много USDC на USDT, что обеспечивало последнему рост цены внутри пула, и выводил средства на Harvest Finance. После этого все повторялось в обратную сторону — USDT обменивался на USDC, но уже по стандартной (сниженной) цене USDT. В результате с каждым разом хакер выводил больше USDT, чем вносил. Цикл повторялся много раз.
Атака повторного воспроизведения
Суть атаки повторного воспроизведения в том, что хакер перехватывает данные о транзакции и использует их для совершения платежей в свою пользу, меняя в них данные о получателе и сумму перевода. Атака позволяет хакеру работать с протоколом так, будто у него есть огромный залог, и выводить из контракта больше монет, чем он может получить в реальности.
Вот несколько примеров того, как хакеры использовали атаку повторного воспроизведения в 2020 году:
- Апрель: хакер в атаках на децентрализованные торговые платформы Uniswap и Lendf.me вывел $25 млн из протокола dForce;
- Июнь: хакер вывел $500 000 из пула Balancer Labs;
- Август: хакер вывел $371 000 из протокола Opyn;
- Ноябрь: хакеры вывели $2 млн из Akropolis и $7.7 млн — из Origin.
Рассмотрим атаку на примере взлома Origin.
1. Хакер взял мгновенный кредит на 70 000 ЕТН в протоколе dYdX;
2. Затем обменял кредитный эфир на USDT и DAI на площадке Uniswap;
3. Переместил USDT в пул Origin, получив OUSD — нативный стейблкоин протокола, который рассчитывается на основе USDT, USDC и DAI.
4. Далее хакер воспользовался ошибкой смарт-контракта в Origin, из-за которой тот не проверял переданные активы и не обеспечивал защиту от атаки повторного воспроизведения. В результате злоумышленник выпустил дополнительные OUSD, которые в итоге обменял на ЕТН и DAI через торговые площадки Uniswap и SushiSwap.
Ошибки в коде DeFi-протокола
Часть уязвимостей DeFi-протоколов, использованных хакерами, уникальны. Обобщенно отнесем их к ошибкам в коде.
Например, в июне 2020 года разработчики Bancor сами заметили ошибку в смарт-контракте своего протокола. Хакеры не успели воспользоваться ею, и средства пользователей не пострадали. Но команде проекта пришлось на время отключить блокчейн-сеть Bancor, чтобы все исправить.
А вот разработчики Pickle Finance логическую ошибку в смарт-контракте вовремя не увидели. Это позволило хакеру в конце ноября прошлого года вывести из протокола почти $19.7 млн. Pickle Finance — агрегатор доходности вроде yEarn.Finance. Он позволял создавать автоматические решения для арбитража монет между DeFi-протоколами для максимизации прибыли.
Спешка при запуске DeFi-протоколов и отсутствие аудита
DeFi-сектор развивается так стремительно, что разработчики протоколов часто пренебрегают элементарными правилами цифровой безопасности. Например, аудитом кода — проверкой кода сторонними разработчиками на наличие ошибок и уязвимостей.
Но даже наличие аудита не гарантирует 100-процентную защиту от ошибок. Так, в апреле 2020 года анонимная программистка Молли Уинтермьют запустила DeFi-протокол Hegic. Аудит кода выполнила компания Trail of Bits. Уверенная, что с кодом все хорошо, Уинтермьют не провела дополнительное автоматизированное тестирование и сразу запустила протокол. Но уже на следующий день он дал сбой из-за ошибки в одной букве в одной из функций. К счастью, разработчица заметила уязвимость сама и вовремя все исправила, но за это время было потеряно $48 000 средств пользователей.
К сожалению, организаторы DeFi-проектов нередко решатся на запуск с недостаточным охватом юнит-тестов и игнорируют проведение аудита безопасности смарт-контрактов. Это значительно повышает вероятность нападения хакеров и потери денег пользователей.
Все протоколы, о которых мы рассказали выше, также прошли аудит, но это не уберегло их от наличия уязвимостей. Если разработчики не проверяют свой проект достаточно тщательно, то это обязательно сделает хакер.
Другие риски DeFi
Помимо уязвимостей в коде, у DeFi-сектора есть и другие риски:
Регуляторные — DeFi-протоколы сейчас никак не регулируются. Поскольку они продолжают стремительно развиваться, вполне вероятно, что вскоре на них обратят внимание глобальные и национальные регуляторы. Так, комиссия по ценным бумагам и биржам США (SEC) уже начала присматриваться к сектору.
Централизация — несмотря на свое название, многие DeFi-проекты управляются централизованно. Любой, кто имеет доступ к административному ключу, имеет и возможность истощить все кредитные пулы платформы.
Проблемы ликвидности — DeFi растет так стремительно, что практически неизбежно надувание «пузырей», прежде всего в секторе Yield Farming («доходное фермерство»), к которому относится и yEarn.Finance. Суть та же: пользователь получает доход от размещения своих монет на кредитных DeFi-протоколах. За любые взаимодействия с протоколом в Yield Farming пользователи получают вознаграждение в нативных токенах. Например, за предоставление монет, выдачу займов, участие в голосованиях. В отличие от простых кредитных протоколов, Yield Farming позволяет зарабатывать также и заемщикам. Но если пользователи начнут массово выводить средства из протоколов, это может поставить под угрозу работу протокола и обвалить весь DeFi-сектор.
Зависимость от Ethereum — большинство DeFi-проектов работают на блокчейне Ethereum, в результате чего проблемы этой сети, такие как низкая скорость и ограниченная масштабируемость, становятся проблемами и DeFi-сектора. Когда Ethereum обновится до состояния 2.0, эти трудности должны быть устранены. Но все равно в такой сильной зависимости от работы одного блокчейна нет ничего хорошего.
В заключение
Конечно, все описанные выше проблемы не означают, что следует отказываться от DeFi. Ведь это одно из самых перспективных направлений крипторынка, к тому же перечисленные уязвимости актуальны не только в DeFi-секторе, но и на крипторынке в целом, а также на традиционных финансовых рынках.
Однако важно, чтобы пользователи понимали риски, связанные с инвестированием своих средств в DeFi. Пока разработчики не будут ставить безопасность протоколов на первое место, сектор не будет готов к по-настоящему массовому использованию.
По этой причине, несмотря на заблокированные в DeFi-протоколах миллиарды, децентрализованные финансы остаются уделом энтузиастов и спекулянтов. В заключение повторим очевидный, но постоянно актуальный совет: вкладывайте в DeFi только те деньги, которые можете позволить себе потерять.