Пакетный менеджер npm вновь стал целью целенаправленной атаки на цепочку поставок. Злоумышленники получили контроль над учётной записью разработчика "czirker" и внедрили в 23 его пакета новую вариацию вредоносного ПО, известного как Shai-Hulud, Miasma или Hades. Совокупное количество ежемесячных загрузок затронутых компонентов достигло 52 640, что делает этот инцидент значимым для пользователей экосистемы JavaScript и Node.js.
Описание
Как установили специалисты OX Security, компрометация аккаунта произошла, вероятнее всего, из-за утечки токена npm или учётных данных разработчика через другое инфостилерное (программа-похититель информации) вредоносное ПО. Всего через четыре часа после взлома все пакеты "czirker" получили обновления, содержащие новую версию вредоносного загрузчика. Сама строка, запускающая атаку, впервые появилась в GitHub примерно за десять часов до обнаружения. К моменту публикации исследования было найдено уже около 338 репозиториев, куда злоумышленники загрузили украденные учётные данные.
Новый вариант Miasma функционально повторяет инфостилерную логику предыдущих модификаций. Он собирает с заражённых систем токены GitHub и npm, а также ключи доступа к облачным сервисам AWS, GCP и Azure. Кроме того, вредоносная программа извлекает локальные переменные окружения, что даёт атакующим детальную информацию о конфигурации жертвы.
OX Security в своём анализе подчёркивает несколько ключевых отличий этого штамма от предыдущих. Во-первых, изменён способ маркировки скомпрометированных данных при выгрузке в GitHub: вместо привычного формата "name: description" используется строка "Alright Lets See If This Works". Эта строка стала новым маяком для обнаружения утечек, и на момент написания статьи таких следов насчитано 338. Во-вторых, в вредоносном коде использованы новые публичные ключи шифрования, что с высокой вероятностью указывает на смену автора атаки - он не относится к группировкам TeamPCP или прежним создателям Miasma.
Важной деталью является и техника распространения. Злоумышленники повторно применили ранее опробованный приём: они ищут на GitHub коммиты с меткой "firedalazer", которая всё ещё активна (двухнедельной давности). Эта метка ведёт на репозиторий, содержащий закодированный URL с полезной нагрузкой. Декодировав его, исследователи получили ссылку на файл setup.py в аккаунте другого скомпрометированного разработчика - "l3v1cs". Затем загрузчик обращается к index.js из того же репозитория, и после дальнейшего раскрытия цепочки выяснилось, что внедряемая вредоносная программа - это ещё один вариант с именем "Hades * The End for the Damned". Эта ветка уже заразила 173 репозитория на GitHub, причём большинство из них было создано около 15-16 дней назад.
Таким образом, атака задействует два взломанных аккаунта GitHub: один - для хранения "маяка" (коммита firedalazer), второй - для размещения самого вредоносного кода. Это усложняет отслеживание инфраструктуры злоумышленников и повышает живучесть кампании.
Для организаций и разработчиков, использующих пакеты из-под учётной записи "czirker", риски очевидны. После установки заражённых компонентов на сборочных или рабочих станциях происходит несанкционированный сбор критических токенов доступа. Утечка ключей к облачным средам может привести к компрометации всей инфраструктуры и последующим дорогостоящим инцидентам. Особую опасность представляет кража токенов npm: злоумышленники могут получить возможность публиковать новые вредоносные версии уже от имени законного разработчика, расширяя атаку.
В качестве оперативных мер рекомендуется немедленно отозвать все токены и ключи, которые могли быть сохранены на скомпрометированных системах, а также включить двухфакторную аутентификацию для всех учётных записей в GitHub и npm. Основные пакеты "czirker" следует откатить до версий, предшествующих дате публикации вредоносного обновления. Это позволит временно исключить угрозу до того, как мейнтейнер восстановит контроль над аккаунтом и выпустит чистые релизы.
Этот инцидент в очередной раз демонстрирует, что компрометация даже одного аккаунта разработчика с широкой аудиторией пакетов способна нанести масштабный ущерб за считаные часы. Пока экосистема npm полагается на добросовестность мейнтейнеров и безопасность их локальных машин, атакующие будут продолжать использовать те же векторы - кражу токенов через инфостилеры. Без внедрения обязательного подписания кода, автоматической проверки публикуемых артефактов и усиленного мониторинга учётных записей такие волны заражений будут повторяться.
Индикаторы компрометации
Affected Package
- leo-sdk 6.0.19
- leo-cli 3.0.3
- leo-auth 4.0.6
- leo-connector-common 4.0.11-rc
- leo-connector-mysql 3.0.3
- leo-connector-postgres 4.0.19-beta
- leo-connector-elasticsearch 2.0.6
- leo-connector-mongo 3.0.8
- leo-aws 2.0.4
- leo-config 1.1.1
- leo-connector-entity-table 3.0.22-rc
- leo-logger 1.0.8
- leo-streams 2.0.1
- leo-cache 1.0.2
- leo-connector-oracle 2.0.1
- leo-connector-redshift 3.0.6
- serverless-leo 3.0.14
- leo-cron 2.0.2
- serverless-convention 2.0.4
- solo-nav 1.0.1
- rstreams-metrics 2.0.2
- leo-cdk-lib 0.0.2
- rstreams-shard-util 1.0.1
Public encryption key
- MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAut0YWEh9/gZIsSoF6feF
- MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwtmpAkLxoe3q3BxHOLPE
Hades variant public encryption key
- MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAifY0q2qOZke8FTr7c23d
- MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAy/uXzJGGCEF39GtSJk9H
Relevant string
- Alright Lets See If This Works
- TheBeautifulSandsOfTime
- thebeautifulmarchoftime
- RevokeAndItGoesKaboom
Infected account
- https://www.npmjs.com/~czirker
- https://github.com/miaxxxxxx
- https://github.com/l3v1cs
URL
- https://raw.githubusercontent.com/l3v1cs/Html-Bootstrap-TinDog/e027c6ea4c8042c4778dc4f392bf5f94a3c6310d/setup.py
- https://raw.githubusercontent.com/l3v1cs/Html-Bootstrap-TinDog/cb6699faacade9775d3d83059d6ba6a756755193/index.js