Bybit. Отчёт о взломе №02. Перевод
В прошлом отчёте нам пытались скормить ссылку: https://web.archive.org/web/20250219111919/https://app.safe.global/_next/static/chunks/pages/_app-52c9031bfa03da47.js - давайте посмотрим, что в этот раз?
На этот раз - там целых 28 страниц... Правда по сути - даже 8 нет. Итак...
Сам отчёт
См.: QmQ8TNNMVr5CFcdxtKkxzu3deFFuNSwXzMMAXxuWLCP9f3
Выглядит так:
Перевод
Сам текст документа лежит здесь: QmQ8TNNMVr5CFcdxtKkxzu3deFFuNSwXzMMAXxuWLCP9f3.
Краткое описание инцидента
21 февраля 2025 года Bybit столкнулась с утечкой безопасности, которая привела к краже более $1,4 млрд в криптовалютах, включая 401 347 ETH.
Атака была направлена на мультисиг "холодный" кошелек Bybit в Ethereum, с которого активы были переведены на неизвестный адрес и затем распределены по нескольким кошелькам.
Хронология событий
- 18 февраля 2025 г., 15:39:11 UTC: Хакер развернул вредоносный контракт по адресу 0x96221423681A6d52E184D440a8eFCEbB105C7242, содержащий логику вредоносных переводов.
- 18 февраля 2025 г., 18:00:35 UTC: Развернут ещё один вредоносный контракт по адресу 0xbDd077f651EBe7f7b3cE16fe5F2b025BE2969516, содержащий функции вывода средств.
- 21 февраля 2025 г., 14:13:35 UTC: Злоумышленник успешно создал мультиподписную транзакцию с участием трёх подписантов, включая CEO Bybit (!!!). Эта транзакция обновила мультисиг-контракт холодного кошелька Bybit (0x1Db92e2EbE8E0c075a02BeA49a2935BcD2dFCF4) на платформе Safe.Global, заменив его на вредоносный контракт (0xbDd077f651EBe7f7b3cE16fe5F2b025BE2969516), развёрнутый тремя днями ранее. Затем злоумышленник использовал бэкдор-функции sweepETH и sweepERC20 для опустошения кошелька.
Адреса, использованные хакером:
- 0xdd90071d52f20e85c89802e5dc1ec0a7b6475f92
- 0x0fa09c3a328792253f8dee7116848723b72a6d2e
- 0xe8b36709dd86893bf7bb78a7f9746b826f0e8c84
- 0x47666Fab8bd0Ac7003bce3f5C3585383F09486E2
- 0xa4b2fd68593b6f34e51cb9edb66e71c1b4ab449e
- 0x1542368a03ad1f03d96D51B414f4738961Cf4443
- 0x36ed3c0213565530c35115d93a80f9c04d94e4cb
- Signer 1: 0x1f4eb0a903619ac168b19a82f1a6e2e426522211
- Signer 2: 0x3cc3a225769900e003e264dd4cb43e90896bc21a
- Signer 3: 0xe3df2cceac61b1afa311372ecc5b40a3a6585a9e
Транзакция была отправлена ончейн с адреса 0x0fa09c3a328792253f8dee7116848723b72a6d2e
Предварительные выводы
При исследовании компьютеров трёх подписантов Bybit в файлах кэша Google Chrome был обнаружен вредоносный JavaScript-код, загруженный с app.safe.global (???).
(Menaskop: Как видим, здесь уже указан сам загруженный файл, а не его web-версия... Откуда же уверенность в загрузке? Читаем дальше):
Заголовки ответов вредоносного javascript, возвращённые
из app.safe.global (из данных кэша Chrome).
ПРОЩЕ ГОВОРЯ: им могли и этот сайт подменить, но Bybit и "исследователи" упорно пытаются доказать нечто совсем иное.
(Что именно? Читаем опять дальше):
Предварительные выводы (продолжение)
Были обнаружены два модифицированных JavaScript-файла:
- В момент атаки Last-Modified временная метка вредоносного JavaScript-файла https://app.safe.global/_next/static/chunks/pages/app-52c9031bfa03da47.js была такой: Среда, 19 февраля 2025 года, 15:29:43 GMT.
- Однако после атаки этот же файл на app.safe.global имел Last-Modified метку: Пятница, 21 февраля 2025 года, 14:15:32 GMT, что примерно на 2 минуты позже успешного выполнения взломанной транзакции (21 февраля 2025 года, 14:13:35 GMT).
Файл 6514.b556851795a4cbaa.js:
- В момент атаки Last-Modified временная метка вредоносного JavaScript-файла https://app.safe.global/_next/static/chunks/6514.b556851795a4cbaa.js была такой: Среда, 19 февраля 2025 года, 15:29:25 GMT.
- Однако после атаки этот же файл на app.safe.global имел Last-Modified метку Пятница, 21 февраля 2025 года, 14:15:13 GMT, что также примерно на 2 минуты позже успешного взлома.
Данные из архива Wayback Machine
В архиве Wayback Machine был обнаружен экземпляр этого вредоносного JavaScript-файла, датируемый 19 февраля 2025 года, 17:29:05 GMT https://web.archive.org/web/20250219172905js_/https://app.safe.global/_next/static/chunks/pages/app-52c9031bfa03da47.js.
Анализ вредоносного кода
Различия между безопасным и вредоносным JavaScript-кодом представлены ниже:
- Один файл изменяет вызовы executeTransaction и signTransaction.
- Другой файл модифицирует вызов useGasLimit.
- Изменение вызова executeTransaction
На стр. 9-24 отчёта можете взглянуть на код: QmQ8TNNMVr5CFcdxtKkxzu3deFFuNSwXzMMAXxuWLCP9f3.
Механизм атаки
Атака была специально направлена на Bybit путём внедрения вредоносного JavaScript-кода в app.safe.global, который использовали подписанты Bybit.
Вредоносная нагрузка активировалась только при выполнении определённых условий, что позволяло скрывать бэкдор от обычных пользователей, но при этом компрометировать цели с высокой ценностью.
Оба вредоносных исправления сначала извлекают и нормализуют адреса подписанта и Safe-кошелька. Затем проверяется, содержатся ли эти адреса в предопределённом списке целей:
- Если адрес подписанта является целью в signTransaction, страница перезагружается немедленно.
- В атаке было две целевые подписи:
- Этот механизм блокировал 0x828… от подписания, позволяя отправлять только новые транзакции (причина пока не установлена).
- Основное внимание в атаке было направлено на АДРЕС МУЛЬТИСИГА Safe: если адрес Safe являлся целью и тип текущей транзакции был установлен в значение по умолчанию (0), применялся вредоносный код.
Процесс модификации
- Создание резервной копии оригинальных данных: Исходные данные транзакции клонируются перед внесением любых изменений.
- Подмена полей транзакции:
- Поле "to" (получатель) заменяется на адрес злоумышленника.
- Код операции изменяется с 0 на 1 (что указывает на `delegatecall`).
- Поле "data" модифицируется: содержащий закодированные инструкции для перевода токенов или выполнения вредоносных действий.
- Поля "value" и "gas" (safeTxGas) также заменяются на значения, заданные злоумышленником.
- Вызов метода Safe SDK:
- executeTransaction: Использует метод executeTransaction для выполнения измененной транзакции.
- signTransaction: Использует метод signTransaction для подписания изменённой транзакции.
- Восстановление оригинальных данных: После выполнения вредоносной транзакции данные возвращаются в первоначальное состояние, что затрудняет обнаружение атаки.
После того как транзакция была выполнена или подписана, исходные данные транзакции восстанавливаются, либо путём обновления результата (в случае подписания транзакции), либо объекта транзакции (в обоих случаях), что гарантирует, что вмешательство остаётся скрытым от последующей обработки.
Следуя этой процедуре, оба патча захватывают нормальный поток транзакции.
Атака эффективно перенаправляет выполнение или подписывание транзакции таким образом, что средства или операции направляются на адрес атакующего с вредоносным приложением. Несмотря на использование различных методов SDK.
Предварительные выводы
Безвредный файл JavaScript на app.safe.global, по всей видимости, был заменён на вредоносный код 19 февраля 2025 года в 15:29:25 UTC, с целью нацеливания на Ethereum Multisig Cold Wallet компании Bybit (0x1Db92e2EeBC8E0c075a02BeA49a2935BcD2dFCF4).
Атака была спроектирована для активации во время следующей транзакции Bybit, которая произошла 21 февраля 2025 года в 14:13:35 UTC.
На основе результатов расследования машин подписантов Bybit и кэшированного вредоносного JavaScript-пейлоада, найденного в Wayback Archive, мы приходим к выводу, что аккаунт/API-ключ AWS S3 ИЛИ CloudFront компании Safe.Global, вероятно, был раскрыт или скомпрометирован. (???)
(Примечание: в сентябре 2024 года Google Search анонсировал интеграцию с Wayback Archive, предоставив прямые ссылки на кэшированные версии сайтов в Wayback Machine. Это подтверждает подлинность кэшированного вредоносного файла.). (Прим. Menaskop: это лишь подтверждает, что кто-то работал с такой версией для архива и, что более удивительно, сохранил её. Но это отдельный вопрос).
Необходимо провести дополнительное расследование, чтобы подтвердить результаты и выяснить коренную причину.
Menaskop
Несмотря на то, что оба отчёта из паблика исчезли почти сразу же, мне удалось их найти (спасибо комьюнити!). И вот мои выводы:
- Атака была именно целевая. Какие именно методы/способы/приёмы в ней использовались - ВАЖНО, НО НЕ снимает ответственности с Bybit, т.к. атака ровно такая же как на Radiant: по всем векторам - от смены адресов - до ошибок во время подписания.
- Нас хотят убедить, что виноваты все: Ledger, Safe, Amazon (AWS) и т.д., но Bybit - это глыба, скала, надёжность. Но это не так.
- То, что подписантом является CEO и подписантом последним, а не глава отдела безопасности - это просчёт не простительный.
Всё остальное рассказал на Forklog - ждите - скоро подкаст и