9 июня 2021

Итак, вы хотите использовать оракул цен…

Перевод выполнен исследовательской командой CoinIndex и межавторским коллективом CryptoHedwig. Кому интересна самая суть протоколов и жесткая математика, научные статьи и исследования в крипте — подписывайтесь на наш канал Hedwig UnChained — там никаких токенов, только хардкор! 

Оригинал: So you want to use a price oracle, Sam S., Research Partner at Paradigm.

В конце 2019 года я опубликовал пост под названием “Получение займов с недостаточным обеспечением для развлечения и для прибыли”. В нем я описал экономическую атаку на децентрализованные приложения Ethereum, которые полагаются на точные данные о ценах одного или нескольких токенов. Сейчас конец 2020 года, и, к сожалению, многие проекты с тех пор сделали очень похожие ошибки, последним примером является взлом Harvest Finance, который привел к потере 33 миллионов долларов для пользователей протокола.

Хотя разработчики знакомы с уязвимостями повторного входа (Re-entrancy attack, подробнее например, в этой статье), манипулирование оракулом явно не то, на чем фокусируются. К тому же, с годами, такие атаки сократились, в то время как использование уязвимостей, направленных на манипуляции ценами из оракулов, сейчас растет. Таким образом, я решил, что пришло время опубликовать исчерпывающий материал о такого рода манипуляциях.

Этот пост разбит на три раздела. Для тех, кто не знаком с предметом, есть введение в оракулы и манипуляции с ними. Те, кто хочет проверить свои знания, могут сразу перейти к тематическим исследованиям, в которых мы рассматриваем прошлые уязвимости и эксплойты. Наконец, мы подведем итоги и опишем некоторые приемы, которые разработчики могут применять для защиты своих проектов от манипуляций.

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

Что такое ценовой оракул?

Ценовой оракул, если говорить в общем, — это все, к чему вы обращаетесь за информацией о цене. Когда Пэм спрашивает Дуайта о денежной стоимости Schrute Buck, Дуайт выступает в роли ценового оракула.

В Ethereum, где все является смарт-контрактом, также есть оракулы цен. Таким образом, полезно различать, как ценовой оракул получает информацию о цене. В одном из подходов вы можете просто взять существующие данные о ценах (вне сети)  из API цен или бирж и перенести их в сеть. С другой стороны, вы можете рассчитать мгновенную цену опираясь на данные с децентрализованных on-chain бирж.

Оба варианта имеют свои достоинства и недостатки. Данные вне сети обычно медленнее реагируют на волатильность, которая может быть хорошей или плохой в зависимости от того, для чего вы пытаетесь их использовать (здесь мы категорически не согласны с автором., прим. переводчика). Обычно для передачи данных в сеть требуется несколько привилегированных пользователей, поэтому вы должны быть уверены, что они не станут злонамеренными и их нельзя будет принудить к отправке недостоверных данных. On-chain данные не требуют какого-либо привилегированного доступа и всегда актуальны, но это означает, что злоумышленники легко ими манипулируют, что может привести к катастрофическим последствиям.

Что может пойти не так?

Давайте рассмотрим несколько случаев, когда плохо интегрированный оракул привел к большим финансовым потерям в DeFi.

Synthetix sKRW Oracle

Synthetix — это платформа для деривативов, которая позволяет пользователям иметь доступ к активам и другим валютам. Упрощенно, Synthetix (в то время) полагался на реализацию кастомного офф-чейн источника цен, в котором агрегированная цена, рассчитанная из секретного набора источников, размещалась в блокчейне с фиксированным интервалом. Эти цены затем позволяли пользователям открывать длинные или короткие позиции по активам.

25 июня 2019 года в одном из ценовых каналов, на которые опирался Synthetix, цена корейского вона была 1000 раз выше актуального курса. Из-за дополнительных ошибок в системе оракула, эта цена была принята системой и размещена в сети, где торговый бот быстро входил и выходил из рынка sKRW.

В общей сложности бот смог получить прибыль в размере более 1 млрд долларов США, хотя команда Synthetix смогла договориться с трейдером о возврате средств в обмен на вознаграждение за ошибку.

Synthetix реализовал контракт оракула верно и извлекал цены из нескольких источников, чтобы трейдеры не могли прогнозировать изменения цен до того, как они будут опубликованы в сети. Однако единичный случай сбоя в работе одного  потока цен привел к разрушительной атаке. Это иллюстрирует риск использования ценового оракула, который использует данные вне сети: вы не знаете, как рассчитывается цена, поэтому ваша система должна быть тщательно спроектирована, чтобы все возможные режимы отказа обрабатывались должным образом. 

Примечание переводчика: Эта проблема есть и в других финансовых системах, однако криптомир очень пренебрежительно относиться к этой проблеме. Обобщенно, в финансах ценовые потоки — это индексы. На них стоит весь мир деривативов, а это триллионы долларов обязательств. В то время, как криптобиржи (деривативные) зачастую иногда даже не публикуют точную методику расчета индекса, в традиционном мире этим занимаются серьезные компании, а руководство по построению индекса (того же ценового фида) у S&P или CME — это финансово-математическо-юридический документа на сотни страниц. Ближе всего к такому уровню подошла биржа Kraken Futures (вернее, купленная ими CryptoFacility, которая и считает индекс в основе CME BTC Price).  Я понимаю, что делать целую систему ради расчета одной циферки может быть скучно (и точно скучнее, чем DOGE), но цена ошибки иногда астрономическая.

