Исследователи из Socket Threat Research зафиксировали новую волну атак в рамках кампании Miasma Mini Shai-Hulud, направленной на цепочку поставок программных компонентов. На этот раз под удар попали легитимные npm-пакеты, опубликованные под учётной записью @immobiliarelabs. Среди скомпрометированных артефактов оказались плагины Backstage, используемые для интеграции с GitLab и аутентификации через LDAP (облегчённый протокол доступа к каталогам). Атака представляет серьёзную угрозу для разработчиков, внутренних порталов и систем непрерывной поставки.
Описание
Событие является прямым продолжением активности, описанной днём ранее: тогда злоумышленники скомпрометировали пакеты LeoPlatform и RStreams, злоупотребили рабочими процессами GitHub Actions, внедрили механизмы закрепления через ИИ-агентов и взломали модуль Verana на Go. Нынешняя атака повторяет ту же схему: компрометация доверенной инфраструктуры разработчика, публикация вредоносных версий пакетов, скрытое внедрение JavaScript-нагрузки через среду выполнения Bun, кража секретов разработчиков и токенов CI/CD (систем непрерывной интеграции и доставки), а затем использование украденного доступа для дальнейшего распространения.
Ключевое отличие этой волны - не новый тип вредоносной нагрузки, а расширение атаки на ещё одного легитимного мэйнтейнера открытого кода. На этот раз мишенью стали плагины Backstage, которые работают в непосредственной близости к внутренним порталам разработчиков, интеграциям с системами управления исходным кодом и процессам аутентификации.
Пакеты были опубликованы в узком временном окне 26 июня 2026 года. Согласно телеметрии Socket, вредоносные версии затронули несколько семейств пакетов: @immobiliarelabs/backstage-plugin-gitlab (версии 1.0.1, 2.1.2, 3.0.3, 4.0.2, 5.2.1, 6.13.1, 7.0.2), @immobiliarelabs/backstage-plugin-gitlab-backend (3.0.3, 4.0.2, 5.2.1, 6.13.1, 7.0.2), а также @immobiliarelabs/backstage-plugin-ldap-auth и его бэкенд-версии (от 1.1.4 до 5.2.1). Примечательно, что злоумышленники перевыпустили множество исторических версий, а не только последнюю. Это указывает на автоматизированную волну перепубликации: атакующие стремились поразить пользователей, зафиксированных на старых мажорных версиях.
ImmobiliareLabs - технологическое подразделение итальянской платформы недвижимости Immobiliare.it. Компания активно использует открытый код, GitLab-ориентированные CI/CD, инфраструктуру Kubernetes и публичные GitHub-репозитории. Backstage, в свою очередь, является популярной платформой для создания внутреннего портала разработчика, где сходятся метаданные исходного кода, каталоги сервисов, сигналы CI/CD, аутентификация и рабочие процессы разработчиков. Компрометация пакетов, работающих в таком контексте, особенно опасна: среда установки может иметь доступ к токенам для работы с системой контроля версий, учётным данным публикации пакетов, секретам CI/CD, облачным токенам и настройкам аутентификации.
Вредоносная нагрузка не обязательно эксплуатирует GitLab или LDAP напрямую - ей достаточно выполниться в среде, где эти пакеты установлены или собираются. Начальный анализ архива @immobiliarelabs/backstage-plugin-gitlab@7.0.2 показал характерную маскировку. Стандартная точка входа dist/index.cjs.js выглядит безобидной, но вредоносный архив добавляет корневой index.js, который расшифровывает и запускает скрытую полезную нагрузку, при необходимости загружает Bun и выполняет скрипт второго этапа. Проверяющий, который инспектирует только объявленную точку входа или скомпилированный вывод dist, может пропустить вредоносный путь выполнения, добавленный на уровне корня пакета.
Это продолжает общую тенденцию Miasma - прятать выполнение вне самых очевидных метаданных пакета, уходя от простых скриптов preinstall или postinstall в сторону менее заметных триггеров: менеджеров пакетов, процессов сборки, рабочих процессов и инструментов разработчика. Вредоносный код использует приём "Phantom Gyp": команда node-gyp (инструмент для сборки нативных модулей Node.js) через расширение из binding.gyp выполняет index.js, не полагаясь на стандартные хуки установки. Корневой index.js представляет собой однострочный загрузчик с шифром Цезаря, за которым идёт расшифровка AES-128-GCM и многоэтапная доставка. Финальная нагрузка запускается под Bun 1.3.13 (если его нет - скачивает) и крадёт секреты: файлы .env, токены npm/PyPI/GitHub/Slack/Twilio/AWS/Azure/GCP/Vault, SSH-ключи, учётные данные Docker и конфигурации Kubernetes. Она также инжектирует вредоносные шаги в GitHub Actions, создаёт точки закрепления в плагинах ИИ-помощников по коду и расширениях IDE, а затем эксфильтрует украденное через GitHub API в подконтрольные атакующим репозитории.
Отдельное расследование выявило возможный путь начального проникновения. 24 июня 2026 года был скомпрометирован сторонний GitHub Action codfish/semantic-release-action. По данным StepSecurity, злоумышленник выполнил force-push вредоносных коммитов и перезаписал изменяемые теги версий, что заставило рабочие процессы, ссылающиеся на эти теги, выполнять код атакующего на раннерах GitHub Actions. Вредоносное действие превратило оригинальное Docker-действие в композитное, установило Bun и выполнило обфусцированный JavaScript. Целью были OIDC-токены (OpenID Connect), персональные токены GitHub и секреты CI/CD. Такая схема предоставляет правдоподобный сценарий: если рабочий процесс, контролируемый учётной записью simonecorsi (связанной с ImmobiliareLabs), использовал codfish/semantic-release-action по mutable-тегу, то атакующий мог получить доступ к учётным данным для публикации npm-пакетов и запуска последующих действий.
Аналитики также отметили, что GitHub недавно ввёл защиту выполнения рабочих процессов (в публичной предварительной версии), позволяющую ограничивать, кто и какие события могут запускать workflows. Событие deployment (развёртывание) следует считать особенно рискованным триггером. В атаке, описанной исследователем Аднаном Ханом, злоумышленник может создать временные Git-объекты, фиктивный коммит, инициировать развёртывание, нацеленное на этот коммит, и запустить рабочий процесс без прямого изменения файлов в .github/workflows. В репозитории immobiliare/backstage-plugin-gitlab был обнаружен workflow с именем Dependabot Updates, запущенный 26 июня 2026 года через событие deployment - такое имя может маскировать вредоносный релизный процесс.
В результате всей цепочки скомпрометированные пакеты, установленные в средах разработки, могут привести к крате токенов, облачных учётных данных и дальнейшему распространению. Socket также зафиксировал всплеск эксфильтрационных репозиториев, созданных от имени services-admin-pearlhealthlabs с сотнями публичных репозиториев со случайными именами - они используются как промежуточные хранилища для украденных данных.
Командам, установившим любую из затронутых версий @immobiliarelabs, следует считать среду скомпрометированной. Рекомендуется идентифицировать все машины разработчиков, CI-раннеры, сборочные контейнеры и среды Backstage, где произошла установка. Необходимо удалить затронутые версии и восстановить пакеты из заведомо чистых версий и lock-файлов. Следует отозвать все секреты (npm, GitHub, GitLab, облачные, Kubernetes, Docker, Vault, SSH, Slack, Twilio, CI/CD), ротируя их с чистой машины. Аудит GitHub Actions должен выявить подозрительные запуски, особенно на событие deployment, рабочие процессы с названиями вроде Dependabot Updates, а также неожиданные release-процессы. Важно проверить репозитории на наличие инжектированных файлов .github/workflows, .github/setup.js, корневых index.js / _index.js, конфигураций ИИ-помощников (например, .gemini/settings.json, .claude hooks, .vscode tasks, Cursor rules) и необъяснимое использование Bun. Закрепление GitHub Actions по полным SHA коммитов вместо mutable-тегов и ограничение прав на публикацию пакетов защищёнными ветками и минимальными разрешениями OIDC/contents/actions/packages существенно снижают риск повторения подобных атак. Кампания Miasma Mini Shai-Hulud продолжает демонстрировать, что цепочка поставок и CI/CD являются не просто автоматизацией, а полноценной поверхностью атаки, требующей такого же уровня защиты, как и основные производственные системы.
Индикаторы компрометации
Package
- @immobiliarelabs/backstage-plugin-gitlab@1.0.1
- @immobiliarelabs/backstage-plugin-gitlab@2.1.2
- @immobiliarelabs/backstage-plugin-gitlab@3.0.3
- @immobiliarelabs/backstage-plugin-gitlab@4.0.2
- @immobiliarelabs/backstage-plugin-gitlab@5.2.1
- @immobiliarelabs/backstage-plugin-gitlab@6.13.1
- @immobiliarelabs/backstage-plugin-gitlab@7.0.2
- @immobiliarelabs/backstage-plugin-gitlab-backend@3.0.3
- @immobiliarelabs/backstage-plugin-gitlab-backend@4.0.2
- @immobiliarelabs/backstage-plugin-gitlab-backend@5.2.1
- @immobiliarelabs/backstage-plugin-gitlab-backend@6.13.1
- @immobiliarelabs/backstage-plugin-gitlab-backend@7.0.2
- @immobiliarelabs/backstage-plugin-ldap-auth@1.1.4
- @immobiliarelabs/backstage-plugin-ldap-auth@2.0.5
- @immobiliarelabs/backstage-plugin-ldap-auth@3.0.2
- @immobiliarelabs/backstage-plugin-ldap-auth@4.3.2
- @immobiliarelabs/backstage-plugin-ldap-auth@5.2.1
- @immobiliarelabs/backstage-plugin-ldap-auth-backend@1.1.3
- @immobiliarelabs/backstage-plugin-ldap-auth-backend@2.0.5
- @immobiliarelabs/backstage-plugin-ldap-auth-backend@3.0.2
- @immobiliarelabs/backstage-plugin-ldap-auth-backend@4.3.2
- @immobiliarelabs/backstage-plugin-ldap-auth-backend@5.2.1
SHA256
- 0574f0bee78294a5f3495144ea6e05848c5fe8dcda11414e35c65aea46ce953b
- 0ccd7c44a6352f295f65ffea21c2472566f9e73c4dd1028fe0b9971314b18de6
- 14253cd5b8acccbbacb5cd3bb0a099fb6b0aafe4d06d032e4070b3fb814677dd
- 1623787aa0de7310a4585101212b41ae02d02801ebda5812395932392400c756
- 1e7b04a9a4a25eb7928821a5519b0a40f7afe0f6042a6860c918b62d369096ed
- 24c578c2573bf7a04f69c4762a36a87fd32746e9db4df16b2ad92f31fbdd0d50
- 2f6cbe3a79148bc247131c36cd12689c97166a9d141dd9d9466270b4c04c3e3e
- 2ffed3b58bc267c438c759cd03b3e890904f25bacd015608f888c302741cad29
- 333f2e3753063447819a3c86cfc475fe4bd3f0a76c05262a61c3d18b50438bb5
- 3667e7080c083563f6d05118d8b08f535b391fe2a5c0f98d5bd31f96257620f7
- 3809fd3a3a912abccaa7aa201880a2cfd194ae7f9dbdc747872cd045bcb3def5
- 3b24b47a66b17d39fbdb7deccc329342b18cec6feb967adbaf80e81a70ecc609
- 441d834d8a97b3d76bd7a9ac73174a18c1add1bf80b21319c0cb2d5737782e83
- 54086c0f23710ff45cb6bde498083d0a0098112aab9b0ef48e6e869a280f1b42
- 60099babe48a48831262b40d4c5c1dd623726060da10c1e2f74f191c9c4cd81d
- 63667208bcd2d307b307e6df43bf8960ccb7058333d00ba064ed53f180ec32ea
- 720571b83600cd61080a7779e7f44327e4df4974d4a01475439d2e59e11ab29f
- 7a879ed69a8191df5c68535f6ac41b830577b698de943c66ff40e51482d90d79
- 7bc28ba4d33d010785a5289211ad6a0d968ec0abd56201d90d74921ad83d925d
- 7cd21d65d5a085d82d07275df9a66c6dfac4e13e43ea9ef44e84a3dd14ea1b3f
- 8284d9bd16c9141d331d3b724f9d57ae2cae265bf326055e18d5cde4bb5985b7
- 869ffe5400477ce69bbfd5f51ddd0c40eacad9a83005956fb14787a5e1e98330
- 8746d49834ad938eebeaffd380b6302c94ab0b3258268c1a8c7e57ee7d5c11e1
- 89c218ca407c2d92359b53a9e3b7b973a761dcf323d2fa1cc2dc12c13f27afaf
- 8a71e7d9b6b1b6d3e7bee490e98b34595ceea207160fc7ed35e47f82160febbe
- 8df5d46d91589e6a3ec8d87d6eea6c71fac103f9e10dff9b88c309c1e9129b07
- 8e83e3ece1a2a764a7c6fd78dd39cfb32cb38d22b7b3d92709cb5b87fa916403
- 99eb789284fa62e3f956e81294247ae82f596ebf481c069ae45019ac4e879927
- 9d8ea3cefb942081a1409e842ddc541ccd65fb3e66a4f8dfe562ca8548dd09d9
- 9df6bda43678708605dfaad35f02be8027e85e6aa38193704cf192f842f0d186
- a09909e8981e17712ef38b363f94553e2f86b6c2abd6c87eada94d3d3aab937e
- a16810f972f577f129f95f147e64aa4c70977035285d357a53958496c0531223
- b38a73c365e5761fe0e7f25a391db3a264b1f2b4878a1c8cc127ba83d64e614c
- b4f90f5515df39cf346bf436e284f2dae28c9341c035765d83d82a76c86922b7
- b82f5f6f1d969ba8f32937a3d81306c631defa943b7cc7529e45a0003340ece5
- ca89ece660251554b66f1e5e9874410d206e0f080da3039e1221f1c71d817395
- cc00c23768bee76e2f297c1766a013a681efb519888545352cff96fc5cead035
- cf46348e7a4beacc0b9600c9ece3bee140f344641e90d99c741bc54507423443
- cf5d79494d8b1fdcb5480507eee8beeb2fcd69bcd9afcdc7dc1bcdda7461913e
- d1db13a14db489531e11ccf700d7fd8701f61ad297ce02477e11acf194d3fed0
- d2aa3f9057c6f3295766aabed0a71a369353d6eb665049a45fd407fd55020fdb
- dfcdec5f43cc8d127084a2ac4d66499f13bae7f49167e3291a6f1a70738772d1
- ef01e18ccf618a8992ad0aa4eb7d804bbacf9f092d43d39237f283a9a289c9b9
- ef641e956f91d501b748085996303c96a64d67f63bfeef0dda175e5aa19cca90
- ef89e81be6b9d81b9d4bc41dae5f10a7a68f33b17fd76affcf7dca2f5d50a843