Червь в реестре: как CanisterWorm превратил npm в самораспространяющуюся ловушку?

Атака началась не с нуля. Группировка TeamPCP, специализирующаяся на облачных системах, сначала опубликовала троянизированные релизы Trivy — популярного инструмента для сканирования уязвимостей. Конкретно под удар попала версия 0.69.4. Внутри был встроен похититель учётных данных. Именно украденные npm-токены стали топливом для всего того, что последовало дальше. Прошли почти сутки — и в реестре npm появился червь.
Червь в реестре: как CanisterWorm превратил npm в самораспространяющуюся ловушку?
Изображение носит иллюстративный характер

Исследователь безопасности Чарли Эриксен из Aikido Security первым зафиксировал заражение. На тот момент вредоносный код был обнаружен в 47 пакетах: 28 из них принадлежали области @EmilGroup, 16 — @opengov, плюс отдельные пакеты @teale.io/eslint-config, @airtm/uuid-base32 и @pypestream/floating-ui-dom. Компания Socket обновила эти цифры позже — 141 вредоносный артефакт, более 66 уникальных пакетов. Расползалось быстро.
Вредоносное ПО получило имя CanisterWorm. Эксперты из Endor Labs также называют его Shai-Hulud. По оценке аналитиков, код написан в стиле "vibe coding" — с помощью AI-инструмента, что хорошо читается по структуре файлов. Это, впрочем, не сделало его менее опасным.
Механизм заражения запускается через postinstall-хук — стандартный крючок жизненного цикла npm-пакета, который выполняется автоматически при установке. Хук загружает Python-бэкдор. Тот, в свою очередь, обращается не к обычному C2-серверу, а к ICP-канистре — защищённому смарт-контракту на блокчейне Internet Computer. Это первый публично задокументированный случай, когда малварь использует ICP-канистру как нетейкдаун-устойчивый dead drop для получения адреса командного сервера следующего уровня. Традиционный C2 можно заблокировать. Смарт-контракт на блокчейне — значительно сложнее.
Бэкдор закрепляется в системе через systemd user service с директивой Restart=always. Если процесс убить — он перезапустится через 5 секунд. Сервис маскируется под PostgreSQL-инструментарий и называется pgmon. Каждые 50 минут бэкдор отправляет запрос к ICP-канистре, используя подделанный User-Agent браузера, и получает в ответ обычный текстовый URL. Канистра поддерживает три метода: get_latest_link, http_request и update_link. Полученный URL парсится и исполняется. Старые бинарники при этом не завершаются — они просто продолжают работать в фоне.
Канистра сейчас возвращает ссылку на YouTube — точнее, на «рикролл». Это не сбой и не ирония. Если в полученном URL содержится youtube[.]com, скрипт пропускает его и ничего не делает. Атакующие используют YouTube-ссылку как переключатель спящего режима: оружие вооружается переключением канистры на реальный бинарник через метод update_link, и разоружается возвратом на YouTube. На этапе тестирования цепочки заражения злоумышленники временно выставляли строку hello123 — чтобы убедиться, что вся инфраструктура работает до того, как выкатить настоящую нагрузку.
Самое примечательное в этой атаке — её эволюция. На первом этапе в пакетах находился файл deploy.js — автономный инструмент развёртывания, который атакующий запускал вручную с украденными токенами, чтобы заталкивать вредоносный код в реестр. Это трудоёмко и требует участия человека. Версии CanisterWorm 1.8.11 и 1.8.12 изменили правила.
В файле index.js появилась функция findNpmTokens(). В момент выполнения postinstall-хука червь сканирует окружение разработчика в поисках npm-токенов аутентификации. Как только токен найден, deploy.js немедленно запускается как отдельный фоновый процесс с этим токеном. Машина разработчика или CI-пайплайн превращаются в новый вектор распространения — без какого-либо ручного вмешательства со стороны атакующих.
Хенрик Плейт, руководитель исследований безопасности в Endor Labs, точно описал суть проблемы: похищение учётных данных через postinstall-хуки само по себе не редкость. Но способность мгновенно использовать украденные токены для перепубликации пакетов жертвы — это другой уровень. Один взломанный разработчик становится точкой распространения для всех, кто пользуется его пакетами. Цепочка расширяется экспоненциально.
Компании Wiz, JFrog, Socket, Aikido Security и Endor Labs сходятся в классификации: это двойная угроза. Пакет одновременно собирает учётные данные и сбрасывает малварь. Wiz дополнительно зафиксировала Python-дроппер sysmon.py. Скомпрометированными оказались также релизы trivy-action и setup-trivy — инструменты, которые активно используются в CI/CD-пайплайнах. То есть заражение могло проходить не только через машины разработчиков, но и через автоматизированные сборочные процессы в продакшене.


Новое на сайте

19641OpenAI залатала две дыры: как через ChatGPT и Codex утекали данные пользователей 19640Утечки секретов ускоряются быстрее, чем индустрия успевает их затыкать 19639Метавселенная всё-таки умерла? 19638Почему люди до сих пор верят, что пришельцы создали древние цивилизации? 19637Растения у Колорадо крадут подземные воды, усугубляя засуху в и без того истощённом... 19636Уязвимость ShadowPrompt: как любой сайт мог молча захватить браузер через расширение... 19635Может ли война с Ираном оставить голодными 363 миллиона человек по всему миру? 19634Зачем роботам терять конечности, если ИИ научился собирать их заново за секунды? 19633Шахматы по телеграфу — первый в истории киберспорт? 19632Почему фреймворки LangChain и LangGraph ставят под удар файлы, секреты и базы данных... 19631Почему кошки приручили нас, а не мы их? 19630Что нашли дайверы на дне эгейского моря в бриге лорда Элгина? 19629Почему 65 000 лет назад в Европе выжила только одна линия неандертальцев? 19628DeepLoad: как поддельное окно Windows крадёт пароли и расползается по флешкам 19627Почему три китайские хакерские группировки одновременно атаковали одно правительство в...
Ссылка