
В последнее время много внимания уделяется «контр-эксплойту» для вывода средств из хранилища (Vault) MakerDao с помощью мультисиг-кошелька Oasis. Тем временем мы получили несколько запросов о том, является ли BlockSec тем самым «белым хакером», стоящим за этой операцией, поскольку мы участвовали в контр-эксплойте, чтобы помочь Platypus вернуть 2,4 млн 18 февраля. Мы хотим прояснить, что BlockSec не участвовала ни в каких действиях по делу Jump. После детального анализа (спасибо за отличный разбор, опубликованный в BlockWorks Дэном Смитом), мы считаем, что метод, использованный в «контр-эксплойте» Jump, коренным образом отличается от случая с Platypus.

Однако, исходя из нашего анализа, ключевыми шагами контр-эксплойта являются:
- Отключение отложенного выполнения (delayed execution). Это действие, согласно проекту, должно выполняться владельцем контракта Service Registry, которым является мультисиг-кошелек Oasis.
- Изменение адреса зарегистрированного контракта для критических ролей, включая AUTOMATION_EXECUTOR для контракта AutomationBot и MCD_VIEW, MULTIPLY_PROXY_ACTIONS для контракта CloseCommand. Это позволяет мультисиг-кошельку Oasis напрямую вызывать AutomationBot для выполнения команды закрытия, при этом реальная операция подменяется новой для перемещения хранилищ (Vaults) злоумышленника.
Наш анализ показывает, что эти ключевые шаги НЕ связаны с заявленными уязвимостями в доступе к административному мультисиг-кошельку.
Отказ от ответственности: Этот блог написан на основе ончейн-транзакций и публичной информации. Если у вас есть вопросы или комментарии, не стесняйтесь обращаться к нам по адресу [email protected].
Общий процесс
В ходе этой операции было задействовано несколько адресов. Мы перечислили некоторые из них в следующем документе Google.
https://docs.google.com/spreadsheets/d/1k0PEci8wQ16X7JT7KRq9SvhaCA2yerJcqLn6EfAoPZs/edit?usp=sharing
В частности, общая идея контр-эксплойта в отношении Jump заключается в следующем.
-
Хранилища Maker злоумышленника могут управляться смарт-контрактом Oasis AutomationBot, так как злоумышленник активировал услуги автоматической продажи и покупки, предлагаемые Oasis.
-
Управлять AutomationBot может только адрес с ролью AUTOMATION_EXECUTOR. Этот адрес является конфигурацией в контракте Oasis Service Registry, которая может быть обновлена мультисиг-кошельком Oasis. Однако обновление конфигурации контракта Oasis Service Registry имеет механизм отложенного выполнения, который может быть отключен мультисиг-кошельком Oasis.
-
Сам контракт и функция, выполняемая AutomationBot, также настраиваются в Oasis Service Registry.
Таким образом, мультисиг-кошелек Oasis сначала отключает отложенное выполнение контракта Oasis Service Registry и меняет конфигурацию в нем, назначая роль AUTOMATION_EXECUTOR самому себе (мультисиг-кошельку). Изменение вступает в силу немедленно. Затем мультисиг-кошелек вызывает AutomationBot для выполнения команды, которая может захватить хранилища Maker злоумышленника (переместить и передать). Поскольку AutomationBot может управлять хранилищами злоумышленника, вся операция проходит успешно.
Мы считаем этот процесс принципиально отличным от случая с Platypus, где мы обнаружили уязвимость в контракте атакующего и сообщили об этом Platypus. Затем Platypus воспользовались уязвимостью в контракте злоумышленника, чтобы вернуть принадлежащие им средства. Однако в случае с Jump мультисиг Oasis отключает механизм отложенного выполнения, обновляет критические конфигурации, которые могут полностью изменить поведение контракта, и использует управленческую роль AutomationBot для операций с хранилищами Maker от имени злоумышленника.
Далее мы подробно опишем весь контр-эксплойт Jump.
Подробные шаги
Операция затрагивает несколько протоколов и сторон, включая Jump, Oasis, злоумышленника Wormhole и Maker. Обратите внимание, что Maker не предпринимает никаких действий во время операции.
В частности, злоумышленник создает хранилища Maker (30100 и 30179), использует ETH в качестве обеспечения и берет в долг DAI из хранилища. Злоумышленник также использовал услуги автоматической продажи и покупки от Oasis для управления коэффициентом обеспечения хранилища Maker.
Чтобы использовать сервис автоматизации Oasis, в список управления хранилищем необходимо добавить смарт-контракт под названием AutomationBot, предоставляемый Oasis. Это означает, что AutomationBot получает контроль над хранилищем Maker, созданным злоумышленником. После этого AutomationBot может манипулировать хранилищем и перевести обеспечение и долг хранилища на другое, контролируемое Jump. Это базовый процесс «контр-эксплойта». Заметьте, что для вызова AutomationBot транзакция должна быть инициирована с адреса, зарегистрированного как AUTOMATION_EXECUTOR в контракте ServiceRegistry.
Шаг 1: добавление адреса 04e1 в мультисиг-кошелек Oasis
Транзакция добавляет адрес 04e1 в мультисиг-кошелек Oasis. В настоящее время этот кошелек имеет 12 адресов и требует подтверждения четырех подписантов.

