Атаки на экосистемы разработчиков становятся всё более частыми и изощрёнными. На этой неделе под удар попали разработчики Node.js: несколько npm-пакетов, принадлежащих открытым проектам AsyncAPI и Jscrambler Code Integrity, были заражены вредоносным ПО после компрометации учётных данных разработчиков.
Инциденты демонстрируют каскадный эффект атак на цепочки поставок ПО, когда украденные учётные данные используются для дальнейших компрометаций. Специалисты по безопасности рекомендуют организациям полностью пересобрать из чистых образов любые машины разработчиков, на которых был установлен заражённый пакет, а также ротировать все npm-токены, доступ к системам контроля версий, облачные учётные данные, секреты CI/CD, SSH-ключи, ключи подписи и сессии браузера.
Затронутые пакеты включают: jscrambler@8.14.0, jscrambler@8.16.0, jscrambler@8.17.0, jscrambler@8.18.0, jscrambler@8.20.0, @asyncapi/generator-helpers@1.1.1, @asyncapi/generator-components@0.7.1, @asyncapi/generator@3.3.1, @asyncapi/specs@6.11.2 и @asyncapi/specs@6.11.2-alpha.1.
Однако пакеты, в которых любой из вышеперечисленных заражённых пакетов указан как зависимость, также могут быть затронуты, включая пакеты из тех же проектов, такие как jscrambler-webpack-plugin 8.6.2, gulp-jscrambler 8.6.2, grunt-jscrambler 8.5.2 и jscrambler-metro-plugin 9.0.2.
Уязвимый workflow GitHub Actions использован как точка входа
Атака на AsyncAPI — открытую эталонную спецификацию и набор инструментов для реализации событийно-ориентированных архитектур и асинхронных API — произошла во вторник и была независимо обнаружена несколькими компаниями, занимающимися безопасностью и мониторингом реестра npm, включая Upwind, Socket.dev, Wiz, StepSecurity и Aikido Security.
Согласно анализу исследователей, злоумышленники воспользовались известной уязвимостью конфигурации в CI/CD workflow GitHub Actions, о которой сообщалось ещё в апреле. Уязвимость связана с событием pull_request_target, которое выполняется при каждом новом pull request. При срабатывании workflow автоматически извлекает и выполняет код из отправленного pull request в контейнере Actions, но это происходит в контексте базового репозитория с полным доступом к секретам.
У проекта AsyncAPI было предложено исправление с 17 мая, но оно ещё не прошло полное ревью и не было влито в основную ветку.
«В 05:08 UTC злоумышленник открыл PR #2155, содержащий markdown-файл с обфусцированным JavaScript, спрятанным после примерно 1000 байт пробелов», — объяснили исследователи из Wiz в своём отчёте. «Полезная нагрузка была разработана для сканирования окружения раннера GitHub Actions на предмет секретов и их эксфильтрации на dead-drop URL на pastebin rentry.co».
Когда workflow GitHub Actions запускается и выполняется в окружении, генерируется временный GITHUB_TOKEN для выполнения аутентифицированных git-команд в репозитории. Могут быть включены и другие токены.
В данном случае злоумышленникам удалось получить токен, связанный с asyncapi-bot — сервисной учётной записью, имевшей доступ ко всей организации AsyncAPI на GitHub. Это позволило им выполнить вредоносные коммиты кода в двух отдельных репозиториях. Эти коммиты, в свою очередь, запустили автоматические сборочные workflow, которые сгенерировали и опубликовали npm-пакеты.
Встроенная в пакеты полезная нагрузка имеет некоторое сходство с фреймворком вредоносного ПО под названием Miasma, который использовался в предыдущих атаках на цепочки поставок. Однако код вредоноса, по-видимому, значительно отличается от ранее задокументированных вариантов.
Код первой стадии загружает вторичную троянскую полезную нагрузку, имеющую варианты для Linux, Windows и macOS. Это модульный фреймворк вредоносного ПО с возможностями кражи учётных данных, нацеленный на пароли и cookie, сохранённые в браузерах, SSH-ключи, npm- и GitHub-токены, учётные данные AWS, связку ключей macOS и криптовалютные кошельки.
Троян связывался с command-and-control сервером и мог принимать удалённые команды для выполнения файловых операций, просмотра каталогов и эксфильтрации данных.
Jscrambler скомпрометирован через утёкшие npm-учётные данные
Атака на Jscrambler произошла в выходные 11 июля: злоумышленники опубликовали несколько троянизированных версий в две волны. Jscrambler Code Integrity — это клиентская библиотека безопасности, предназначенная для защиты JavaScript-веб- и мобильных приложений от взлома и реверс-инжиниринга.
Jscrambler опубликовал уведомление в ответ на инцидент, в котором разъяснил, что злоумышленники опубликовали вредоносные версии пакета, используя учётные данные для публикации в npm. Однако, в отличие от случая с AsyncAPI, как именно эти учётные данные были скомпрометированы, неясно.
Изначально злоумышленники выпустили новые версии пакета с двумя вредоносными скриптами, которые выполнялись во время установки с помощью хука preinstall в скрипте конфигурации. Скрипты также запускали платформо-специфичные бинарники для Linux, macOS и Windows, встроенные в обфусцированный контейнер.
Поскольку хуки preinstall или postinstall являются распространёнными способами доставки вредоносного ПО в npm-пакетах, они автоматически проверяются инструментами безопасности. Чтобы избежать обнаружения, злоумышленники перешли к методу, включающему внедрение вредоносного кода непосредственно в файлы dist/index.js и dist/bin/jscrambler.js. Это изменило момент выполнения вредоноса с установки пакета на момент его импорта в другие проекты или вызова CLI Jscrambler.
Встроенные вредоносные исполняемые файлы для разных платформ написаны на Rust и, согласно анализу Socket.dev, представляли собой «широкий, ориентированный на разработчиков сборщик учётных данных и секретов», нацеленный на криптокошельки браузерных расширений, API-ключи от AI-ассистентов кодинга и MCP-серверов, облачные учётные данные AWS, Azure и GCP, токены аутентификации для мессенджеров (таких как Discord, Slack и Telegram), хранилища паролей из браузеров, Steam и KDE.
Всегда имейте в виду, что редакции могут придерживаться предвзятых взглядов в освещении новостей.
Автор – Lucian Constantin




