Компрометация аккаунта npm-разработчика привела к распространению нового штамма Shai-Hulud, затронувшего 52 тысячи загрузок

Атака на цепочку поставок NPM

Пакетный менеджер 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

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