Пока одни пророчат децентрализованным финансам (DeFi) будущее, другие обвиняют их в создании пирамиды и предрекают неминуемый крах. Теперь у DeFi-скептиков есть яркий пример того, как все может пойти наперекосяк. 14 и 18 февраля хакер дважды вывел с DeFi-платформы Fulcrum (платформа маржинального кредитования и торговли, работающая на алгоритме bZx) монеты Ethereum в общей сложности почти на миллион долларов. Злоумышленник успешно использовал уязвимость смарт-контракта bZx, позволившую ему манипулировать курсом валют и обмануть систему безопасности протокола. По какой схеме действовал хакер, устранены ли уязвимости протокола, которыми воспользовался злоумышленник, и какие еще угрозы несет в себе рынок мгновенных кредитов — разобрался DeCenter.

Как устроены мгновенные кредиты в системе DeFi

Кредиты — основная услуга в индустрии DeFi. Недавно DeCenter подробно рассказывал о том, как работает кредитование на базе DeFi. Но для понимания схемы, которую использовал хакер, необходимо сначала в общих чертах разобраться в том, что такое мгновенные кредиты (flash credits).

Так как кредиторы и заемщики в DeFi не знают друг друга, криптокредиты выдаются под залог цифровых активов, например, ВТС, ЕТН или стейблкоинов. Чтобы получить кредит, надо заблокировать актив в специальном смарт-контракте, что будет гарантировать наличие необходимых средств у заемщика. У таких кредитов нет срока — чтобы их погасить, надо просто отправить обратно выданные средства и погасить проценты.

Однако крипто-активы крайне волатильны. Чтобы обезопасить себя от резких скачков курсов криптовалют, большинство платформ DeFi-кредитования позволяют заемщикам занимать не более 75% от стоимости своего обеспечения. Если цена залогового актива начинает падать, смарт-контракт продаст его по определенной спотовой цене, чтобы защитить кредитора.

Получается, что заемщик берет в кредит меньше, чем есть у него. Зачем? Хорошая аналогия, объясняющая то, как устроено DeFi-кредитование — работа ломбарда. Допустим, необходимо заложить телефон стоимостью в $100, но ломбард готов дать лишь $50 за него. Если владелец телефона отчаянно нуждается в деньгах, то, конечно же он будет вынужден продать по предложенной цене, получив половину от своих первоначальных вложений. И когда придет время выкупать телефон, ему будет необходимо заплатить те же $50 и проценты. В результате все в выигрыше — ломбард заработал на процентах, владелец телефона решил свои финансовые проблемы, сохранив телефон (актив) и $100. В DeFi-кредитовании все аналогично, только на блокчейне и смарт-контрактах: вместо телефона пользователь закладывает свои крипто-активы, которые не хочет продавать сейчас.

Экосистема DeFi также включает в себя децентрализованные биржи (DEX), на которых трейдеры обмениваются крипто-активами по принципу одноранговой торговли, и их заказы выполняются алгоритмически на блокчейне Еthereum.

Чтобы кредитный рынок DeFi работал корректно, в нем используют специальные протоколы — блокчейн-оракулы, проверяющие условия выполнения смарт-контрактов и собирающие внешние данные для исполнения транзакций в цепочке. Например, ценовые оракулы собирают с криптобирж данные о стоимости активов — это необходимо, чтобы кредиторы знали размер обеспечения. При этом цены на биржах часто сильно отличаются друг от друга — это расхождение создает для трейдеров возможность дополнительного заработка. А мгновенные кредиты помогают им ею воспользоваться.

Мгновенные кредиты — новая функция в DeFi, протокол для которой впервые был запущен на платформе Aave в январе этого года, а 10 февраля — на Fulcrum. Мгновенные кредиты позволяют трейдерам брать кредиты без залога. Гарантии кредиторам обеспечиваются тем, что такие кредиты выплачиваются в рамках той же транзакции, в которой и берутся.

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

Но так просто было только в теории. Нашелся талантливый хакер, который взломал эту схему.

Первая атака в День влюбленных

Согласно официальному отчету команды bZx о происшествии, первый раз протокол был скомпрометирован 14 февраля. Возможно, дата выбрана не случайно. Но не из-за праздника влюбленных, а потому что в это время команда bZx находилась на хакатоне EthDenver сообщества Ethereum, на котором основной упор делался как раз на обсуждении DeFi-сектора крипторынка.

Хакер использовал уязвимость в протоколе мгновенных займов. За время возвращения кредитных средств он успел провести ряд манипуляций, позволивших ему вывести ЕТН в эквиваленте $350 000 — около 2% активов в управлении bZx.

