Skip to content
EN

Цепочка поставок npm в 2026 году: что измерено, а что спам

Кратко. В декабре 2025 года npm отозвал все долгоживущие токены — меру, ради которой всё и затевалось после атак того года.

В декабре 2025 года npm отозвал все долгоживущие токены — меру, ради которой всё и затевалось после атак того года. Она сработала. И две из трёх червевых кампаний 2026 года обошли её полностью, злоупотребив доверенной публикацией через OIDC, то есть тем самым контролем, который ввели взамен.

Ниже — измеренные числа: 220 139 вредоносных пакетов в открытом наборе, из которых три четверти прошлогодних оказались одной спам-кампанией; отсутствие классического тайпсквоттинга в данных 2026 года; и наш замер того, удаляют ли найденное на самом деле.

Размер реестра и объём скачиваний

27 августа 2026 года мы запросили счётчики напрямую:

ПоказательЗначениеЧто это
Пакетов в реестре4 334 379документы в реплике, включая заглушки и неопубликованное — верхняя оценка
Скачиваний за месяц601 025 022 14627.07 — 25.08.2026
Скачиваний за сутки37 969 071 48125.08.2026

Скачивания — не люди и не организации. Это объём запросов к реестру, в котором преобладают повторные загрузки сборочных конвейеров. Sonatype формулирует то же самое прямо: скачивания — «сигнал потребления, а не мера уникальных пользователей».

Рост реестра за 2026 год — около 2 470 пакетов в сутки чистыми. Слово «чистыми» существенно: во втором полугодии 2023 года счётчик упал на 650 тысяч, потому что npm вычищал спам. Отделить публикации от удалений по открытым данным нельзя.

Данные исследования

Исходные данные всех таблиц этого отчёта доступны в виде открытого CSV-файла (UTF-8, первая строка — заголовки).

Скачать датасет (CSV)

Вредоносных пакетов: 220 тысяч, но три четверти прошлогодних — один спам

Открытый набор OSV содержит 220 139 записей о вредоносных пакетах npm. По годам публикации:

ГодЗаписейЗа вычетом массовых кампаний
20227 4247 424
20232 2912 291
20248 3728 372
2025191 42046 148
2026 (до 27 августа)10 62710 627

Цифра 191 420 за 2025 год — ловушка, и цитировать её без оговорки нельзя. Около 140 тысяч записей приходятся на четыре дня ноября и относятся к одной спам-кампании: пакеты с автогенерируемыми именами публиковались ради накрутки репутации в чужой токен-программе. Текст самих записей OSV это прямо и констатирует.

Sonatype независимо описывает ту же кампанию по другому корпусу — 169 538 пакетов, «саморазмножавшихся каждые семь секунд». Два измерения, одна кампания.

Очищенная от этих всплесков картина скромнее и информативнее: в 2026 году в среднем около тысячи записей в месяц, с ростом внутри года — 329 в феврале, 2 984 в августе.

Для масштаба: у PyPI за 2026 год 1 298 записей против 10 627 у npm — разрыв в восемь раз.

Классического тайпсквоттинга в 2026 году в этих данных нет

Мы разобрали все 10 627 имён, помеченных за 2026 год. Результат неожиданный:

ПризнакРезультат
Имён без области (@org/)7 609 (71,6%)
Именованных областей3 018 (28,4%), 1 078 разных областей
Отличаются одной буквой от популярного пакета0 из 7 609
Содержат имя популярного пакета как часть848 (7,98%)

Вместо подделок под lodash и express преобладает захват целой области имён: @antv — 279 записей, @servicetitan — 141, @cloudplatform-single-spa — 122, @mastra — 89, @uipath — 66.

Эти области в точности совпадают с жертвами известных атак года. Что логично, если механизм такой: украли доступ — перечислили всё, что учётная запись может публиковать, — перевыпустили целиком.

Границы вывода: список популярных пакетов для сравнения состоял из 54 имён, а «отличие в одну букву» — узкое определение: оно не ловит перестановки, подделки под бренд и составные имена. Читать это надо как «в 2026 году угроза выглядит иначе», а не как «тайпсквоттинга больше не бывает».

Защита сработала — и её обошли тем же механизмом, что ввели для защиты

После атак 2025 года npm закрутил гайки, и хронология важна:

ДатаЧто сделано
05.11.2025новые классические токены запрещены, срок гранулярных ограничен 90 днями
09.12.2025все существующие классические токены отозваны; вход выдаёт сессию на два часа; двухфакторность обязательна для публикации
08.07.2026npm 12: скрипты жизненного цикла (preinstall, postinstall) выключены по умолчанию

Меры работают: долгоживущих токенов, которыми пользовались в 2025-м, больше нет.

И тем не менее две из трёх червевых кампаний 2026 года обошли их полностью. Механизм — злоупотребление доверенной публикацией через OIDC, то есть ровно тем контролем, который ввели взамен токенов. Разбор майской кампании констатирует: «каждая предыдущая волна начиналась с украденного доступа; эта — нет». Вместо кражи учётной записи использовалась ошибка в настройке рабочего процесса сборки и отравление её кэша.

