Крупный инцидент в экосистеме Node.js продемонстрировал новый способ злоупотребления инфраструктурой реестра пакетов. Один злоумышленник под псевдонимом terminal3airport менее чем за три недели опубликовал 141 пакет, предназначенный не для кражи данных или компрометации сборок, а для показа навязчивой рекламы и обхода корпоративных и школьных сетевых фильтров. Речь идёт о массовом злоупотреблении реестром npm как дешёвой и фактически бесплатной сетью доставки контента (CDN) для распространения рекламного прокси.
Описание
Инцидент затронул период с 7 по 27 мая 2026 года. Все пакеты были опубликованы с единственной учётной записи, привязанной к адресу электронной почты adofhiter23@gmail.com. Исследователи обнаружили эту активность в ходе планового мониторинга реестра. Каждый пакет содержал одинаковую полезную нагрузку: веб-прокси на основе фреймворка Scramjet, замаскированный под сайт репетиторских услуг. Внешне страницы выглядели как порталы для подготовки к экзаменам в Портленде, штат Орегон. Однако реальная функция этих страниц заключалась в монетизации через всплывающую под основным окном рекламу (popunder) и внешние скрипты отслеживания.
Характерно, что пакеты не содержали никаких хуков установки (install hooks) и не выполняли вредоносного кода на стороне сервера или в процессе развёртывания. Они представляли собой статические веб-активы, предназначенные для хостинга. Злоумышленник использовал реестр npm как хранилище: после публикации пакетов их содержимое становилось доступным через зеркала реестра и внутрисетевые прокси-серверы, что позволяло загружать страницы напрямую из инфраструктуры npm.
Полезная нагрузка включала несколько слоёв монетизации. Первый слой - это встроенный в HTML-страницу скрипт, который при первом взаимодействии пользователя (клик, нажатие клавиши или касание на мобильных устройствах) открывал новую вкладку с сайтом abdct.com. Скрипт перехватывал события ещё до того, как другие обработчики могли их заблокировать, и возвращал фокус на исходное окно - классическая техника popunder-рекламы. Для ограничения частоты показов использовалось локальное хранилище браузера (localStorage): повторный показ блокировался на 15 минут. Второй слой представлял собой внешние скрипты, загружаемые с доменов cdn.21baseballacademy.com и woofbeginner.com. На момент анализа эти ресурсы возвращали пустые ответы или ошибки, но потенциально могли загружать дополнительный рекламный код или перенаправлять трафик. Третий слой - интеграция с системой аналитики Google Analytics под идентификатором G-0VL3ZSBXDH, которая собирала данные о всех посетителях прокси-страниц.
Ключевым элементом полезной нагрузки стал сервис-воркер (service worker) - скрипт, работающий в фоновом режиме в браузере пользователя. Этот скрипт перехватывал все запросы, исходящие от страницы, и перенаправлял их через прокси-движок Scramjet. Подобная архитектура позволяла обходить школьные и корпоративные сетевые фильтры: пользователь подключался к видимой странице на домене реестра npm, а сервис-воркер направлял весь реальный трафик через внешние серверы. В проектных файлах присутствовали векторные логотипы известных сервисов искусственного интеллекта - Anthropic, OpenAI, DeepSeek, xAI и других, а также значок Roblox. Это указывает на то, что целевой аудиторией были студенты, пытающиеся получить доступ к чат-ботам и игровым сайтам из учебных сетей.
Важно отметить, что при первом взгляде на код страниц создавалось впечатление легитимного образовательного ресурса. Разработчик встроил в HTML скрытый блок с более чем 800 словами поискового ключевого текста (SEO), посвящённого академическому коучингу и подготовке к экзаменам. Мета-теги содержали ключевые слова, релевантные для репетиторства. Поисковые системы могли индексировать эти страницы, после чего пользователи переходили по ссылкам из результатов поиска и попадали на рекламный прокси.
Волны публикации были разделены на три этапа. Первая волна 7 мая содержала всего два пакета с читаемым, необфусцированным кодом. Вторая волна 26 мая включала 23 пакета с обфусцированным JavaScript, где имена переменных были заменены на шестнадцатеричные последовательности, а имена файлов стали случайными наборами символов. Третья волна 27 мая оказалась самой масштабной: 116 пакетов были опубликованы автоматически с помощью скрипта auto-publish.sh, который исследователи нашли внутри одного из пакетов. Скрипт перезаписывал имя пакета в файле package.json, публиковал его в реестр и переходил к следующему имени, используя параллельную обработку трёх пакетов одновременно. Таким образом, за 35 минут было опубликовано 116 пакетов.
Имена пакетов - ilovefemboys, ishowfeet, bomboclatwallahi, imillegal и другие - а также комментарий "TY WAVES + CHATGPT ILY" в коде сервис-воркера указывают на то, что оператор, вероятно, является подростком. В пакетах также присутствовала интеграция с Discord OAuth для аутентификации пользователей, включая хеш проверки для домена Discord.
Данный инцидент не представляет угрозы для цепочек поставок программного обеспечения в традиционном смысле - пакеты не крадут учётные данные и не внедряют бэкдоры. Однако он демонстрирует серьёзную проблему модерации в реестре npm. Отсутствие эффективных ограничений на массовую публикацию позволяет использовать реестр как дешёвый хостинг для распространения рекламного и мошеннического контента. Для конечных пользователей риск заключается в показе навязчивой рекламы, сборе данных об активности через Google Analytics и возможном перенаправлении на другие сайты, если сторонние скрипты в будущем начнут загружать вредоносный код.
С точки зрения защиты, специалистам по информационной безопасности образовательных учреждений и компаний следует обратить внимание на возможность доступа к страницам, размещённым в инфраструктуре npm. Блокировка доменов abdct.com, 21baseballacademy.com и woofbeginner.com в системах фильтрации контента поможет снизить риски, однако основной вектор распространения - через сам реестр - остаётся открытым, пока администраторы npm не введут более строгие процедуры проверки публикуемых пакетов.
Индикаторы компрометации
Domains
- 21baseballacademy.com
- abdct.com
- cdn.21baseballacademy.com
- woofbeginner.com
URLs
- https://abdct.com/
Emails
- adofhiter23@gmail.com