Исследователи обнаружили 18 вредоносных пакетов npm, через которые распространялся кроссплатформенный троян удалённого доступа, работающий в Windows, Linux и macOS. Атака была рассчитана на пользователей инструментов Alibaba, прежде всего на китайскоязычных разработчиков из компаний Alibaba Group или связанных с ними организаций. Имя оператора кампании пока неизвестно. Предполагаемая цель, по оценке исследователя Socket Карло Занки, — промышленный шпионаж.
Одним из центральных элементов был пакет lib-mtop без пространства имён, копировавший название закрытого пакета Alibaba из области @ali. Впервые его опубликовали в ноябре 2023 года, причём начальная версия ничего не делала. В марте и апреле появились версии 1.0.1, 1.0.2 и 1.0.3 с вредоносным загрузчиком: он вызывал curl, получал удалённый JavaScript-код и запускал его. Не установлено, захватили ли злоумышленники учётную запись сопровождающего или сам разработчик решил превратить пакет в оружие.
Пакет lib-mtop обслуживала учётная запись ch4ce, которая на момент расследования открывала на npmjs[.]com страницу с ошибкой «не найдено». Через неё же выпустили aone-kit, aone-kit-cli, aone-sandbox и local-config-parser. Первые три пакета оказались пустыми оболочками с названиями закрытых компонентов @ali; в их файлах package.json соответствующие внутренние пакеты были прописаны как зависимости. Карло Занки описал схему так: «Первые три представляют собой пустые оболочки с теми же названиями, что и закрытые пакеты в области @ali, которые они указывают как зависимости в файле package.json». Пакет local-config-parser действительно разбирал конфигурационные JSON-файлы, а его отдельные зависимости, опубликованные другими пользователями npm, выглядели безвредно. Опасной становилась их комбинация.
Вредоносную логику разнесли по нескольким уровням дерева зависимостей. Верхние пакеты-приманки имитировали внутренние инструменты Alibaba, а в среде с доступом к настоящим пакетам @ali установка внешне проходила штатно. Socket пояснила: «Когда такой пакет устанавливается в среде, имеющей доступ к имитируемым закрытым пакетам с областью имён, разрешение зависимостей работает как ожидается, но вместе с дополнительными зависимостями устанавливается немного лишней функциональности». Исследователи насчитали до десяти верхнеуровневых приманок, связанных с smart-config-manager. Этот промежуточный пакет передавал управление нижним компонентам загрузчика. Один из них обращался к репозиторию GitHub, сохранял конфигурацию механизма правил и через него исполнял код, который загружал вторичное вредоносное ПО с удалённого сервера.
На последней стадии механизм правил использовал модуль Node.js vm, определял операционную систему и выбирал подходящую нагрузку с домена aone-cli-next.oss-cn-beijing.aliyuncs[.]com. Адрес был похож на обычный ресурс Alibaba и мог затеряться в привычном сетевом трафике. В Windows вредоносная программа завершала работу корпоративного приложения Alilang, совмещающего функции защиты, VPN и офисных инструментов, после чего подменяла его основной код троянизированной версией. В Linux бинарный файл загружался в /tmp, запускался отдельным процессом и удалялся с диска после помещения в память. В macOS атакующие добавляли фоновый сценарий в ~/.zshrc и создавали Launch Agent с десятиминутным интервалом запуска.
Итоговый RAT позволял выполнять произвольные команды, загружать и выгружать файлы, собирать сведения о компьютере, размещать новые полезные нагрузки и перемещаться по внутренней сети. Для закрепления он внедрял код в корпоративные и разработческие приложения DingTalk, Wukong и Qoder. Поэтому число загрузок npm-пакетов плохо описывает реальный масштаб: одна заражённая рабочая станция разработчика могла открыть путь к исходному коду, учётным данным, внутренним системам, интеллектуальной собственности и инфраструктуре сборки и развёртывания.
Связать кампанию с известной группировкой не удалось. В исходном коде найдены комментарии на китайском языке, а коммиты GitHub создавались с часовым смещением UTC+08:00. Вместе с выбором инструментов Alibaba это допускает участие китайскоязычного оператора, но не доказывает его происхождение. Карло Занки сформулировал оценку прямо: «Целью кампании, по-видимому, является промышленный шпионаж». Он также предупредил: «Хотя число загрузок вредоносных пакетов невелико, последствия кампании трудно оценить из-за её целевого характера и способности полезной нагрузки последней стадии распространяться по сети».
Полный набор связанных с атакой пакетов включает:
[]local-config-parser, smart-config-manager, cloud-config-fetcher, fast-transform-pipeline
[]aone-cloud-cli, colder-cli, def-open-client, feedback-ai-sdk
[]flight-compare-analyzer, lwp-web-client, lzd-unified-station-sdk
[]open-worker-cli, test-skill-zip, uniapi-bridge
Установку любого из этих 18 пакетов следует считать компрометацией системы. Пароли, токены, SSH-ключи и прочие секреты нужно менять с заведомо чистого компьютера. На машине разработчика стоит проверить процессы, сетевые соединения и следы закрепления в Alilang, ~/.zshrc, Launch Agents macOS, DingTalk, Wukong и Qoder. Проверкой одного компьютера дело не ограничивается: возможности бокового перемещения требуют аудита соседних узлов, репозиториев, CI/CD-среды и систем, к которым у заражённого пользователя был доступ.
Почти одновременно раскрылась отдельная атака на mrmustard, библиотеку фотонных квантовых вычислений Python от Xanadu. Неизвестные опубликовали заражённую версию mrmustard 0.7.4. При каждом импорте пакета, как установила StepSecurity, запускался похититель данных: он собирал закрытые SSH-ключи, учётные данные AWS и конфигурации Kubernetes, а затем отправлял их на сервер metrics.femboy[.]energy.
Анализ показал, что злоумышленники, вероятнее всего, взломали GitHub-аккаунт основного сопровождающего mrmustard, исследовали самостоятельно размещённые CI-раннеры проекта, похитили секреты для публикации пакетов и передали их на адрес webhook[.]site. Полученного доступа хватило для выпуска версии 0.7.4. По данным SafeDep, вредоносная программа создавала три независимых механизма закрепления: «Вредоносное ПО установило три отдельных механизма сохранения доступа, которые поддерживают работу похитителя ещё долго после удаления пакета». Помимо облачных секретов, код собирал очереди заданий SLURM и сведения о графических ускорителях, то есть искал инфраструктуру научных исследований и высокопроизводительных вычислений HPC.
Одним из центральных элементов был пакет lib-mtop без пространства имён, копировавший название закрытого пакета Alibaba из области @ali. Впервые его опубликовали в ноябре 2023 года, причём начальная версия ничего не делала. В марте и апреле появились версии 1.0.1, 1.0.2 и 1.0.3 с вредоносным загрузчиком: он вызывал curl, получал удалённый JavaScript-код и запускал его. Не установлено, захватили ли злоумышленники учётную запись сопровождающего или сам разработчик решил превратить пакет в оружие.
Пакет lib-mtop обслуживала учётная запись ch4ce, которая на момент расследования открывала на npmjs[.]com страницу с ошибкой «не найдено». Через неё же выпустили aone-kit, aone-kit-cli, aone-sandbox и local-config-parser. Первые три пакета оказались пустыми оболочками с названиями закрытых компонентов @ali; в их файлах package.json соответствующие внутренние пакеты были прописаны как зависимости. Карло Занки описал схему так: «Первые три представляют собой пустые оболочки с теми же названиями, что и закрытые пакеты в области @ali, которые они указывают как зависимости в файле package.json». Пакет local-config-parser действительно разбирал конфигурационные JSON-файлы, а его отдельные зависимости, опубликованные другими пользователями npm, выглядели безвредно. Опасной становилась их комбинация.
Вредоносную логику разнесли по нескольким уровням дерева зависимостей. Верхние пакеты-приманки имитировали внутренние инструменты Alibaba, а в среде с доступом к настоящим пакетам @ali установка внешне проходила штатно. Socket пояснила: «Когда такой пакет устанавливается в среде, имеющей доступ к имитируемым закрытым пакетам с областью имён, разрешение зависимостей работает как ожидается, но вместе с дополнительными зависимостями устанавливается немного лишней функциональности». Исследователи насчитали до десяти верхнеуровневых приманок, связанных с smart-config-manager. Этот промежуточный пакет передавал управление нижним компонентам загрузчика. Один из них обращался к репозиторию GitHub, сохранял конфигурацию механизма правил и через него исполнял код, который загружал вторичное вредоносное ПО с удалённого сервера.
На последней стадии механизм правил использовал модуль Node.js vm, определял операционную систему и выбирал подходящую нагрузку с домена aone-cli-next.oss-cn-beijing.aliyuncs[.]com. Адрес был похож на обычный ресурс Alibaba и мог затеряться в привычном сетевом трафике. В Windows вредоносная программа завершала работу корпоративного приложения Alilang, совмещающего функции защиты, VPN и офисных инструментов, после чего подменяла его основной код троянизированной версией. В Linux бинарный файл загружался в /tmp, запускался отдельным процессом и удалялся с диска после помещения в память. В macOS атакующие добавляли фоновый сценарий в ~/.zshrc и создавали Launch Agent с десятиминутным интервалом запуска.
Итоговый RAT позволял выполнять произвольные команды, загружать и выгружать файлы, собирать сведения о компьютере, размещать новые полезные нагрузки и перемещаться по внутренней сети. Для закрепления он внедрял код в корпоративные и разработческие приложения DingTalk, Wukong и Qoder. Поэтому число загрузок npm-пакетов плохо описывает реальный масштаб: одна заражённая рабочая станция разработчика могла открыть путь к исходному коду, учётным данным, внутренним системам, интеллектуальной собственности и инфраструктуре сборки и развёртывания.
Связать кампанию с известной группировкой не удалось. В исходном коде найдены комментарии на китайском языке, а коммиты GitHub создавались с часовым смещением UTC+08:00. Вместе с выбором инструментов Alibaba это допускает участие китайскоязычного оператора, но не доказывает его происхождение. Карло Занки сформулировал оценку прямо: «Целью кампании, по-видимому, является промышленный шпионаж». Он также предупредил: «Хотя число загрузок вредоносных пакетов невелико, последствия кампании трудно оценить из-за её целевого характера и способности полезной нагрузки последней стадии распространяться по сети».
Полный набор связанных с атакой пакетов включает:
- []
[]local-config-parser, smart-config-manager, cloud-config-fetcher, fast-transform-pipeline
[]aone-cloud-cli, colder-cli, def-open-client, feedback-ai-sdk
[]flight-compare-analyzer, lwp-web-client, lzd-unified-station-sdk
[]open-worker-cli, test-skill-zip, uniapi-bridge
Установку любого из этих 18 пакетов следует считать компрометацией системы. Пароли, токены, SSH-ключи и прочие секреты нужно менять с заведомо чистого компьютера. На машине разработчика стоит проверить процессы, сетевые соединения и следы закрепления в Alilang, ~/.zshrc, Launch Agents macOS, DingTalk, Wukong и Qoder. Проверкой одного компьютера дело не ограничивается: возможности бокового перемещения требуют аудита соседних узлов, репозиториев, CI/CD-среды и систем, к которым у заражённого пользователя был доступ.
Почти одновременно раскрылась отдельная атака на mrmustard, библиотеку фотонных квантовых вычислений Python от Xanadu. Неизвестные опубликовали заражённую версию mrmustard 0.7.4. При каждом импорте пакета, как установила StepSecurity, запускался похититель данных: он собирал закрытые SSH-ключи, учётные данные AWS и конфигурации Kubernetes, а затем отправлял их на сервер metrics.femboy[.]energy.
Анализ показал, что злоумышленники, вероятнее всего, взломали GitHub-аккаунт основного сопровождающего mrmustard, исследовали самостоятельно размещённые CI-раннеры проекта, похитили секреты для публикации пакетов и передали их на адрес webhook[.]site. Полученного доступа хватило для выпуска версии 0.7.4. По данным SafeDep, вредоносная программа создавала три независимых механизма закрепления: «Вредоносное ПО установило три отдельных механизма сохранения доступа, которые поддерживают работу похитителя ещё долго после удаления пакета». Помимо облачных секретов, код собирал очереди заданий SLURM и сведения о графических ускорителях, то есть искал инфраструктуру научных исследований и высокопроизводительных вычислений HPC.