Кредиты с недостаточным обеспечением

Как упоминалось ранее, в сентябре 2019 года я опубликовал пост с описанием рисков, связанных с использованием ценовых оракулов, которые полагались на данные в сети. Хотя я настоятельно рекомендую прочитать предыдущую статью, она довольно длинная и содержит множество технических деталей, которые могут быть сложны для понимания. Поэтому здесь я дам упрощенное объяснение.

Представьте, что вы хотите создать децентрализованное кредитование в блокчейне. Пользователи могут вносить активы в качестве обеспечения и занимать другие монеты  до определенной суммы, определяемой стоимостью активов, которые они депонировали. Предположим, что пользователь хочет занять доллары США, используя ETH в качестве обеспечения, текущая цена которого 400 USD, а коэффициент обеспечения составляет 150%.

Если пользователь внесет 375 ETH, это эквивалентно залогу в $ 150 000. В дальнейшем он может занять 1$ на каждые 1,5$ залога, таким образом у системы можно занять максимум 100 000 USD.

Но, конечно, в блокчейне все не так просто, чтобы объявить, что 1 ETH стоит 400 USD, потому что злоумышленник может просто объявить, что 1 ETH стоит 1000 USD, а затем забрать все деньги из системы. Таким образом, у разработчиков возникает соблазн добраться до интерфейса в форме ближайшего ценового оракула, такого как текущая спотовая цена на Uniswap, Kyber или другой децентрализованной бирже.

На первый взгляд, все кажется верным. В конце концов, цены Uniswap всегда примерно верны, когда вы хотите купить или продать ETH, поскольку любые отклонения быстро исправляются арбитражниками. Однако, как оказалось, спотовая цена на децентрализованной бирже может быть совершенно неверной во время транзакции, как показано в примере ниже.

Рассмотрим, как работает резерв Uniswap. Цена рассчитывается на основе количества активов, удерживаемых в резерве, но активы, удерживаемые в резерве, меняются по мере того, как пользователи торгуют между ETH и USD. Что, если злоумышленник совершит сделку до и после получения кредита на вашей платформе?

Прежде чем пользователь берет кредит, он покупает 5000 ETH за 2000000 USD. Биржа Uniswap теперь рассчитывает цену 1 ETH = 1733,33 USD. Теперь его 375 ETH могут выступать в качестве обеспечения на сумму до 433 333,33 USD, которые можно занять. Наконец, обмениваем 5000 ETH на свои первоначальные 2000000 USD, понижая стоимость. В результате, ваша кредитная платформа просто позволила пользователю занять дополнительные 333 333,33 доллара США без предоставления какого-либо обеспечения.

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

Манипуляции с Synthetix MKR

В декабре 2019 года Synthetix подверглась еще одной атаке в результате манипуляции ценами. Что примечательно, что атакующий преодолел барьер между данными о ценах внутри сети и данными о ценах вне сети.

Пользователь Reddit u/MusaTheRedGuard заметил, что злоумышленник совершал очень подозрительные сделки против sMKR и iMKR (обратный MKR). Злоумышленник сначала зашел в длинную позицию на MKR, купив sMKR, а затем приобрел большое количество MKR из пары Uniswap ETH / MKR. Выждав некоторое время, злоумышленник продал свой sMKR за iMKR и продал свой MKR обратно Uniswap. Затем этот процесс был повторен.

Тем временем, подобные сделки через Uniswap позволили произвольно изменять цену MKR на Synthetix. Вероятно, это было связано с тем, что ценовой поток вне сети, на который полагался Synthetix, на самом деле полагался на цену MKR в сети, и у арбитражников не было достаточной ликвидности, чтобы вернуть рынок к оптимальным условиям.

Этот инцидент иллюстрирует тот факт, что даже если вы думаете, что используете данные о ценах off-chain, вы все равно можете использовать данные о ценах в сети, и также вероятно столкнетесь со сложностями, связанными с использованием этих данных.

Взлом bZx

В феврале 2020 года bZx был дважды взломан в течение нескольких дней примерно на 1M USD. Вы можете найти отличный технический анализ обоих взломов, написанный palkeo, но мы рассмотрим только второй взлом.

Во втором взломе злоумышленник сначала купил почти всю сумму sUSD на Kyber за ETH. Затем злоумышленник приобрел вторую партию sUSD у самого Synthetix и поместил ее в bZx. Используя sUSD в качестве залога, злоумышленник занял максимально разрешенную сумму ETH. Затем они продали sUSD обратно Kyber.

Если вы обратили внимание, то узнаете, что это, по сути, такая же атака на получение кредита с недостаточным обеспечением, но с другим обеспечением и другой децентрализованной биржей.

