Расширения Firefox выдавали себя за криптокошельки и похищали фразы восстановления

Расширения Firefox выдавали себя за криптокошельки и похищали фразы восстановления

Кластер подписанных расширений для Firefox выдавал себя за криптокошельки Phantom, Jupiter и Bitget и содержал код для кражи фраз восстановления и закрытых ключей. Код находился в пакетах, которые Mozilla проверяла перед публикацией. Все три карточки оставались в каталоге Firefox Add-ons во время анализа и исчезли из него к моменту публикации. Расширение Phantom дополнительно несло загрузчик, который получал полезную нагрузку с сервера уже после проверки.

Описание

Подделки копировали названия и оформление. Отображаемое имя расширения Phantom собирали из Unicode-символов, которые на странице читаются как "Phantom"; карточка использовала настоящую иконку призрака и рекламный текст с заголовком об официальном кошельке. Её рейтинг, по данным Socket Threat Research Team, подняли до 3,9 по 546 отзывам. Карточка Jupiter представлялась как "Jupiter" и утверждала, что её создала Jupiter Exchange. У расширения Bitget внутреннее имя в манифесте было "TabFlow Pro", но пользователю показывали бренд Bitget Wallet.

Страница расширения

Приманкой служила узнаваемость брендов. Настоящий Phantom показывает 5 000 000 пользователей в Chrome Web Store и около 83 000 ежедневных пользователей в Firefox Add-ons. Запрошенные разрешения соответствовали задаче сбора секретов: Phantom получал доступ к вкладкам и данным всех сайтов. При этом панель разрешений сообщала, что разработчик не требует сбора данных, а политика конфиденциальности отсутствовала.

В подписанном пакете Phantom работал загрузчик. Он собирал адрес сервера из массива кодов символов, запрашивал конфигурацию, декодировал полезную нагрузку из base64 и исполнял её в контексте страницы. Сначала код внедрялся в основной контекст страницы, затем, при неудаче, в изолированный контекст расширения. Повторное внедрение происходило при каждой загрузке вкладки, а также при установке и запуске браузера. На момент анализа сервер возвращал активную конфигурацию и полезную нагрузку размером 4 029 байт.

Полученная нагрузка искала фразы восстановления и закрытые ключи. Она читала значения полей ввода и текстовых областей, отслеживала вставку и потерю фокуса, а также просматривала текст страницы в поисках нумерованной сетки слов. Среди строк она распознавала фразы из 12, 15, 18 или 24 слов и закрытые ключи Ethereum и Solana. В основном контексте страницы код перехватывал подключение к провайдеру Solana, чтобы получить открытый ключ. Собранные данные отправлялись на сервер в формате JSON.

Jupiter и Bitget обходились без удалённого загрузчика: их похитители учётных данных находились внутри пакета и отправляли мнемоническую фразу на поддомен с названием бренда. Jupiter передавал фразу по путям "standalone" и "mnemonic" и запрашивал доступ к Trezor Connect. Все три пакета содержали полный похититель, который работал постоянно; сканер в этом анализе оценил каждый в 10 из 10. У Phantom похититель работал из служебного файла аналитики, у Jupiter - из фонового сценария размером 621 кБ и отдельного перехватчика, у Bitget - из перехватчика и фонового обработчика. Серверный компонент Phantom на Node.js писал секреты в локальные файлы, пересылал их в Telegram-бот и выводил средства на заданные кошельки.

Второй серверный файл возвращал неактивную конфигурацию во время проверки Mozilla, а комментарий в коде пояснял, что полезная нагрузка попадает в расширение после "переключения одобрения". Инфраструктура сходилась к одному домену, скрытому за Cloudflare; под ним оператор подготовил как минимум пять поддоменов с названиями брендов, включая Coinbase и Exodus. Тот же ответ сервера, что у подтверждённых узлов Jupiter и Bitget, указывал на подготовку к атаке на бренды Coinbase Wallet и Exodus, хотя соответствующих карточек в каталоге на момент анализа не нашли. Каждую из трёх подтверждённых карточек опубликовали с отдельной одноразовой учётной записи разработчика AMO. В пакетах Phantom и Jupiter лежал файл с запросом на обход ограничений ИИ-ассистента, который расширение не загружало; предположительно он свидетельствует о написании вредоносного кода с помощью ИИ и о попытке обойти ИИ-проверку.

Код отправлял секрет оператору, как только пользователь вводил фразу восстановления или вставлял закрытый ключ; обладатель такой фразы контролирует кошелёк и может вывести все активы. Рейтинг карточки Phantom рос: примерно за два дня число отзывов увеличилось с 275 до 546, а средняя оценка поднялась с 2,9 до 3,9. Такой рост вытеснял однозвёздочные отзывы, в которых пользователи сообщали о потере средств, но эти сообщения остаются непроверенными. Подтверждено, что код собирал и отправлял секреты; подтверждено ли, что конкретные средства вывели, - нет. Описанные признаки могут давать ложные срабатывания, а за пределами анализа остались распространение расширений, число установок и связь инфраструктуры с конкретными людьми.

Индикаторы компрометации

Комментарии: 0