Крупномасштабная атака на цепочку поставок: злоумышленники скомпрометировали 32 npm-пакета Red Hat за 72 секунды

security

Первого июня 2026 года исследователи в области информационной безопасности зафиксировали беспрецедентную по скорости и масштабу атаку на репозиторий пакетов npm. Злоумышленники смогли опубликовать вредоносные версии сразу 32 пакетов из пространства имён @redhat-cloud-services, которое используется для построения пользовательского интерфейса гибридной консоли Red Hat. Суммарное количество загрузок этих пакетов за всё время их существования превышает 9,8 миллиона. Атака была полностью автоматизирована: все вредоносные сборки вышли в промежутке с 10:54:09 до 10:55:21 по всемирному координированному времени, то есть за 72 секунды.

Описание

Специалисты компании ReversingLabs обнаружили эту активность с помощью собственной платформы анализа поведения Spectra Assure. Каждый из 32 скомпрометированных пакетов содержал одинаковый набор изменений. В файл package.json добавлялась инструкция preinstall, которая запускала скрипт index.js при любой установке пакета через npm install. Сам index.js полностью заменялся на однострочный обфусцированный загрузчик, спрятанный внутри многоуровневой схемы.

Атака стала возможной из-за компрометации учётных данных на уровне области видимости npm. Пострадавшие пакеты относятся к двум разным GitHub-репозиториям - RedHatInsights/frontend-components и RedHatInsights/javascript-clients. Поскольку доступ к отдельным репозиториям не позволяет одновременно публиковать пакеты из обоих, злоумышленник получил контроль над учётными данными самого пространства имён @redhat-cloud-services. Такая уязвимость гораздо опаснее взлома отдельного аккаунта: она даёт возможность распространять вредоносное ПО сразу на всю экосистему.

Среди пострадавших пакетов оказались как фундаментальные библиотеки с миллионными загрузками - @redhat-cloud-services/frontend-components-utilities (около 1,5 миллиона загрузок), @redhat-cloud-services/frontend-components (1,35 миллиона), @redhat-cloud-services/types (1,28 миллиона), - так и менее популярные модули, включая клиенты для работы с API, инструменты сборки и серверы MCP. Каждый пакет получил уникальную полезную нагрузку, зашифрованную с индивидуальными ключами. Поэтому простое сравнение контрольных сумм не позволяет обнаружить атаку: все 32 файла index.js имеют разные хеши SHA-256.

Исследователи восстановили полную цепочку исполнения на примере пакета chrome. Внешний слой использует шифр Цезаря ROT-N с уникальным значением сдвига для каждого пакета. После декодирования запускается асинхронная функция, которая выполняет расшифровку двух блоков с помощью алгоритма AES-128-GCM - симметричного шифрования с аутентификацией. Ключи, векторы инициализации и теги аутентификации также уникальны для каждого пакета. Первый расшифрованный блок загружает среду выполнения bun (легитимный JavaScript-движок) из официального репозитория GitHub. Это сделано намеренно: запрос к github.com не вызывает подозрений у систем мониторинга. Второй блок - это основной вредоносный код объёмом 634 килобайта, дополнительно обфусцированный инструментом obfuscator.io с запутыванием потока управления и кодированием строк.

После выполнения, полезная нагрузка (payload) начинает сбор учётных данных из окружения разработчика. Подтверждённые цели включают ключи доступа к облачным сервисам Amazon Web Services, Microsoft Azure, Google Cloud, а также токены HashiCorp Vault, GitHub, npm и ключи SSH. Анализ показал, что вредоносная программа специально проверяет переменные GITHUB_REPOSITORY и GITHUB_WORKFLOW_REF, чтобы определить, работает ли она внутри конвейера непрерывной интеграции GitHub Actions. При обнаружении такого окружения запускается отдельный путь скрытой эксфильтрации данных, после чего процесс завершается, не оставляя следов в журналах сборки.

Особую тревогу вызывает способность полезной нагрузки к самораспространению. Внутри кода найдена функция ROT-N и генератор новых полезных нагрузок, структурно идентичные тем, что использовались для обфускации index.js. Если вредоносная программа успешно похитит учётные данные npm из заражённой среды сборки, она сможет публиковать новые отравленные версии пакетов в другие пространства имён, контролируемые жертвой. Таким образом, одна скомпрометированная машина способна стать источником дальнейших атак на цепочку поставок.

Легитимные сопровождающие пакетов уже выпустили чистые версии всех 32 модулей и удалили вредоносные из реестра npm. Однако любой проект, который выполнял npm install в промежутке примерно между 10:54 и 10:56 UTC 1 июня 2026 года и имел хотя бы один из этих пакетов в дереве зависимостей (прямых или транзитивных), мог быть заражён. Исследователи рекомендуют считать такие среды сборки полностью скомпрометированными, немедленно сменить все учётные данные, токены и ключи, доступные из этого окружения, проверить файлы блокировки зависимостей на точное совпадение версий из списка индикаторов компрометации, а также заблокировать вредоносные хеши в прокси-серверах артефактов.

