Название: «Обход нулевого уровня: почему изолированная безопасность — это не безопасность».

Автор: Кшиштоф Урбански, член команды L2BEAT

Составитель: Babywhale, Foresight News

С момента своего создания L2BEAT приложила значительные усилия для анализа и понимания рисков, связанных с протоколами уровня 2. Мы всегда действуем в интересах наших пользователей и экосистемы и делаем все возможное, чтобы быть беспристрастным и независимым наблюдателем, не позволяя нашим личным предпочтениям в отношении проектов или связанных с ними команд влиять на факты. Вот почему, хотя мы уважаем время и усилия, которые команда проекта вкладывает в проект, мы можем «бить тревогу» или выражать свою обеспокоенность по поводу потенциальных рисков, связанных с некоторыми протоколами. Заблаговременное обсуждение вопросов безопасности позволяет всей экосистеме лучше подготовиться к потенциальным рискам и раньше реагировать на любое подозрительное поведение.

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

Общая безопасность против независимой безопасности

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

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

Проблемы

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

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

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

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

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

Докажите, что уязвимости безопасности существуют

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

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

Как указывает LayerZero в своем официальном документе, его «ненадежная межцепочная связь» опирается на двух независимых участников (оракулов и ретрансляторов), действующих вместе для обеспечения безопасности протокола.

LayerZero заявляет на своем веб-сайте, что его основная концепция — «пользовательские приложения, работающие под управлением ULN (UltraLightNode), настраиваемых сетевых терминалов». Ончейн-компонент LayerZero опирается на два внешних оффчейн-компонента для ретрансляции сообщений между цепочками — оракулов и ретрансляторов.

Всякий раз, когда какое-либо сообщение M отправляется из цепочки A в цепочку B, происходят следующие две операции:

  • Сначала оракул ждет, пока транзакция, отправляющая сообщение M в цепочке A, не завершится, а затем записывает соответствующую информацию в цепочку B, например, хэш-значение заголовка блока цепочки A, содержащего сообщение M (точное значение между различными цепочками/оракулами). Формат может отличаться).

  • Затем реле отправляет «доказательство» (например, доказательство Меркла) в цепочку B, доказывая, что сохраненный заголовок блока содержит сообщение M.

LayerZero предполагает, что реле и оракулы являются независимыми и честными участниками. Однако LayerZero также заявил в официальном документе, что если это предположение не выполняется, например, ретранслятор и оракул вступают в сговор, в результате чего «как заголовок блока, предоставленный оракулом, так и доказательство транзакции, предоставленное ретранслятором, являются недействительными, но все еще соответствует».

LayerZero утверждает, что «дизайн LayerZero исключает возможность сговора». Но на самом деле это утверждение неверно (мы доказываем это в экспериментах, показанных ниже), поскольку каждое пользовательское приложение может определять свои собственные реле и оракулы. LayerZero не гарантирует, что эти компоненты независимы и не могут взаимодействовать друг с другом; предоставление этих гарантий зависит от пользовательского приложения; LayerZero не имеет механизма остановки приложений, если они захотят их сломать.

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

Экспериментальная дизайн

Для наших экспериментов мы решили создать простой токен омникана CarpetMoon, который работает как на Ethereum, так и на Optimism и использует LayerZero для связи между двумя цепочками.

Наш токен изначально использует модель безопасности по умолчанию, предоставляемую LayerZero, что делает его идентичным большому (возможно, не всем) развернутым в настоящее время приложениям LayerZero. Поэтому, как правило, она так же безопасна, как и любая другая монета, использующая LayerZero.

Сначала мы развертываем наш контракт токена на Ethereum и Optimism:

https://ethtx.info/mainnet/0xf4d1cdabb6927c363bb30e7e65febad8b9c0f6f76f1984cd74c7f364e3ab7ca9/

https://optimistic.etherscan.io/tx/0xf41389d71fa3942de5225efb067072728c6c6de56c241574187781db7c73d221

Затем мы настраиваем маршрутизацию, чтобы LayerZero знал, какой контракт какому соответствует в обеих цепочках.

https://ethtx.info/mainnet/0x19d78abb03179969d6404a7bd503148b4ac14d711f503752495339c96a7776e9/

https://optimistic.etherscan.io/tx/0x037b1bad33faa5607bb5835460a1d5caaf3a147dc3a09762ac7703befcdb3c3c

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

