В 42 NPM-пакета TanStack интегрировано вредоносное ПО с самораспространяющимся червём
Дата публикации:Tue, 12 May 2026 22:03:43 +0300
В результате компрометации процесса формирования релизов на базе GitHub Actions атакующим удалось опубликовать в репозитории NPM 84 вредоносные версии, охватывающие 42 NPM-пакета из стека TanStack. Некоторые из скомпрометированных пакетов насчитывали более 10 миллионов загрузок в неделю.
Доступ к публикации релизов был получен из-за неверной настройки pull_request_target "Pwn Request" (указание маски в настройках привело к запуску pull_request_target для pull-запросов в сторонние форки), отравления кэша GitHub Actions через форк и возможности извлечения OIDC-токена из памяти запущенного runner-процесса (Runner.Worker) через чтение содержимого /proc/<pid>/mem.
NPM-пакеты с вредоносными изменениями были опубликованы 11 мая с 22:20 до 22:26 (MSK), замечены через 20 минут и блокированы спустя полтора часа. Для каждого из NPM-пакетов были выпущены по две вредоносные версии, в которые был интегрирован код для активации червя mini-shai-hulud, выполняющего поиск токенов и учётных данных в текущем окружении. В случае обнаружения токена подключения к каталогу NPM червь автоматически публикует новые вредоносные релизы для разрабатываемых в текущем окружении пакетов, поражая дерево зависимостей. Таким способом было поражено ещё более 200 NPM-пакетов, использующих пакеты TanStack в числе зависимостей.
Червь размещался в файле router_init.js и активировался при установке поражённого пакета вручную разработчиком или автоматизированно в окружении непрерывной интеграции при помощи команд "npm install", "pnpm install" или "yarn install". После активации червь выполнял поиск в системе токенов к NPM (~/.npmrc), AWS, GCP, Azure, HashiCorp и KubernetesK8s, а также закрытых ключей SSH. Найденные данные отправлялись через сервис getsession.org.
В черве было предусмотрено совершение деструктивных действий в случае отзыва перехваченного токена - в системе настраивался периодический запуск скрипта ~/.local/bin/gh-token-monitor.sh, который каждые 60 секунд проверял активность токена через обращение к api.github.com/user и в случае отзыва токента выполнял команду "rm -rf ~/".
Новость позаимствована с opennet.ru
Ссылка на оригинал: https://www.opennet.ru/opennews/art.shtml?num=65432