Этот инцидент наглядно демонстрирует, какой разрушительный эффект может иметь компрометация единственных учётных данных области видимости npm. Всего за 72 секунды атакующий получил доступ к почти десяти миллионам загрузок и внедрил самовоспроизводящийся механизм кражи облачных учётных данных. Каждый пакет пришлось анализировать отдельно из-за уникальных ключей шифрования, что значительно усложнило реагирование. Специалисты ReversingLabs продолжают мониторинг пространства @redhat-cloud-services и обещают опубликовать дополнительные сведения при обнаружении новых вариантов атаки.

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

Package

  • chrome 2.3.1
  • compliance-client 4.0.3
  • config-manager-client 5.0.4
  • entitlements-client 4.0.11
  • eslint-config-redhat-cloud-services 3.2.1
  • frontend-components 7.7.2
  • frontend-components-advisor-components 3.8.2
  • frontend-components-config 6.11.3
  • frontend-components-config-utilities 4.11.2
  • frontend-components-notifications 6.9.2
  • frontend-components-remediations 4.9.2
  • frontend-components-testing 1.2.1
  • frontend-components-translations 4.4.1
  • frontend-components-utilities 7.4.1
  • hcc-feo-mcp 0.3.1
  • hcc-kessel-mcp 0.3.1
  • hcc-pf-mcp 0.6.1
  • host-inventory-client 5.0.3
  • insights-client 4.0.4
  • integrations-client 6.0.4
  • javascript-clients-shared 2.0.8
  • notifications-client 6.1.4
  • patch-client 4.0.4
  • quickstarts-client 4.0.11
  • rbac-client 9.0.3
  • remediations-client 4.0.4
  • rule-components 4.7.2
  • sources-client 3.0.10
  • tsc-transform-imports 1.2.2
  • types 3.6.1
  • vulnerabilities-client 2.1.8

SHA256

  • 080190bffcaafffacca1f0181fc9024aaaa21500ffdc9926fa5b689ba959965d
  • 09b2301d1589416e0d5fb7a602427a9850dee6713ffa741c0efcfeb1eb4c8952
  • 17c4312b50d69a6f61515edcf71cfaa8271fe2538b942128cfb639d021d042a7
  • 1a30a9abe20bab121aaa75ed040565af14e6cdfb745609ee0e7b94a2d814fb9c
  • 21b6409a7b84446310daca5409ad6112ac60a1e4bef97736e53fff5f63bfdef4
  • 2a446171b4b981d98b5af6c5606bd63b1570040334210b6ab0a10901b2606fe5
  • 396cac9e457ec54ff6d3f6311cb5cc1da8054d019ce3ffa1de5741506c7a4ea4
  • 3f8e522595f32277a0013c7ab0df3ecf336460b56e6b4be9130907f419db3b6d
  • 42e165602967c8e1a6fae0113a5179adbe33e18192244fe34b872db09c85e0e6
  • 545a1838c66e1771f58d84a17b3e1841e5eeab91a73f4ccc59c9492450a6d9c0
  • 5c6cb758a3447bc7e0de34406919a933f9351e90ef04ec43f3bbb401e7004e1b
  • 5dabf08e2655c012e478074a2cea2b0d34e286c27265a26f3846fc45e5584501
  • 7b19ffc2f2bfff75989255e5e807d0f62513153de287eba9cc17003c1dcae8a8
  • 7cbace2a186cab2c652305b6e33c8eeb10d4a0ec3a0c8b795de012094fa0d845
  • 85b1ed56530bb64d925af4ca50faacd89efb1b63d615238a34adbea9f00e4754
  • 89f97557200bd26cc8941c9abaadac2d798a89562401016fbb2c757e3092dfdc
  • 8d2a09b3727b50f3d035b58bd35b90b504d24dda73a8a24e926a010a58ba5f74
  • 94e8488fd033728eee6666550d5a94b0cc1f7b231d4d85d0affecb0615116722
  • 9b99482b75ee89f0d916f2743deeff381ea727e69c71491822477e67891841ad
  • b390d9f708760b799ee5482e8050ce093219140627fcaec6df8812ac9abb9a9b
  • b86c5ae9e95bd841a595440faa3eb6317441e746f241ae8fd641ab59ed1d1966
  • c178cafa2b3bcbefbbc283b5ab8fc6143e46650631f72451a44327f146a609c3
  • c2a60face766f69f82c972375f35f8ebaa45d6c464176974e631d9a78d6bea0a
  • c611e49ea46c91013448942c26049741b434cb5dac55fff7c376ca6a4f28580e
  • cffc487ee978f7bc06e3856b286940940658884847d38b619a137b8272a75980
  • d1999fd543085918dd542322c6455abde3c57a93b8f7ce871b8809c8bb744af7
  • d8d170af3de17bb9b217c52aaaffdf9395f35ef015a57ef676e406c121e5e223
  • df1732f5bfec12e066be44dee02ec8a243e4868d38672c1b1d065359dd735a14
  • e5f73c888f1250a8895680801975cf177e8c690defd4a999e56f6c08ff64deb8
  • edd86c0efd776a6bd934fc7b0d4d6da2b256e147cfa83bb0c2814e81d849c427
  • f961d6897c0ec586cde633e100865b5b1d435cc7c301dbf0f41298ca5b42e17a

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