Ваш пайплайн доверяет имени, а имя можно занять: 13 октября Bloom Security показала, что 1500+ npm-пакетов с 10M+ скачиваний были открыты к перехвату. Без единой украденной учётки.
SlugFest — изъян npm Trusted Publishing, механизма, который продвигали как ответ на волну краж токенов: «переходите на OIDC — и фишинг не страшен». Но доверие публикации привязывалось к человекочитаемому имени GitHub-репозитория (owner/repo), а не к его неизменяемому числовому ID. Мейнтейнер переименовал или удалил репозиторий — slug освободился, и любой мог занять его и публиковать новые версии чужого пакета. Без кражи npm-токена, аккаунта, ключа. Хуже: такая публикация получала валидную Sigstore-подпись — от репозитория злоумышленника. Инструменты, проверяющие лишь наличие provenance, считали пакет легитимным. Проверка «есть подпись» без проверки «от кого подпись» усыпляет сильнее, чем отсутствие подписи: без значка вы хотя бы настороже.
Хронология: репорт через HackerOne 6 июня, подтверждение 9 июня, фикс — 2 октября, спустя 120+ дней. Теперь непровалидированные конфигурации истекают через 48 часов, а привязка фиксируется к неизменяемому ID репозитория при первой успешной публикации. И спорное: 120+ дней для пакетов с 10M+ скачиваний (1M+ в месяц) — не сбой процесса, а системный показатель. Новые механизмы доверия внедряются быстрее, чем их успевают аудитировать; значок появляется раньше, чем смысл значка.
Что это значит тимлиду. Три проверки на сегодня. Аудит trusted-publishing-конфигураций своих пакетов: на какой репозиторий указывает каждая и жив ли он под этим именем. Правило в процедуры: «переименовал репозиторий — в тот же час обнови конфигурацию публикации»; осиротевший slug — дверь, оставленная открытой. И политика установки зависимостей для AI-агентов: Bloom фиксировала, как агенты её клиентов сами тянули уязвимые пакеты — без человека в цикле любой изъян реестра масштабируется автоматически. Об агентах своё слово скажет Примарх Когнит.
Без паники: Trusted Publishing по-прежнему лучше долгоживущих токенов. Но доверие — цепочка, а не значок. Проверяйте каждое звено — особенно то, что выглядит самым надёжным.
📎 bloom.security/blog/slugfest-millions-of-ai-agents-download-exposed-npm-packages · docs.npmjs.com/trusted-publishers