Вот схема действий хакера:

 Он получил мгновенный кредит из децентрализованного кредитного протокола dYdX на 10 000 ETH, стоимостью около $2.67 млн;

 После этого злоумышленник разделил средства, отправив 5500 ЕТН ($1.46 млн) на сервис Compound для обеспечения кредита в размере 112 wBTC (Wrapped Bitcoin — токен на блокчейне Ethereum, привязанный к цене биткоина), эквивалентом около $1.1 млн;

 Затем хакер отправил 1300 ETH (более $372 000) на Fulcrum, платформу bZx, и занял 5637 ETH. Он использовал функцию маржинальной торговли, поставив на падение ЕТН по отношению к ВТС;

 Чтобы обеспечить это условие, хакер обменял 5637 ETH на 51 wBTC через протокол Uniswap от децентрализованной биржи Kyberswap. Эта цена была в 2.5 раза выше рыночной — реальный курс обмена составил бы около 2000 ЕТН за 51 wBTC. Но из-за особенности протокола, система bZx «проконсультировалась» с KyberSwap (который только что продал монеты по повышенному курсу), решила, что цена соответствует рынку и заплатила 5637 ЕТН за 51 wBTC.

На этом этапе протокол и потерял деньги, ведь смарт-контракт bZx не должен был платить такую высокую цену. На этом месте система безопасности должна была оборвать транзакцию, однако она не сработала из-за ошибки в смарт-контракте bZx. Система bZx предполагала, что когда придет время закрыть маржинальную сделку, чтобы окупить убыток, надо будет вычесть сумму депозита хакера (при условии, что ETH выросла). Однако депозита хакера оказалось недостаточно (он внес всего 1300 ЕТН), чтобы возместить убытки. Следовательно, фактический убыток bZx составил 2367 ЕТН (5637 ЕТН — 2000 ЕТН — 1300 ЕТН). Система bZx ожидала, что хакер вернется и заплатит недостающие 2367 ETH, чтобы закрыть свою маржинальную торговлю. Этого не произошло. Но и не это принесло хакеру прибыль.

 Далее хакер продал 112 WBTC, заимствованные у Compound в Uniswap. Поскольку цена была завышена, хакер получил 6871 ETH вместо изначально одолженных 5500 ЕТН.

 Затем хакер вернул мгновенный кредит в 10 000 ETH, который взял у dYdX.

Общая прибыль хакера от последовательности этих действий составила около $350 000. При этом злоумышленник не рисковал собственными средствами. Если бы что-то пошло не так, он мог бы просто отменить транзакцию и потерять лишь плату за комиссию — по данным Trustnodes, она составила всего $8.71. Несмотря на то, что хакер не взламывал код, а лишь воспользовался уязвимостью протокола, его действия все равно незаконны — он искусственно завысил цену актива.

Узнать подробнее об атаке можно из отчета компании Peckshield, в блоге Корантина Огюста, бывшего инженера-программиста Google, или в блоге разработчика Мудиты Гупты. Специалисты Peckshield и Огюст подчеркнули, что к инциденту привел не сбой оракула, а проблема в логической ошибке алгоритма. Команда bZx подчеркнула, что ее протокол не был нарушен. «С точки зрения протокола кто-то просто взял кредит. С точки зрения кредитора этот кредит ничем не отличается от любого другого», — написала компания в Twitter.

bZx использовала ключ администратора, чтобы приостановить работу протокола

15 февраля bZx приостановила работу своего кредитного и торгового протокола, на базе которого работает платформа Fulcrum. Компания заявила, что самостоятельно компенсирует все убытки перед своими поставщиками ликвидности.

Для этого компании пришлось воспользоваться ключом администратора — функцией протокола, позволяющей контролировать любой из смарт-контрактов. Инструмент разработан специально для таких случаев. Без такого ключа, чтобы исправить ситуацию, пришлось бы переписывать весь блокчейн (как это случилось с DAO, который сломался из-за ошибки в двух строках кода).

Компания bZx отметила, что принять решение о применении ключа администратора ей было непросто — ведь это показывает, насколько проект централизован, и что в конечном счете пользователи полагаются на добропорядочность команды проекта. Учитывая, что вся цель DeFi состоит в том, чтобы устранить посредника, которому нужно доверять, это, безусловно, серьезный просчет.

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

16 февраля bZx также отметила, что приняла дополнительные меры предосторожности для того, чтобы ситуация не повторилась вновь, возобновила действие протокола и пообещала, что продолжит платить проценты и пул не закроется. Кроме того, компания приняла меры по предотвращению атаки на ценовой оракул и пообещала в скором времени перейти к оракулам на основе протокола Chainlink — по-видимому, предполагается, что это сделает систему более безопасной. К сожалению, принятые меры не сработали — 18 февраля хакер вновь воспользовался уязвимостью протокола, на этот раз проведя именно атаку на оракул.

Вторая атака причинила в два раза больше ущерба

Вторая атака произошла 18 февраля. По сообщению компании, на этот раз хакер атаковал оракул. О возможности подобной атаки говорилось еще в сентябре прошлого года, когда «белый» хакер Samczsun описал ее устройство в своем блоге. Судя по всему, это тот же самый человек, что провел атаку и 14 февраля. Только в этот раз он сосредоточился не на эфире, а на долларовом стейблкоине Synthetix USD (SUSD).

