Атака на цепочку поставок npm: злоумышленники маскируются под корпоративные пакеты и собирают данные разработчиков

information security

Экосистема открытого кода снова становится площадкой для изощрённых кибератак, нацеленных на разработчиков корпоративного ПО. На этот раз под ударом оказались пользователи реестра npm: группа, действующая под несколькими вымышленными именами, распространила десятки вредоносных пакетов, которые маскируются под внутренние библиотеки крупных компаний. Цель атаки - не немедленное хищение данных или шифрование, а скрытая разведка: сбор информации об окружении, учётных данных и процессах непрерывной интеграции для последующей полномасштабной компрометации.

Описание

В конце мая 2026 года специалисты Microsoft Threat Intelligence зафиксировали две волны публикации вредоносных пакетов в npm. Первая волна пришлась на вечер 28 мая: три аккаунта - mr.4nd3r50n, ce-rwb и t-in-one - выложили внушительное количество модулей. В общей сложности было опубликовано 45 пакетов, объединённых единой тактикой и инфраструктурой. Все они используют метод подмены зависимостей, известный как dependency confusion. Поясним: если внутри компании используется закрытый пакет с определённым именем, а злоумышленник выкладывает в общедоступный реестр модуль с тем же названием, но с более высокой версией, менеджер пакетов может скачать именно вредоносную версию. Это особенно опасно, когда разработчики не настроили строгое разрешение на частный реестр.

Пакеты имитируют внутренние пространства имён девяти организаций: среди прицелов - @cloudplatform-single-spa, @wb-track, @data-science, @payments-widget, @travel-autotests, @t-in-one, @capibar.chat и @sber-ecom-core. Некоторые названия прямо указывают на сервисы: например, sberpay-widget - подделка виджета СберПэй, а ssh-keys, enterprise, monitoring выглядят как обычные корпоративные утилиты. Чтобы обойти поверхностную проверку, в файлах package.json проставлены подставные ссылки на корпоративный GitHub, Jira и документацию. Версии пакетов - либо завышенные до 100.100.100, чтобы гарантированно победить в разрешении зависимостей, либо близкие к реальным (3.5.22).

При установке любого из этих модулей срабатывает автоматический сценарий postinstall. Он прописан непосредственно в package.json и запускается без участия разработчика - достаточно просто выполнить npm install для проекта, который включает вредоносный пакет прямо или транзитивно. Сам скрипт размером около 7 килобайт представляет собой сильно обфусцированный (запутанный) JavaScript-код, использующий техники obfuscator.io: строки закодированы в массиве и декодируются во время исполнения, поток управления сплющен, внедрён мёртвый код для затруднения анализа.

Далее разворачивается цепочка загрузки. Сначала скрипт проверяет, не запущен ли он в среде непрерывной интеграции (CI/CD) - если обнаружена переменная окружения CI, выполнение молча прекращается, чтобы не привлекать внимание. Затем проверяется версия Node.js (не ниже 16), после чего создаётся кэш-директория в ~/.cache, и если для данного пакета и проекта уже есть запись, скрипт завершается - это предотвращает повторные срабатывания и снижает шансы детектирования по сетевым соединениям. После определения платформы (Windows, macOS или Linux) скрипт выполняет HTTPS-запрос к командно-контрольному серверу (C2) по адресу https://oob.moika[.]tech/payload/<platform>. Ответ - бинарный файл размером около 17 килобайт, который записывается во временную папку как ._<scope>_init.js и запускается в фоновом процессе, не привязанном к родительскому процессу npm install.

Интересна архитектура полезной нагрузки. Она передаётся с предустановленными переменными окружения, в том числе флагом RECON_ONLY, который по умолчанию равен "1". Это означает, что сейчас дроппер работает только в режиме разведки: собирает имена хостов, переменные окружения, список установленных пакетов, информацию о проекте и о самом разработчике. Все эти данные отправляются на C2 через тот же протокол, с тем же жёстко зашитым токеном аутентификации в заголовке X-Secret. Но архитектура позволяет удалённо переключить флаг на "0" - и тогда на ранее разведанных машинах можно будет выполнить полную эксфильтрацию, кражу учётных данных или установку бэкдора. Это двухфазная тактика: сначала тихо разведать, потом целенаправленно и незаметно атаковать ценные цели.

