Уязвимость контракта кошелька Zero-Click Argent-X

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

TL;DR

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

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

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

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

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

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

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

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

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

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

Уязвимость

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

Последствия

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

Важно отметить, что Это атака «zero-click», не требующая никаких действий или взаимодействия с пользователем. Злоумышленник мог просто просмотреть все новые и обновленные учетные записи 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 обновил и представил новую версию для одобрения в в магазинах. Версия была опубликована в открытом доступе через некоторое время после
  • 17 ноября около 14:00 по центральноевропейскому времени компания Starkware выпустила обновление для ОС StarkNet, реализующее предложенную Braavos временную меру, которая начала блокировать транзакции, подвергшиеся такому воздействию

Срочность

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

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

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

Заключение

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

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

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

Motty Lavie

Motty Lavie

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

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