Apricot Phase 6: отмена функции Native Asset Call

stsoen
AVA Russia
Published in
5 min readSep 17, 2022

--

Введение

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

В позапрошлое воскресенье, 4 сентября 2022 года, мы получили отчет о проблеме от команд разработчиков Abracadabra и Sushi, которые, в свою очередь, получили информацию от Statemind и Immunefi. Как оказалось, прекомпиляция Native Asset Call, специальной функции в C-Chain, используемой для взаимодействия с нативными токенами Avalanche, может быть использована для обмана определенных контрактов, выполняющих вызовы и защищенных черными списками к предоставленным пользователем контрактам для вызова нежелательных целей. Эта функция не существует в других evm-подсетях, поэтому подсети не затрагиваются.

Мы невероятно рады и благодарны сообщить, что благодаря помощи и сотрудничеству сообщества все средства теперь в безопасности, обнаруженной проблемой никто не воспользовался и код был исправлен, а работа Avalanche остается стабильной. Из соображений предосторожности команды Abracadabra и Sushi временно перевели средства своих пользователей из затронутых контрактов, чтобы обезопасить их, после чего вернули их пользователям. В ближайшее время после того, как все средства будут возвращены, вы сможете ознакомиться с подробными отчетами от их команд, когда они их предоставят.

Ava Labs вознаградит Statemind, Abracadabra и Sushi за ответственное раскрытие информации значительным вознаграждением.

Проблема

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

Проблема, о которой мы говорим в этом отчете, возникла из-за предварительной компиляции, которая уникальна для Avalanche C-Chain: Native Asset Call. Этот предварительный компилятор используется для предоставления той же функциональности низкоуровневого вызова для нативных токенов Avalanche, что и для обработки нативных токенов AVAX.

EVM предоставляет код операции CALL, который выполняет два действия:

  1. Перевод нативной монеты от вызывающего абонента к вызываемому
  2. Если вызываемый объект является контрактом (или контрактом предварительной компиляции), он вызывается указанными данными вызова.

Native Asset Call был добавлен для обеспечения той же функциональности, за исключением того, что он выполняет передачу нативного токена сети Avalanche вместо собственного токена в EVM. В качестве входных данных он принимает следующие аргументы:

  1. Адрес получателя
  2. AssetID нативного токена Avalanche для передачи
  3. Сумма нативного токена Avalanche для перевода
  4. Calldata для передачи в вызова на адрес получателя

Native Asset Call выполняет два простых шага (аналогично низкоуровневому опкоду CALL EVM):

  1. Перевод токена Avalanche Native Token на адрес получателя
  2. Если вызываемый объект является контрактом, то он вызывается с предопределенными данными вызова.

Важным для реализации Native Asset Call является адрес, используемый в качестве контекста вызова, когда Native Asset Call вызывает контракт получателя.

Чтобы обеспечить ту же функциональность, что и код операции CALL, вызов должен обрабатываться так, как если бы он исходил от исходного вызывающего абонента Native Asset Call, а не от собственного адреса Native Asset Call. Таким образом, адрес вызывающего абонента устанавливается на адрес, который непосредственно вызвал Native Asset Call.

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

Например, это повлияло на контракты Cauldron команды Abracadabra, поскольку он предоставляет функциональные возможности для выполнения низкоуровневых вызовов от имени пользователя после проверки того, что адрес получателя вызова не является адресом BentoBox или адресом Cauldron:

https://github.com/Abracadabra-money/magic-internet-money/blob/23266d17969a95e69199670cba9d0060bff33340/contracts/CauldronV3_1.sol#L410

Этот низкоуровневый вызов, если он был бы направлен на вызов Native Asset Call, привел бы к потенциальной проблеме, поскольку вызывающий объект предполагал бы, что ни один вызываемый объект не сохранит контекст вызова, что сделало бы проверки входных аргументов неэффективными.

Поэтому разработчикам Sushi и Abracadabra за их усердную работу в расследовании этой ошибке и репорте об этой проблеме, а также Statemind за предупреждение.

Исправление

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

Команда разработчиков Ava Labs быстро выпустила исправление, запрещающее выпуск любых будущих блоков, содержащих взаимодействие с Native Asset Call, и помечающих их как недействительные. Затем мы скоординировали свои действия с операторами нод по всему миру, чтобы перевести как можно больше нод и стейкеров на обновленную версию. Благодаря оперативным действиям операторов нод, большая часть сети была обновлена ​​в течение нескольких часов, и никому не удалось воспользоваться этой ошибкой.

Планировалось, что новый выпуск предоставит более чистое и элегантное исправление, в котором будет полный отказ от вызовов Native Asset. Однако это обновление было реализовано некорректно и устарело, хотя предыдущее исправление отключило его. Поэтому можно было увидеть кратковременное повторное появление Native Asset Calls сразу после активации Apricot Phase 6 (обычно используется ботами с автоматическим составлением компаундов). Ни одна из этих транзакций не содержит эксплойта.

Чтобы повторно решить эту проблему, разработчики выпустили окончательный патч, чтобы снова отказаться от будущих блоков, содержащих взаимодействие с Native Asset Call. Благодаря быстрым действиям операторов нод, обновление снова было распространено в течении нескольких часов.

В настоящее время взаимодействие с предварительной компиляцией Native Asset Call в тестовой сети Fuji и в мейннете закрыто. Все контракты на платформе Avalanche, которые были открыты для этого эксплойта, теперь безопасны, и для них не требуется какое-либо взаимодействие или модификация. AvalancheGo@v1.9.0 полностью откажется от этой предварительной компиляции и представит более безопасную замену для восстановления полной функциональности собственных токенов Avalanche в C-Chain.

Вывод

Большое спасибо командам Statemind, Abracadabra и Sushi, а также всему сообществу валидаторов Avalanche за столь оперативное обновление своих нод в праздничные выходные, что позволило сделать невозможным потенциальное использование этой проблемы злоумышленником. Все средства в сохранности, и взаимодействие с сетью Avalanche идет без каких-либо проблем в течение последних нескольких дней.

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

--

--