Вывод неприятный, но важный: уничтожение долгоживущих токенов не убрало угрозу, а подняло её этажом выше — в системы сборки, которые теперь и держат доверие.

Июньская кампания дошла до предела этой логики: подменённые версии публиковались с действительными подтверждениями происхождения. Подпись была настоящей, потому что подписывал скомпрометированный конвейер.

Хронология 2026 года с проверенными датами

Каждое событие ниже сверено с записями OSV.

  • 30–31 марта, axios. Заражённая версия прожила около трёх часов. Вектор — не фишинг учётной записи: по разбору самих сопровождающих, доступ получили к компьютеру ведущего разработчика через адресную социальную инженерию и программу удалённого управления.
  • 11–12 мая. Червь опубликован на GitHub под свободной лицензией — то есть стал доступен всем желающим. Обошёл защиту через OIDC.
  • 1 июня, 32 пакета Red Hat. Вектор — компрометация учётной записи через вредоносное расширение редактора кода. В бюллетене Red Hat указано 32 пакета, и в OSV их ровно 32. Два независимых источника, совпадение до единицы.
  • 4 августа, keyv и смежные. Оценки числа пакетов у разных источников расходятся — «более 400» у одних и «более 1 300 версий» у других. Складывать их нельзя: одни считают пакеты, другие версии.

И отрезвляющая деталь про 2025 год. Самая громкая атака сентября 2025-го, затронувшая пакеты с сотнями миллионов еженедельных скачиваний, прожила около двух часов и принесла нападавшим, по независимому подсчёту, около пяти центов в эфире плюс двадцать долларов в мемкоине. Разбор так и называется — «Ой, жертв нет».

Отдельно про исторические события, которые часто пересказывают неверно: left-pad (2016) — это отказ в доступности, а не атака, вредоносного кода там не было вовсе; а xz-utils (2024) к npm отношения не имеет — это библиотека сжатия в Linux.

Почему цифры вендоров расходятся на порядок

За календарный 2025 год по npm:

ИсточникВредоносных пакетов
ReversingLabs10 819
Datadog13 994
OSV, очищенный от спама~14–46 тысяч
OSV, как есть191 420
Sonatype (все экосистемы)454 648

Первые три сходятся в пределах трети — расхождение с остальными определительное, а не эмпирическое. OSV считает пакеты, Datadog — версии; спам одни включают, другие нет; Sonatype смешивает все реестры.

Отдельно про заголовок «вредоносное ПО выросло на 75%». Это рост накопительного итога между двумя выпусками отчёта с интервалом в пятнадцать с половиной месяцев, а не годовой прирост новых обнаружений — тот на сопоставимой базе около 6%. И по собственной классификации Sonatype 83,4% из тех 454 648 — это спам и мусор, а не боевая нагрузка.

Общее правило: каждая такая цифра — это способность конкретного вендора обнаруживать на его же корпусе. Это нижняя граница, а не доля. Долю никто не публикует, потому что знаменатель неизвестен.

Кто на самом деле находит: в открытом наборе за 2026 год Amazon Inspector (18 026 сообщений) и GitHub (6 094). Socket, Snyk, Sonatype в этот набор не вносят ничего.

Удаляют ли найденное — наш замер

Мы взяли 200 пакетов, помеченных вредоносными в 2026 году, и запросили каждый в реестре. 194 отдают ответ 200, шесть — 404. Но код 200 не означает, что вредоносное на месте: при разборе шестидесяти из них картина такая:

СостояниеПакетовЧто это значит
Заглушка npm26 (43%)содержимое заменено служебной пометкой
Снято с публикации24 (40%)версий не осталось
Живой законный пакет10 (17%)скомпрометированный проект вычистили и вернули

Ни одного случая, когда вредоносное всё ещё можно установить, мы не нашли. Десять «живых» — это как раз пострадавшие области имён вроде @qlik и @antv, восстановленные после чистки.

Оговорка: разобрано шестьдесят из двухсот, и мы не сверяли историю версий, чтобы убедиться, что исчезли именно заражённые. Утверждение — «удаление выглядит доведённым до конца», а не «гарантированно завершено».

Смежная тема — глубина зависимостей — разобрана в отдельной статье.

Источники: открытый набор OSV/OpenSSF, реплика реестра npm, счётчик скачиваний, изменения npm 12.

Часто задаваемые вопросы

npm audit достаточно?

Минимум. Snyk / Socket.dev / GitGuardian деплят behavioral analysis + zero-day detection.

Как защититься от typosquatting?

package.json reviews в PR, npm install --ignore-scripts (block post-install hooks), allowlists в registry-proxy.

SBOM — обязательно?

Для US federal contracts — yes (EO 14028). Для SaaS с enterprise — часто требуют. Best practice в 2026.

Запустить инструмент, который описан в этой статье

Бесплатный тариф — 10 мониторов, проверки каждые 5 мин, без карты. Платные тарифы — интервал от 1 минуты и проверки из нескольких регионов.