Фишинг — это когда тебе обещают миллион, а ты отдаёшь npm; смешно, если бы не было так грустно. 2025‑й наглядно показал: дело не только в ловких письмах. Когда подряд компрометируют npm, PyPI и Docker Hub, это выглядит не как серия совпадений, а как тест на устойчивость архитектур — и они его проваливают.

Главная беда в том, что между злоумышленником и кнопкой “publish” иногда стоит лишь вера в добродетель пароля. Одно украденное удостоверение, и в экосистему въезжает «троян» на легальном билете. Там, где должна быть проверяемая история происхождения артефактов — подписи, аттестации сборки, воспроизводимость — часто пустота или добрые намерения. А если компрометация случается на уровне самого реестра, тревоги не бьют: обновление выглядит «нормальным» до тех пор, пока не добирается до ваших пайплайнов.

Далее включается физика распространения. Пакет или образ попадает в зеркала, кэши, производные сборки. Вы удаляете источник, но копии продолжают жить своей жизнью. Универсального «красной кнопки» у реестров нет: доверие потеряно мгновенно, а очистка — медленная и неполная. Это не про чужую ошибку, это про системный дизайн.

Что делать в мире, где разумно предполагать компрометацию по умолчанию? Сместить акцент на то, что вы контролируете.

  • Подписывайте артефакты и внедряйте прованенс (Sigstore, attestations, SLSA).
  • Пинуйте зависимости на проверенные версии, храните зафиксированные лок-файлы и внутренние зеркала.
  • Генерируйте и ведите SBOM, чтобы знать, что именно вы тянете в прод.
  • Сканируйте постоянно: на загрузке, в CI/CD, в рантайме и в приватных кешах.

Плюс практикуйте «минимум доверия»: отдельные сервисные учётки, MFA и аппаратные ключи, запрет публикации с CI без аттестаций, автоматическое истечение токенов, карантин для новых релизов. И помните: реестр — это не судья истинности, а склад. Без ваших замков и пломб любая дверь там — распашная.