Баг yVault

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

Система yVault позволяет пользователям вносить токен и получать доход, не управляя им самостоятельно. Внутри vault отслеживает общее количество выпущенных токенов yVault, а также общее количество депонированных базовых токенов. Стоимость одного токена yVault определяется соотношением выпущенных токенов к депонированным токенам. Любая прибыль vault распределяется между всеми выпущенными токенами yVault (и, следовательно, между всеми держателями токенов yVault).

Первый yVault позволил пользователям получать доход от USDC, предоставляя ликвидность пулу Balancer MUSD / USDC. Когда пользователь предоставляет ликвидность пулам Balancer, они получают взамен BPT, которые могут быть погашены на часть пула. Таким образом, yVault рассчитал стоимость своих активов на основе суммы MUSD / USDC, которая может быть погашена с помощью его BPT.

Реализация кажется верной, но, к сожалению, применяется тот же принцип, что и ранее — состояние пула Balancer во время транзакции нестабильно и этому нельзя доверять. В этом случае из-за кривой связывания, которую выбрал Balancer, пользователь, который переключается с USDC на MUSD, не получит обменный курс 1: 1, но фактически оставит некоторое количество MUSD в пуле. Это означает, что значение BPT может быть временно завышено, что позволяет злоумышленнику манипулировать ценой по своему желанию и впоследствии опустошать хранилище.

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

Взлом Harvest Finance

26 октября 2020 года неизвестный пользователь взломал пулы Harvest Finance, используя технику, о которой вы, вероятно, уже догадались. Вы можете прочитать официальное расследование здесь, но я еще раз резюмирую его для вас: злоумышленник снизил цену USDC в пуле Curve путем совершения сделки, затем вошел в пул Harvest по заниженной цене, восстановил цену произведя обратную сделку и вышел из Harvest пула по более высокой цене. Это привело к убыткам в размере более 33 миллионов USD.

Как защитить себя?

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

Не плавать на мелководье

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

Лучше синица в руках, чем журавль в небе

Потенциальный обменный курс на Uniswap может быть завораживающим, но ничто не является окончательным, пока вы не совершите сделку и токены не окажутся в вашем кошельке. Точно так же лучший способ наверняка узнать обменный курс между двумя активами — просто поменять местами активы напрямую. Этот подход великолепен, потому что он не требует возврата и каких-либо проблем. Однако это может не работать для протоколов, таких как платформы кредитования, которые должны удерживать исходный актив.

Почти децентрализованные оракулы

Один из способов резюмировать проблему с оракулами, полагающимися на on-chain данные, состоит в том, что они слишком актуальны. Если это так, почему бы не ввести немного искусственной задержки? Напишите контракт, который обновляется с учетом последней цены от децентрализованной биржи, такой как Uniswap, но только по запросу небольшой группы привилегированных пользователей. Теперь, даже если злоумышленник может манипулировать ценой, он не может заставить ваш протокол действительно использовать его.

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

Ограничители скорости

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

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

Средневзвешенная цена (TWAP)

Uniswap V2 представил оракул TWAP для on-chain разработчиков. В документации более подробно описаны точные гарантии безопасности, которые предоставляет оракул, но в целом для больших пулов в течение длительного периода времени без перегруженности сети, оракул TWAP очень устойчив к атакам ценовых манипуляций. Однако из-за характера его реализации он может недостаточно быстро реагировать на моменты высокой волатильности рынка и работает только с активами, для которых в блокчейне уже есть ликвидный токен.

M-of-N Источников

Иногда говорят, что если хочешь, чтобы что-то было сделано правильно, ты делаешь это сам. Что, если вы соберете N доверенных друзей и попросите их сообщить, что, по их мнению, является правильной ценой в сети, и лучшие M ответов станут текущей ценой?

Этот подход используется сегодня во многих крупных проектах: Maker запускает набор ценовых каналов, управляемых доверенными лицами, Compound создал Open Oracle и поддерживает такие источники, как Coinbase, а Chainlink объединяет данные о ценах от операторов своих нод  и предоставляет их в сети. Просто имейте в виду, что если вы решите использовать одно из этих решений, вы делегировали доверие третьей стороне, и ваши пользователи должны будут сделать то же самое. Требование вручную публиковать обновления в сети также означает, что во время высокой волатильности рынка и перегрузки сети, обновления цен могут запаздывать.

Заключение

Ценовые оракулы являются важным, но часто упускаемым из виду компонентом безопасности DeFi. Безопасно использовать оракулы сложно, и есть множество способов выстрелить себе и своим пользователям в ногу. В этом посте мы рассмотрели прошлые примеры манипуляции и установили, что чтение информации о ценах в середине транзакции может быть небезопасным и может привести к катастрофическому финансовому ущербу. Мы также обсудили несколько методов, которые в прошлом использовали другие проекты для борьбы с манипулированием ценами. В конце концов, каждая ситуация уникальна, и вы можете не знать, правильно ли вы используете ценовой оракул. Если это так, не стесняйтесь обращаться за советом!