При помощи червя Shai-Hulud скомпрометировано 600 NPM-пакетов

Зафиксирована вторая атака на пакеты в репозитории NPM, проводимая с использованием модификации самораспространяющегося червя Shai-Hulud, подставляющего вредоносное ПО в зависимости. В результате атаки опубликованы вредоносные выпуски 605 пакетов, насчитывающих в сумме более 100 млн загрузок.

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

В случае обнаружения токена подключения к каталогу NPM червь автоматически публикует новые вредоносные релизы для пакетов, разрабатываемых в текущем окружении. Таким способом по цепочке поражается всё дерево зависимостей. Помимо NPM-токена червь сохраняет ключи доступа к GitHub и облачным сервисам AWS, Azure и GCP (Google Cloud Platform), а также переменные окружения и другие конфиденциальные данные, которые способен обнаружить сканер TruffleHog.

Найденные в системе конфиденциальные данные размещаются в GitHub через создание репозиториев с хаотичными именами (например, “qzx15djl71alh6p80h”) и фразой “Sha1-Hulud: The Second Coming” в описании, а также в закодированном виде выводятся в логи GitHub Actions. В создаваемом репозитории размещатся файл в формате JSON (например, jsonactionsSecrets.json или contents.json), в котором присутствует строка с закодированной методом base64 информацией о системе, переменными окружения и захваченными данными. Для передачи информации вовне из систем непрерывной интеграции на базе GitHub червь создаёт обработчик GitHub Actions с именем “.github/workflows/formatter_123456789.yml” и настраивает runner с именем SHA1HULUD.

Отличия от похожей сентябрьской атаки сводятся к иному методу подстановки вредоносного кода в пакет. В формируемых червём вредоносных релизах заявляется реализация поддержи JavaScript-платформы Bun. В файл package.json в секцию “preinstall”, определяющую скрипты, запускаемые до начала установки, добавляется команда “node setup_bun.js”.


В файле “setup_bun.js” присутствует код для выполнения обфусцированного скрипта “bun_environment.js”, содержащего код червя. Для своего дальнейшего распространения червь находит код пакетов, вносит изменения в файл package.json (увеличивает номер версии и включает вызов setup_bun.js), добавляет файлы setup_bun.js и bun_environment.js, переупаковывает пакет и выполняет команду “npm publish” для размещения нового релиза.

Среди скомпрометированных популярных пакетов: @zapier/zapier-sdk (2.8 млн загрузок в неделю), @posthog/core (2.8 млн), posthog-node (1.5 млн), @asyncapi/specs (1.4 млн), @postman/tunnel-agent (1.2 млн). Предполагается, что атака началась с компрометации сопровождающего пакет @asyncapi/specs.

Release. Ссылка here.