Шаг 2: Отключение отложенного выполнения Oasis Service Registry
Эта транзакция отключает отложенное выполнение Oasis Service Registry путем вызова changeRequiredDela(0). Заметьте, что Oasis Service Registry — это смарт-контракт, хранящий критически важную информацию конфигурации, которая будет использоваться AutomationBot. Как правило, для критических операций (например, updateNamedService, которая будет использоваться в «контр-эксплойте») изменение конфигурации имеет механизм отложенного выполнения. Обычно отложенное выполнение является механизмом безопасности для прозрачности, чтобы обновление критической информации не вступало в силу немедленно, и другие могли проверить операцию.
Обратите внимание, что выполнение команды changeRequiredDelay ограничено отложенным выполнением (поскольку изменение reqDelay еще не вступило в силу).


Шаг 3: Выполнение контр-эксплойта
Эта транзакция выполняет контр-эксплойт. Давайте углубимся в трассировку выполнения, предоставленную Phalcon, инструментом анализа транзакций, разработанным BlockSec.
Обратите внимание, что эта транзакция инициирована с адреса 04e1 и выполнена через мультисиг-кошелек Oasis, что означает, что операция была подписана как минимум четырьмя подписантами.
Шаг 3.1 Отключение отложенного выполнения
Как видно из трассировки, задержка снова установлена на ноль. Это сделано для применения действия по отключению отложенного выполнения из шага 2.

Шаг 3.2: Создание двух контрактов и обновление реестра сервисов
Создаются два новых контракта, которые будут использоваться в качестве контрактов MCD_VIEW и MULTIPLY_PROXY_ACTIONS.
- MCD_VIEW: 0xceca8d8410797bc6c575fd8ba957708d1e85ed36
- MULTIPLY_PROXY_ACTIONS: 0xcaef24016d0fba2c1a9427371e0d79c5781b6ea8
Затем эти два контракта обновляются в контракте Oasis Service Registry.

Шаг 3.3: Смена исполнителя автоматизации

Мультисиг Oasis зарегистрирован в качестве AUTOMATION_EXECUTOR в контракте ServiceRegistry. Это необходимо, так как только зарегистрированный контракт с этой ролью может вызывать контракт AutomationBot.


Шаг 3.4: Приказ AutomationBot закрыть хранилище злоумышленника
Критический процесс начинается с функции execute контракта AutomationBot. Подробные выполняемые функции передаются через аргументы.
Чтобы понять весь процесс, давайте сначала взглянем на эту функцию.

Логика высокого уровня заключается в том, что бот сначала выводит DAI из хранилища (строка 268), а затем вызывает конкретный контракт команды для выполнения операций с хранилищем (задается cdpId) (строка 274-278). В процессе используется адрес CloseCommand. После этого выполняется проверка isExecutionCorrect.
Ниже показана функция execute контракта CloseCommand. Он получает адрес контракта актуального исполнителя из контракта реестра сервисов, используя KEY MULTIPLY_PROXY_ACTIONS. Заметьте, что адрес контракта, соответствующий MULTIPLY_PROXY_ACTIONS, был обновлен на новый. Таким образом, фактическое выполнение CloseCommand позволяет выполнять произвольные операции в новом контракте.


Помните, что isExecutionCorrect вызывается в CloseCommand для проверки успешности выполнения (строка 278 в AutomationBot.sol). Поскольку адрес просмотрщика (viewer) был обновлен, возвращаемое значение проверки viewerContract.getVaultInfo(cdpId) может быть произвольным значением, которое проходит проверку на строке 24 (CloseCommand.sol).
После изучения кода давайте посмотрим на трассировку выполнения. Из нее видно, что automationBot вызывает контракт CloseCommand. Контракт CloseCommand вызывает замененный контракт MULTIPLY_PROXY_ACTIONS, чтобы открыть новое хранилище (30231), перенести хранилище 30100 (злоумышленника) в 30231 (новое) и передать новое хранилище 30231 мультисиг-кошельку Oasis. Аналогичная операция выполняется для другого хранилища злоумышленника (30179).

Шаг 3.5 Восстановление состояния

Восстанавливается измененная запись в реестре сервисов, и отложенное выполнение снова включается.
Шаг 3.6 Передача хранилищ адресу 1536
Теперь новые хранилища (30231 и 30232) контролируются мультисиг-кошельком Oasis. Затем хранилища передаются на адрес 0x15364305a06ba3ac6ba13dfe97ca0bad639adf41 в данных транзакциях [TX1 TX2]. После этого данный адрес может погасить долг в хранилище и вывести обеспечение (Ethereum). Поскольку коэффициент обеспечения был высоким (около 293% для хранилища 30100), погашение долга и вывод обеспечения позволяют вернуть около 120 000 Ethereum ценой выплаты долга около 76 млн из хранилища 30100. Читатели могут обратиться к документации протокола Maker для получения дополнительной информации об этих операциях.

О компании BlockSec
BlockSec — это передовая компания в области безопасности блокчейна, основанная в 2021 году группой всемирно признанных экспертов по безопасности. Компания стремится повысить безопасность и удобство использования развивающегося мира Web3 для содействия его массовому принятию. С этой целью BlockSec предоставляет услуги аудита безопасности смарт-контрактов и сетей EVM, платформу Phalcon для разработки безопасности и проактивного блокирования угроз, платформу MetaSleuth для отслеживания средств и расследований, а также расширение MetaSuites для эффективной работы разработчиков Web3 в криптомире.
На сегодняшний день компания обслужила более 300 уважаемых клиентов, таких как MetaMask, Uniswap Foundation, Compound, Forta и PancakeSwap, и получила десятки миллионов долларов США в двух раундах финансирования от видных инвесторов, включая Matrix Partners, Vitalbridge Capital и Fenbushi Capital.
Официальный сайт: https://blocksec.com/
Официальный аккаунт в Twitter: https://twitter.com/BlockSecTeam



