Как вредоносный код внедряется в систему и почему его почти невозможно заблокировать.

Атака на один популярный инструмент незаметно превратилась в цепную реакцию, которая теперь заражает пакеты по всей экосистеме npm. Вредоносный код не просто прячется в отдельных библиотеках, а сам распространяется дальше, используя украденные доступы разработчиков.
Речь идёт о кампании CanisterWorm, за которой стоит группа TeamPCP. История началась с компрометации утилиты Trivy. В одной из версий злоумышленники встроили механизм кражи учётных данных в цепочку сборки. После запуска в среде разработки вредоносный код собирал токены npm и отправлял их атакующим. Дальше с помощью украденных токенов публиковались новые версии пакетов уже с внедрённой закладкой. Так пострадали десятки библиотек, включая пространство имён @opengov.
Каждая заражённая версия работает одинаково. При установке через npm автоматически запускается скрытый сценарий. Он записывает на систему жертвы вредоносный модуль на Python и добавляет службу в systemd, которая запускается при каждом входе в систему и переживает перезагрузки. Для этого не нужны права администратора, поэтому пользователь ничего не замечает.
Дальше вредоносный модуль связывается с сервером управления, который размещён не на обычном хостинге, а в сети Internet Computer. Такой выбор усложняет блокировку, поскольку нет привычного провайдера или доменного регистратора, через которых можно быстро отключить инфраструктуру.
Главная особенность CanisterWorm – способность к самораспространению. На заражённой машине запускается дополнительный процесс, который ищет токены npm в конфигурационных файлах и переменных окружения. Затем вредоносный код определяет, к каким пакетам есть доступ, повышает номер версии, внедряет себя и публикует обновления. Каждый новый разработчик, установивший такой пакет, становится следующей точкой заражения.
Внутри вредоносного кода скрыт ещё один уровень. Закладка загружает дополнительную нагрузку с сервера управления. В некоторых случаях она ограничивается сохранением доступа к системе. Но при определённых условиях сценарий становится разрушительным. В среде Kubernetes вредоносный код разворачивает привилегированные компоненты на всех узлах и удаляет файловую систему. На обычных системах может выполняться команда полного удаления данных.
Даже если разрушительный сценарий не срабатывает, проблема никуда не исчезает. Закладка продолжает работать, поддерживает связь с сервером управления и оставляет атакующим полный доступ.
Следы заражения можно найти на уровне системы. Вредоносный модуль сохраняется в каталоге пользователя, рядом появляется служба systemd, а временные файлы могут указывать на загрузку дополнительной нагрузки. В сетевых журналах можно заметить обращения к домену в сети Internet Computer, который используется как центр управления.
После установки подозрительных пакетов безопаснее считать, что все учётные данные скомпрометированы. Рекомендуется немедленно сменить токены npm, ключи облачных сервисов, учётные данные контейнерных реестров и другие секреты, которые могли находиться в системе или в среде сборки. Также стоит зафиксировать зависимости на последних проверенных версиях, пока разработчики не выпустят очищенные обновления.
CanisterWorm показывает, как одна уязвимость в цепочке поставок превращается в масштабную эпидемию. Вредоносный код больше не ждёт, пока его установят вручную. Он сам находит новые цели и распространяется быстрее, чем успевают реагировать команды разработки.