Мы предоставили нашему «тестовому пользователю» Алисе 1 миллиард токенов CarpetMoon на Ethereum.

https://ethtx.info/mainnet/0x7e2faa8426dacae92830efbf356ca2da760833eca28e652ff9261fc03042b313/

Теперь Алиса использует LayerZero для перекрестной цепочки этих токенов с Optimism.

Мы блокируем токены в контракте условного депонирования на Ethereum:

https://ethtx.info/mainnet/0xe4dc3757b86bfda8e7baddc088fb1a599e083ed77034c29e5dd8bd11f1e17771/。

Сообщение, содержащее транзакцию, передается в Optimism через LayerZero:

https://layerzeroscan.com/101/address/0xc6005ccc1de4b300d538903b74848bff881d5dc5/message/111/address/0x201fe0d843b546f2e24d4c8444318d1c71b7nonced10d/。

На Optimism чеканят кросс-чейн токены, и теперь Алисе принадлежит 1 миллиард токенов MoonCarpet на Optimism:

https://optimistic.etherscan.io/tx/0x5388ced88cf562acafff82d6798f791b0b38b90ee106df9bf91c0d86306ec302。

Все работает как положено, Алиса перекрестно соединяет токены и видит, что в контракте условного депонирования на Ethereum находится 1 миллиард токенов MoonCarpet, а на ее счету в Optimism — 1 миллиард токенов MoonCarpet. Но просто чтобы убедиться, что всё в порядке, она перевела половину своих токенов обратно в Эфириум.

Начнем с транзакции на Optimism, которая сожгла 500 миллионов токенов:

https://optimistic.etherscan.io/tx/0x118a57106488ad0bae1f3b920b1fd98b187752ad966f3a901fc53cff47f2097f。

Информация о транзакции передается в Ethereum:

https://layerzeroscan.com/111/address/0x201fe0d843b546f2e24d4c8444318d1c71b7d10d/message/101/address/0xc6005ccc1de4b300d538903b74848bff881d5dc5/nonce/1。

Как и ожидалось, 500 миллионов токенов MoonCarpet возвращаются из контракта условного депонирования на адрес Алисы:

https://etherscan.io/tx/0x27702e07a65a9c6a7d1917222799ddb13bb3d05159d33bbeff2ca1ed414f6a18。

Пока все работает нормально и именно так, как предполагалось. Алиса проверила, что она может переносить токены из Ethereum в Optimism и обратно, и у нее нет причин беспокоиться о своих токенах MoonCarpet.

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

Таким образом, Боб может изменить оракулы и реле с компонентов по умолчанию на компоненты, которыми он управляет.

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

Итак, Боб меняет оракул на EOA под своим контролем:

https://ethtx.info/mainnet/0x4dc84726da6ca7d750eef3d33710b5f63bf73cbe03746f88dd8375c3f4672f2f/。

Репитер также был изменен:

https://ethtx.info/mainnet/0xc1d7ba5032af2817e95ee943018393622bf54eb87e6ff414136f5f7c48c6d19a/。

Теперь происходит что-то странное. Поскольку оракул и реле теперь находятся под полным контролем Боба, он может украсть жетоны Алисы. Несмотря на то, что в отношении Optimism не было предпринято никаких действий (токены MoonCarpet все еще находились в кошельке Алисы), Боб смог убедить смарт-контракт MoonCarpet на Ethereum (используя механизм LayerZero), что он уничтожил токены в другой цепочке и смог вывести токены на токен MoonCarpet на Ethereum.

Сначала он обновляет хэш блока Эфириума, используя подконтрольного ему оракула:

https://ethtx.info/0xde2edee2cc7f070120e96c9df90d86696970befcfc221e18c6ac4168bb5b1d92/。

Теперь он может вывести оставшиеся токены из эскроу-контракта:

https://ethtx.info/0xda695f374b375d5372efeca37aae4c5a17f114d5a76db1e86edebb0924bcdcc7/。

Результаты эксперимента

Алиса даже не знает, почему и когда произошла ошибка. Внезапно ее токен MoonCarpet на Optimism больше не был обеспечен токенами на Ethereum.

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

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

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

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

в заключение

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

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

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

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

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

Мы считаем, что по мере того, как независимые модели безопасности, такие как LayerZero, становятся все более популярными, все больше и больше проектов будут злоупотреблять ими, нанося огромный ущерб и увеличивая неопределенность во всей отрасли.