Новости
Взлом npm-пакетов keyv и cacheable: крупная атака на цепочку поставок
Захват аккаунта мейнтейнера превратился в червя, заразившего сотни пакетов с суммарно 500+ млн загрузок в неделю.
Чтобы захватить чужой npm-пакет, не нужно красть пароль или токен — достаточно было занять освободившееся имя GitHub-репозитория. 13 октября 2026 года компания Bloom Security раскрыла уязвимость SlugFest в механизме npm Trusted Publishing: система доверяла человекочитаемому адресу репозитория вместо его неизменяемого ID. Под угрозой — более 1500 пакетов с десятками миллионов загрузок. GitHub закрыл дыру ещё 2 октября, но до сих пор не каждый мейнтейнер знает, что был уязвим.

Коротко: 13 октября 2026 года Bloom Security раскрыла уязвимость SlugFest в npm Trusted Publishing — механизме, который позволяет публиковать пакеты прямо из GitHub Actions без ручного ввода токена. Проблема в том, что npm привязывал доверие к адресу репозитория (owner/repo), а не к его постоянному числовому ID. Переименованный или удалённый репозиторий освобождал старое имя, и злоумышленник мог занять его и публиковать новые версии чужого пакета без единой кражи учётных данных. Исследователи насчитали более 1500 потенциально уязвимых пакетов суммарно с 10+ млн загрузок. GitHub выпустил исправление 2 октября 2026 года.
Trusted Publishing — это схема на основе протокола OIDC: npm доверяет сборке, запущенной из определённого workflow конкретного GitHub-репозитория, и позволяет ей публиковать новые версии пакета без хранения долгоживущего токена доступа. Задумано это было как защита от утечек секретов — именно долгоживущие токены публикации много лет остаются главной причиной атак на цепочку поставок npm.
Загвоздка оказалась в том, по какому признаку npm проверял, что workflow действительно принадлежит «тому самому» репозиторию. Вместо постоянного числового ID репозитория GitHub система сверялась с его человекочитаемым адресом — связкой «владелец/имя» (slug). А этот адрес, в отличие от ID, не закреплён за репозиторием навсегда: его можно освободить, переименовав или удалив репозиторий.
Механика атаки, которую описала Bloom Security, не требовала взлома:
slug освободился.owner/repo.Никаких украденных токенов, паролей или фишинга. Единственное, что требовалось атакующему, — вовремя заметить освободившийся адрес репозитория и зарегистрировать его на себя.
По данным Bloom Security, под риском захвата находились более 1500 npm-пакетов с суммарно более 10 млн загрузок — часть из них скачивают свыше 1 млн раз в месяц. Отдельно исследователи отметили, что риск усиливают ИИ-агенты для написания кода: такие инструменты автоматически создают и переименовывают репозитории в рамках своей работы, повышая шанс случайно освободить адрес, который всё ещё привязан к живой публикационной конфигурации npm.
Это не первый инцидент вокруг npm в октябре 2026 года: несколькими днями ранее экосистему уже встряхнул самораспространяющийся вредонос в пакете tensorlake, использовавший легитимный workflow сопровождающего для публикации заражённой версии. SlugFest — другой по механике случай: здесь уязвима не отдельная сборка, а сама логика проверки доверия у платформы.
Bloom Security сообщила об SlugFest в GitHub ещё 6 июня 2026 года. Исправление вышло 2 октября 2026 года — спустя почти четыре месяца. Решение не меняет саму идею Trusted Publishing, а добавляет страховку на случай зависших настроек:
Публичного списка затронутых пакетов GitHub и npm не раскрывали — проверка велась по внутренним данным платформы.
Для темы нашего сайта вывод простой: пакет — это файл с манифестом, и безопасность его публикации зависит не только от того, кто ввёл пароль, но и от того, как платформа технически определяет «доверенный источник». SlugFest показал, что даже без токенов и фишинга слабое звено может быть в самой логике идентификации.
Рядовым пользователям веб-приложений отдельных действий не требуется — атака нацелена на разработчиков и инфраструктуру публикации пакетов. Но общий принцип стоит запомнить: безопасность файла или пакета — это не только «кто его подписал», но и «что именно платформа на самом деле проверяет». Базовые правила безопасной работы с файлами и вложениями — в разделе безопасность файлов.