В декабре 2025 года npm отозвал все долгоживущие токены — меру, ради которой всё и затевалось после атак того года. Она сработала. И две из трёх червевых кампаний 2026 года обошли её полностью, злоупотребив доверенной публикацией через OIDC, то есть тем самым контролем, который ввели взамен.
Ниже — измеренные числа: 220 139 вредоносных пакетов в открытом наборе, из которых три четверти прошлогодних оказались одной спам-кампанией; отсутствие классического тайпсквоттинга в данных 2026 года; и наш замер того, удаляют ли найденное на самом деле.
27 августа 2026 года мы запросили счётчики напрямую:
| Показатель | Значение | Что это |
|---|---|---|
| Пакетов в реестре | 4 334 379 | документы в реплике, включая заглушки и неопубликованное — верхняя оценка |
| Скачиваний за месяц | 601 025 022 146 | 27.07 — 25.08.2026 |
| Скачиваний за сутки | 37 969 071 481 | 25.08.2026 |
Скачивания — не люди и не организации. Это объём запросов к реестру, в котором преобладают повторные загрузки сборочных конвейеров. Sonatype формулирует то же самое прямо: скачивания — «сигнал потребления, а не мера уникальных пользователей».
Рост реестра за 2026 год — около 2 470 пакетов в сутки чистыми. Слово «чистыми» существенно: во втором полугодии 2023 года счётчик упал на 650 тысяч, потому что npm вычищал спам. Отделить публикации от удалений по открытым данным нельзя.
Исходные данные всех таблиц этого отчёта доступны в виде открытого CSV-файла (UTF-8, первая строка — заголовки).
Скачать датасет (CSV)Открытый набор OSV содержит 220 139 записей о вредоносных пакетах npm. По годам публикации:
| Год | Записей | За вычетом массовых кампаний |
|---|---|---|
| 2022 | 7 424 | 7 424 |
| 2023 | 2 291 | 2 291 |
| 2024 | 8 372 | 8 372 |
| 2025 | 191 420 | 46 148 |
| 2026 (до 27 августа) | 10 627 | 10 627 |
Цифра 191 420 за 2025 год — ловушка, и цитировать её без оговорки нельзя. Около 140 тысяч записей приходятся на четыре дня ноября и относятся к одной спам-кампании: пакеты с автогенерируемыми именами публиковались ради накрутки репутации в чужой токен-программе. Текст самих записей OSV это прямо и констатирует.
Sonatype независимо описывает ту же кампанию по другому корпусу — 169 538 пакетов, «саморазмножавшихся каждые семь секунд». Два измерения, одна кампания.
Очищенная от этих всплесков картина скромнее и информативнее: в 2026 году в среднем около тысячи записей в месяц, с ростом внутри года — 329 в феврале, 2 984 в августе.
Для масштаба: у PyPI за 2026 год 1 298 записей против 10 627 у npm — разрыв в восемь раз.
Мы разобрали все 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.2026 | npm 12: скрипты жизненного цикла (preinstall, postinstall) выключены по умолчанию |
Меры работают: долгоживущих токенов, которыми пользовались в 2025-м, больше нет.
И тем не менее две из трёх червевых кампаний 2026 года обошли их полностью. Механизм — злоупотребление доверенной публикацией через OIDC, то есть ровно тем контролем, который ввели взамен токенов. Разбор майской кампании констатирует: «каждая предыдущая волна начиналась с украденного доступа; эта — нет». Вместо кражи учётной записи использовалась ошибка в настройке рабочего процесса сборки и отравление её кэша.
Вывод неприятный, но важный: уничтожение долгоживущих токенов не убрало угрозу, а подняло её этажом выше — в системы сборки, которые теперь и держат доверие.
Июньская кампания дошла до предела этой логики: подменённые версии публиковались с действительными подтверждениями происхождения. Подпись была настоящей, потому что подписывал скомпрометированный конвейер.
Каждое событие ниже сверено с записями OSV.
И отрезвляющая деталь про 2025 год. Самая громкая атака сентября 2025-го, затронувшая пакеты с сотнями миллионов еженедельных скачиваний, прожила около двух часов и принесла нападавшим, по независимому подсчёту, около пяти центов в эфире плюс двадцать долларов в мемкоине. Разбор так и называется — «Ой, жертв нет».
Отдельно про исторические события, которые часто пересказывают неверно: left-pad (2016) — это отказ в доступности, а не атака, вредоносного кода там не было вовсе; а xz-utils (2024) к npm отношения не имеет — это библиотека сжатия в Linux.
За календарный 2025 год по npm:
| Источник | Вредоносных пакетов |
|---|---|
| ReversingLabs | 10 819 |
| Datadog | 13 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 не означает, что вредоносное на месте: при разборе шестидесяти из них картина такая:
| Состояние | Пакетов | Что это значит |
|---|---|---|
| Заглушка npm | 26 (43%) | содержимое заменено служебной пометкой |
| Снято с публикации | 24 (40%) | версий не осталось |
| Живой законный пакет | 10 (17%) | скомпрометированный проект вычистили и вернули |
Ни одного случая, когда вредоносное всё ещё можно установить, мы не нашли. Десять «живых» — это как раз пострадавшие области имён вроде @qlik и @antv, восстановленные после чистки.
Оговорка: разобрано шестьдесят из двухсот, и мы не сверяли историю версий, чтобы убедиться, что исчезли именно заражённые. Утверждение — «удаление выглядит доведённым до конца», а не «гарантированно завершено».
Смежная тема — глубина зависимостей — разобрана в отдельной статье.
Источники: открытый набор OSV/OpenSSF, реплика реестра npm, счётчик скачиваний, изменения npm 12.
Минимум. Snyk / Socket.dev / GitGuardian деплят behavioral analysis + zero-day detection.
package.json reviews в PR, npm install --ignore-scripts (block post-install hooks), allowlists в registry-proxy.
Для US federal contracts — yes (EO 14028). Для SaaS с enterprise — часто требуют. Best practice в 2026.
Бесплатный тариф — 10 мониторов, проверки каждые 5 мин, без карты. Платные тарифы — интервал от 1 минуты и проверки из нескольких регионов.