Уязвимость с нулевым кликом контракта кошелька Argent-X, объяснение

Узнайте больше об уязвимости, обнаруженной в кошельке Argent X, и научитесь защищать свои средства
Абстракция учетной записи
• Ноя 16, 2022
5 мин. чтения
Уязвимость с нулевым кликом контракта кошелька Argent-X, объяснение

TL;DR

Мы обнаружили критическую уязвимость в контракте Argent, развернутого в приложении кошелька Argent-X версии 5.0.x, которая позволяла любому желающему получить полный контроль над аккаунтом Argent. Уязвимость эксплуатировалась путем отправки транзакции определенным способом, позволяющим обойти логику проверки подписи контракта Argent. Это позволяло злоумышленнику отправить любую транзакцию с пустой или ложной подписью, которая была бы выполнена и принята в сети. Мы продемонстрировали уязвимость, отправив транзакцию Transfer с пустой подписью на контракт аккаунта Argent переведя ETH на выбранный нами кошелек. Мы сообщили об этой проблеме команде Argent, и она оперативно приняла меры по ее устранению.

История двух версий

В последней версии StarkNet v0.10.0, вышедшей около месяца назад, в протоколе появился новый уровень версии транзакций (v1). Он изменяет способ проверки транзакций в контрактах счетов Starknet, отделяя логику проверки транзакций от логики выполнения транзакций (сама проверка по-прежнему выполняется в рамках контракта аккаунта — но теперь ее вызывает ОС StarkNet). Это выгодно, так как позволяет ОС StarkNet проверять достоверность транзакции перед ее выполнением, что предотвращает DDoS-атаки со стороны злоумышленника, который не может создать достоверную подпись.

Поддержка транзакций, работающих со старой версией (v0), была сохранена для того, чтобы пользователи могли постепенно перейти на новую схему проверки OS-account.

Поскольку ОС поддерживает обе версии транзакций (v0 и v1), контракт счета также должен поддерживать их.

Процесс проверки подлинности подписи

Преимущества кошельков на основе смарт-контрактов (Account Abstraction) заключается в том, что они позволяют, помимо прочего, использовать произвольную логику верификации. Но, как говорится, с большой властью приходит и большая ответственность.

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

(опять же, разница между транзакциями v0 и v1 заключается в том, кто вызывает эту логическую функцию верификации — контракт или ОС).

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

Уязвимость

В последней реализации контракта Argent, которая была развернута в сети 4 ноября и была доступна как часть Argent-X v5.0.x ранее на этой неделе, было неявное предположение, что контракт будет обрабатывать только транзакции v1. как видно из фрагмента кода ниже. Однако утверждение было помещено в функцию проверки, которая в случае транзакции v1 вызывается ОС, а в транзакции v0 должна вызываться функцией контракта __execute__ .
Таким образом, контракт учетной записи, который желает поддерживать только транзакцию версии 1, должен поместить утверждение версии в функцию __execute__ поскольку ОС не вызывает функцию __validate__

Последствия

Учитывая описанную выше уязвимость, злоумышленник может отправить любую транзакцию v0 с пустой (или тарабарской) подписью, и она пройдет без проблем и будет включена в блок как действительная транзакция.

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

Обнаружение проблемы

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

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

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

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

https://starkscan.co/tx/0xe822d983f9c5d3ff320037812633435edcd71afa725e16d84af700973b0da

Ответственное раскрытие информации

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

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

Хронология событий

  • 4 ноября 2022 года в сети был развернут новый контракт Argent
  • 14 ноября 2022 года было выпущено новое расширение Argent-X, которое использовало новый контракт на внедрение как для новых, так и для обновленных аккаунтов.
  • 16 ноября 2022 года в 21:23 по центральноевропейскому времени команда Braavos смогла провести транзакцию с пустой подписью, которая перевела средства со скомпрометированного счета Argent
  • В 22:01 по центральноевропейскому времени команда Braavos сообщила об уязвимости команде Argent через Slack, предоставив все подробности проблемы, способы ее воспроизведения и пример вредоносной транзакции в сети, а также рассказав о том, что необходимо сделать для ее устранения.
  • В 22:11 по центральноевропейскому времени команда Braavos оповестила команду Starkware через Slack, чтобы убедиться, что Аргент увидел сообщение в столь поздний час.
  • В 22:35 команда Starkware откликнулась и попыталась связаться с командой Argent
  • В 22:43: команда Argent подтвердила, что видела сообщение и занимается этим вопросом
  • В 23:53 команда Braavos предложила Starkware принять временную меру и ограничить подобные транзакции, чтобы предотвратить потерю средств до тех пор, пока не будет выработано исправление*.
  • 17 ноября в 1:03 по центральноевропейскому времени Argent обновил и представил новую версию приложения для Google Play и App Store. Версия была опубликована в открытом доступе через некоторое время после
  • 17 ноября около 14:00 по центральноевропейскому времени компания Starkware выпустила обновление для ОС StarkNet, реализующее предложенную Braavos временную меру, которая начала блокировать транзакции, подвергшиеся такому воздействию

Срочность

(*) — мы знали, что даже если Argent выпустит исправление в течение нескольких коротких часов (что и произошло!), может пройти время, пока исправленная версия будет одобрена в магазине Chrome, и еще больше времени, пока пользователи перейдут на новый контракт. Таким образом, мы продолжили работу с командой Starkware, пытаясь найти решение на уровне протокола. Тогда мы предложили заблокировать транзакции v0 к данной конкретной реализации контракта Argent и тем самым гарантировать, что злоумышленник не сможет воспользоваться ситуацией в течение нескольких дней, которые потребуются всем действующим пользователям для обновления кошелька Argent до исправленной версии.

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

Благодаря быстрым действиям всех сторон, средства не были потеряны..

Заключение

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

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

Всем разработчикам, работающим в сети, следует быть особенно осторожными и ТЕСТИТЬ ТЕСТИТЬ ТЕСТИТЬ!

Motty Lavie

Motty Lavie

Узнавайте первыми

Подпишитесь сейчас и получайте ежемесячные обновления и интересные новости о Braavos и экосистеме Starknet.