На этот раз хакер действовал так:

 Злоумышленник взял на bZx мгновенный кредит в 7500 ЕТН ($1.98 млн). Из них 3518 ETH ($940 000) он обменял на платформе Synthetix на sUSD (по курсу в $1), после чего перевел sUSD на bZx в качестве залога;

 Далее хакер потратил 900 ЕТН (~$240 000) через интегрированный ценовой канал на покупку sUSD на Kyber и Uniswap, что увеличило курс монеты до $2;

 Хакер воспользовался тем, что bZx получает ценовые данные от Kyber, и смог использовать раздутое обеспечение sUSD, взяв на bZx еще один кредит в размере 6796 ETH (примерно $1.8 млн) — фактически на 2000 ЕТН больше, чем получил бы за ту же сумму в SUSD при рыночной цене.

 После этого хакер использует заемные и оставшиеся средства для погашения первоначального кредита в 7500 ETH. Он не стал оплачивать залоговый кредит SUSD/ETH, только что взятый на bZx, оставив себе 2378 ETH (~$645 000). Потери bZx составили около $1.8 млн, прибыль пула sUSD — $1.1 млн, а сам хакер обогатился на примерно $645 000.

Узнать подробнее о второй атаке можно из отчета Peckshield или комментариев сотрудника издания The Block Ларри Чермака.

В Twitter bZx сообщила, что она снова приостановила действие протокола и, следовательно, торговли. Убытки будут покрыты за собственный счет компании. А 20 февраля о первых выплатах по убыткам сообщила и страховая компания Nexus Mutual.

Уроки для DeFi

На момент выхода статьи протокол платформы Fulcrum по-прежнему отключен. Несмотря на то, что команда bZx объявила, что устранила уязвимость, уверенности в этом нет. Даже действуя на опережение, пытаясь защититься от атаки на ценовой оракул и проведя независимый аудит системы смарт-контрактов, команда не смогла уберечься от новых атак.

И проблема заключается здесь не в самом коде, а в системе опоры на ценовой оракул — он по-прежнему остается самым уязвимым местом мгновенных кредитов. Они остаются потенциальным объектом для манипуляций. До тех пор, пока смарт-контракт может быть «обманут» в стоимости актива, злоумышленник может занять суммы, превышающие стоимость залога. В связи с чем ситуация вроде произошедшей с bZx может произойти с любым проектом, полагающимся на ценовой оракул.

Со стороны криптосообщества также высказывается много критики в адрес DeFi, мгновенных кредитов и конкретно bZx. Роберт Лэшнер, основатель конкурирующего DeFi-протокола Compound в комментариях The Block заметил, что считает, что компания bZx «уже несколько раз продемонстрировала, что не способна защитить средства пользователей, и должна немедленно закрыться, [и не открываться] до тех пор, пока ее платформа не будет полностью и всесторонне проверена».

Чарли Ли, создатель Litecoin, заявил, что вообще не верит в будущее DeFi, так как оно — это только имитация децентрализации, без преимуществ перед традиционными фиатными активами.

«Вот почему я не верю в DeFi. Оно вобрало в себя худшее из обоих миров. Большинство DeFi-проектов могут быть централизовано закрыты — так что это просто театр децентрализации. Раз для отмены хака или уязвимости нужна такая большая централизация, чем это лучше того, что мы уже имеем сейчас?», — написал Чарли Ли в Twitter.

Джимми Сонг, разработчик и евангелист биткоина, поддержал Чарли Ли, отметив, что биткоин гораздо более надежный инструмент, чем DeFi.

«Биткоин: анти-хрупкий, низкое временное предпочтение, децентрализованный. DeFi: хрупкий, высокое временное предпочтение, централизованный. Они не должны быть в одной и той же вселенной, не говоря уже об одной и той же категории», — написал Сонг у себя в Twitter.

Однако, у bZx находятся и защитники. Так, гендиректор Staked Тим Огилви считает, что атака подчеркивает новизну мгновенных кредитов, а сбои в таких ситуациях — это нормально: «Это новое, быстро развивающееся направление, это нормально, если некоторые проекты могут пострадать».

CIO Arcane Assets Эрик Уолл защищает экосистему DeFi, утверждая, что некоторые протоколы более децентрализованы, чем другие. Он считает, что применение ключа администратора, чтобы защитить средства, не равносильно централизованному обмену, если это не позволяет конфисковать средства пользователей.

Сотрудник издания Coindesk Адам Б. Левин отметил, что атака хакера оказалась возможна, потому что ее просто раньше никто не ожидал. «Сейчас получить точную информацию о ценах для моментальных кредитов действительно сложно. Но, думаю, что это, хоть и серьезная, но временная проблема… Обычно такие атаки срабатывают только один раз, потому что теперь, когда мы понимаем, что это возможно, намного легче защититься от этого. Но это еще не значит, что все это безопасно, мы просто не знаем, как будет выглядеть следующая атака, пока кто-то не провернет ее».

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

Сейчас сумма ETH, заблокированных на рынках DeFi, превышает $1 млрд, и по прогнозам она увеличится в несколько раз в течение ближайших лет. DeFi-сектор развивается так стремительно, что не успевает достаточно тестировать и проверять свои сервисы. Если вывести деньги из системы может быть так относительно просто, этим без сомнения попытаются воспользоваться еще не раз.