Специалисты по анализу угроз установили, что все три аккаунта управляются одним человеком. Доказательств несколько: во-первых, абсолютно одинаковый C2-сервер и одинаковый токен X-Secret во всех пакетах. Во-вторых, одинаковый шаблон генерации метаданных: авторская строка вида "Скоуп-нейм Platform Engineering", ссылки на фиктивные docs, jira и github, идентичные записи в changelog ("Added ARM64 support", "Improved error handling"). В-третьих, временная корреляция: между окончанием публикации mr.4nd3r50n и началом ce-rwb прошло всего 12 минут, что соответствует переключению между аккаунтами. А аккаунт t-in-one, появившийся на следующий день, использует ту же инфраструктуру и тот же токен.

История аккаунта mr.4nd3r50n особенно показательна. Его первая версия пакета logaas вышла ещё в апреле 2024 года и содержала пометки bug bounty - то есть исследователь безопасности тестировал поверхности атаки в рамках программы поиска уязвимостей. Спустя два года, в мае 2026-го, тот же аккаунт переключился на размещение вредоносной нагрузки. Это переход от легитимного исследования к криминальным действиям, возможно, под влиянием изменившихся мотивов.

Среди затронутых пакетов есть такие, что прямо нацелены на финансовый сектор. Например, @sber-ecom-core/sberpay-widget - прямая имитация модуля для Сбербанка. Кроме того, пакеты от t-in-one (десять модулей) носят имена, похожие на токены авторизации: add_application_service_token, prefill_credit_data_token и другие. Это рассчитано на то, что разработчики примут их за легитимные библиотеки для работы с аутентификацией.

Всем организациям, которые используют npm или любой другой менеджер пакетов, стоит срочно проверить файлы package-lock.json, yarn.lock или pnpm-lock.yaml на наличие упомянутых пространств имён. Если пакеты найдены, необходимо ротировать все секреты, токены и учётные данные, которые могли быть скомпрометированы на рабочих станциях разработчиков и в сборочных агентах. Также рекомендуется отключить автоматическое выполнение скриптов установки с помощью флага --ignore-scripts или глобальной настройки ignore-scripts. Кроме того, необходимо заблокировать на межсетевых экранах и DNS-серверах обращения к домену oob.moika[.]tech, а также к фиктивным доменам npm.t-in-one[.]io, docs.t-in-one[.]io и jira.t-in-one[.]io.

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

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

Domains

  • docs.t-in-one.io
  • jira.t-in-one.io
  • npm.t-in-one.io
  • oob.moika.tech

URLs

  • https://oob.moika.tech/payload/linux
  • https://oob.moika.tech/payload/mac
  • https://oob.moika.tech/payload/win

Emails

  • mr.4nd3r50n@yandex.ru
  • ogvanta@yandex.ru
  • t-in-one@yandex.ru

HTTP header

  • X-Secret: l95HdDaz3kQx1Zsg3WxH6HvKANf51RY1

Packages

  • @capibar.chat/ui-kit
  • @ce-rwb/ce-tools-editor-admin
  • @ce-rwb/ce-tools-editor-core
  • @ce-rwb/ce-tools-editor-render
  • @data-science/llm
  • @payments-widget/payments-widget-sdk
  • @sber-ecom-core/sberpay-widget
  • @t-in-one/add_app_middleware_token
  • @t-in-one/add_application
  • @t-in-one/add_application_service_token
  • @t-in-one/add_application_tid
  • @t-in-one/application_id_storage_key_token
  • @t-in-one/form_product_token
  • @t-in-one/get_application_hid
  • @t-in-one/only_difference_payload
  • @t-in-one/prefill_bundle_data_token
  • @t-in-one/prefill_credit_data_token
  • @travel-autotests/npm-proto
  • @wb-track/shared-front
  • administration
  • arenadata-db
  • base-static-page
  • business-solutions
  • cloud-dns
  • cnapp-ui
  • cp-api-gw
  • datagrid
  • dataplatform
  • dataplatform-metastore
  • dataplatform-trino
  • employees
  • enterprise
  • floating-ips
  • logaas
  • marketplace-gigachat
  • ml-ai-agents-agent
  • ml-ai-agents-agent-system
  • monitoring
  • security-groups
  • ssh-keys
  • support
  • svp-baas
  • svp-interfaces
  • svp-s3-storage
  • vpn

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