Исследователи безопасности из компании JFrog обнаружили и проанализировали сложный вредоносный пакет в репозитории NPM. Пакет под названием "duer-js", опубликованный пользователем "luizaearlyx", представляет собой многостадийный вор информации (инфостилер), нацеленный на системы Windows и использующий изощренные методы обфускации. По данным на момент публикации, пакет оставался активным.
Описание
Основная вредоносная активность пакета, самоназванного «Bada Stealer», заключается в краже конфиденциальных данных с зараженного компьютера. Однако его особенностью является загрузка второй, дополнительной полезной нагрузки (payload). Эта вторая стадия предназначена для внедрения в клиент мессенджера Discord и перехвата данных непосредственно в момент их ввода пользователем, включая платежную информацию.
Как отмечают аналитики, простое удаление пакета в данном случае недостаточно для полного устранения угрозы. Злоумышленники реализовали механизмы сохранения (persistence) и сложное скрытие кода, что требует от пользователей и администраторов выполнения комплекса мер по реагированию.
Многослойная обфускация и анализ кода
Исходная точка входа пакета - файл "index.js" - содержала одну чрезвычайно длинную строку длиной почти 64 тысячи символов, обернутую в функцию "eval()". Код был намеренно усложнен для затруднения анализа. В частности, исследователи обнаружили встроенную защиту от модификации, которая выводила сообщение «Error: the code has been tampered!» при любой попытке изменить и запустить скрипт.
Расшифровка потребовала нескольких этапов. Изначально закодированная строка проходила через механизм XOR с ключом, вычисляемым во время выполнения. После первой расшифровки выполнялась следующая операция "eval()", работавшая с еще одним URI-закодированным и зашифрованным XOR массивом. Этот массив, как выяснилось, являлся таблицей строк, используемой основной логикой вредоноса. Применив XOR-ключ 11, исследователи получили читаемую таблицу, что позволило восстановить исходный код первой стадии вредоноса почти в оригинальном виде.
Функционал первой полезной нагрузки: массовая кража данных
Перед началом сбора информации вредоносная программа принудительно завершает процессы популярных браузеров и Telegram. Далее она систематически собирает широкий спектр конфиденциальных данных.
Основными целями становятся данные учетных записей Discord: токены, информация о пользователе, тип подписки Nitro, привязанные платежные методы, списки друзей и серверов, а также резервные коды двухфакторной аутентификации. Параллельно вор атакует браузеры, такие как Chrome, Edge, Brave, Opera и Yandex, извлекая сохраненные пароли, файлы cookies, данные автозаполнения и информацию о банковских картах. Также под угрозой находятся данные криптокошельков (например, Exodus) и конфигурация клиента Steam.
Собранная информация структурируется и отправляется злоумышленникам через Discord Webhook. В качестве резервного канала эксфильтрации используется легитимный файлообменный сервис Gofile.io. Вредонос получает адрес сервера через API Gofile, загружает туда данные и отправляет ссылку для скачивания в тот же Webhook, обеспечивая возможность доступа к данным в любое время.
Попытка добиться постоянного присутствия в системе путем копирования исполняемого файла "node.exe" в автозагрузку Windows оказалась неудачной из-за особенностей реализации, что можно считать ошибкой злоумышленников.
Вторая стадия: внедрение в Discord и перехват в реальном времени
Первая стадия загружает вторую полезную нагрузку с удаленного сервера. Этот код, обфусцированный аналогичным способом, предназначен для внедрения в десктопное приложение Discord. Вредонос находит локальную папку с установленным Discord и заменяет один из его внутренних JavaScript-файлов на свой собственный.
Основная задача этого модуля - перехват сетевого трафика клиента Discord в реальном времени. Используя API отладчика Electron ("webContents.debugger"), вредоносная программа подключается к внутреннему веб-содержимому приложения. Она отслеживает сетевые запросы к критически важным эндпоинтам, таким как "/login", "/register", "/mfa/totp". При обнаружении соответствующего запроса скрипт перехватывает тело ответа или отправляемые данные, получая прямой доступ к вводимым логинам, паролям, сессионным токенам и кодам двухфакторной аутентификации.
Особую опасность представляет функционал перехвата платежей. Вредонос способен перехватывать данные банковских карт (номер, CVC, срок действия) в момент их привязки или использования в Discord, отправляя эту информацию злоумышленникам еще до того, как она будет передана на легитимный платежный шлюз. Кроме того, вторая стадия обладает возможностью самообновления из указанного репозитория на GitHub.
Рекомендации по устранению угрозы
Пользователям, которые могли установить пакет "duer-js", необходимо предпринять комплекс мер. Во-первых, следует удалить вредоносный пакет через менеджер npm. Крайне важно отозвать и заменить все потенциально скомпрометированные данные: пароли от браузеров, сессионные токены, особенно токен Discord. Для полного удаления второй стадии необходимо полностью закрыть Discord, удалить приложение стандартными средствами Windows и вручную очистить его папки в "%LOCALAPPDATA%" (Discord, DiscordPTB, DiscordCanary), после чего установить чистую версию с официального сайта. Также нужно проверить автозагрузку системы на наличие подозрительных ссылок на "node.exe" и включить двухфакторную аутентификацию во всех важных сервисах.
Выводы
Несмотря на относительно небольшое количество загрузок (около 528), пакет представляет значительную угрозу для пострадавших пользователей. Его отличают многостадийность, сложная обфускация и целенаправленный механизм кражи финансовых данных через внедрение в доверенное приложение. Наличие связанного репозитория на GitHub, созданного более двух лет назад, указывает на возможную длительную активность угрозы. Этот инцидент в очередной раз подчеркивает важность проверки сторонних зависимостей в проектах. Пакет уже обнаружен системами безопасности JFrog Xray и JFrog Curation.
Индикаторы компрометации
URLs
- https://discord.com/api/webhooks/1455324432548499496/6oMVbi2PYDxrBiOtHe2tpBSUOdBJpz2RDEiwLkHUqeqJbgIPiONHafMP5tHXYjAVK2R3
- https://ghostbin.axel.org/paste/yckfb/raw
- https://github.com/xSalca/
- https://github.com/xSalca/Viral
- https://raw.githubusercontent.com/xSalca/Viral/main/index.js
SHA256
- a91dd2e6a5ab21b8dd3bac7fc9be928b0764075fa71e33bc5ecd2f237b1f82c3
NPM package
- duer-js
- XRAY-938808
NPM user
- luizaearlyx
