Обнаружена крупная кампания вредоносных npm-пакетов, превращающих браузеры в ботнет для DDoS-атак

Атака на цепочку поставок NPM

В мае и июле 2026 года в реестре npm была выявлена масштабная кампания, состоящая из 148 вредоносных пакетов, которые маскировались под студенческие веб-прокси. Пакеты с названиями вроде ilovefemboys, miguelphonk, charlie-kirk и другими провокационными именами распространялись через аккаунты terminal3airport и eerikakirk. Внешне они представляли собой полноценные прокси-приложения для обхода блокировок, такие как Riverbend Tutoring или Lucide Proxy, однако в их коде были скрыты модули для превращения браузеров посетителей в узлы распределённой сети атак типа "отказ в обслуживании" (DDoS).

Описание

Особенность этой кампании в том, что атака не требует установки вредоносного ПО на компьютер пользователя. Пакеты не содержат хуков жизненного цикла установки или native-сценариев сборки. Вместо этого авторы используют реестр npm как бесплатную высокоскоростную сеть доставки контента (CDN) для статических файлов браузерного приложения. Жертва становится активным участником ботнета просто при посещении одного из таких прокси-сайтов. В ходе аудита реестра npm специалисты по безопасности обнаружили, что первая волна публикаций началась 27 мая 2026 года, а вторая - 8 июля 2026 года. Несмотря на удаление многих пакетов, часть из них, включая charlie-kirk версий 2.0.0 и 3.0.1, оставалась доступной.

Кампания выстроена вокруг публичного веб-прокси под брендом Lucide, который выглядит как обычная страница для репетиторства. Когда пользователь заходит на такой сайт, приложение работает как обычный прокси-сервер, позволяя просматривать заблокированные ресурсы или играть в игры. Однако под этим функциональным фасадом незаметно запускаются два вредоносных модуля. Первый модуль (G2) загружает и выполняет удалённый JavaScript-файл с изменяемым содержимым. Второй модуль (I2) генерирует поток WebSocket-соединений для атаки на протокол Wisp.

Анализ показал, что удалённый загрузчик использует нефиксированную ссылку на основную ветку GitHub-репозитория, что позволяет владельцу менять код в любой момент. При этом отсутствует проверка целостности через SRI-хэш, а загружаемый скрипт получает полные привилегии источника - доступ к кукам, локальному хранилищу и API. В архивах Wayback Machine была найдена историческая версия этого скрипта, которая содержала простой, но разрушительный HTTP-флуд. Каждые полсекунды браузер посетителя отправлял POST-запрос размером в один мегабайт на сайт CAAN Academy of Nursing в Иллинойсе. При тысяче активных посетителей такая атака генерирует поток в два гигабайта в секунду, что способно вывести из строя любой школьный сайт.

Помимо HTTP-флуда, кампания использует генератор WebSocket-соединений, совместимых с протоколом Wisp v2. Браузер посетителя открывает до 1024 параллельных WebSocket-соединений к удалённому Wisp-серверу, указанному в конфигурационном файле websocket.txt. Каждые 100 миллисекунд каждое соединение отправляет пару пакетов: команду CONNECT на localhost:1 и сразу CLOSE. Такая комбинация заставляет целевой Wisp-сервер создавать и уничтожать до 10 240 сокетов в секунду, что быстро исчерпывает лимиты открытых файлов и приводит к отказу в обслуживании. Атака направлена не на компьютер посетителя, а на сам Wisp-прокси, превращая браузеры в инструмент атаки на плоскость управления сервера.

Важно отметить, что кампания прошла несколько стадий эволюции. Изначально, в марте 2026 года, Lucide Proxy содержал только рекламные модули и собирал аналитику через Google Analytics. 16 марта началась монетизация через скрипты woofbeginner.com. Переломный момент наступил 16 мая, когда всего через 33 минуты после создания учётной записи canyoupleasesaysomething в Lucide был добавлен удалённый загрузчик. На следующий день появился генератор Wisp-трафика с ограничением в 64 сокета, а затем - снятие ограничения до 1024 сокетов и полное обфусцирование кода. 30 мая Wayback Machine зафиксировала активную HTTP-атаку на сайт колледжа. Однако уже 31 мая, после появления первых публичных сообщений, авторы кампании удалили вредоносные модули из репозитория, вернув сборку к обычному рекламному содержимому. Вторая волна пакетов в июле содержала только рекламную нагрузку, но сохранила обфусцированную структуру, позволяющую в любой момент вернуть опасные функции.

Для защиты от этой угрозы администраторам сетей, особенно в образовательных учреждениях, рекомендуется немедленно заблокировать на уровне DNS домены, связанные с кампанией: woofbeginner[.]com, c.vipersfutbol[.]comb и т.д. Пользователям, посещавшим такие прокси-сайты, следует очистить кэш браузера и удалить файлы cookie и данные сайтов за всё время. В корпоративных средах необходимо проверить зависимости проектов на наличие перечисленных вредоносных пакетов и удалить их из манифестов и лок-файлов.

Эта кампания демонстрирует новые риски, связанные с использованием неофициальных прокси-сервисов, которые воспринимаются как безобидные утилиты для обхода блокировок. За кажущейся полезностью могут скрываться механизмы, позволяющие дистанционно мобилизовать браузеры тысяч пользователей для проведения массированных атак на отказ в обслуживании без какого-либо заражения устройств. Меняющаяся природа угрозы - от рекламного ПО до полноценного DDoS-ботнета и обратно - подчёркивает необходимость постоянного мониторинга сетевого трафика и своевременной блокировки подозрительных доменов, даже если кажется, что инцидент уже исчерпан.

Индикаторы компрометации

IPv4

  • 153.75.225.178
  • 5.188.124.67
  • 92.38.177.10
  • 92.38.177.16
  • 92.38.177.17
  • 92.38.177.37

Domain

  • 21baseballacademy.com
  • c.vipersfutbol.com
  • cdn.conditionfuneral.com
  • lucideon.top
  • preferencenail.com
  • protrafficinspector.com
  • realizationnewestfangs.com
  • skinnycrawlinglax.com
  • wisp.breadarchive.dpdns.org
  • woofbeginner.com

URL

  • https://21baseballacademy.com
  • https://c.vipersfutbol.com/script.js
  • https://cdn.caan.edu/-/?v=
  • https://cdn.conditionfuneral.com
  • https://cdn.jsdelivr.net/gh/canyoupleasesaysomething/cdn@main/cdn.js
  • https://cdn.jsdelivr.net/gh/canyoupleasesaysomething/cdn@main/websocket.txt
  • https://lucideon.top
  • https://preferencenail.com/sfp.js
  • https://protrafficinspector.com/stats
  • https://realizationnewestfangs.com
  • https://skinnycrawlinglax.com/dnn2hkn8
  • https://wisp.breadarchive.dpdns.org
  • https://woofbeginner.com/0a/91/35/0a913561831bdf2c26dcf18b852b5cc1.js
  • https://woofbeginner.com/jivd2xu8

SHA256

  • 10ddbbae0070267b8d15888b09a3cdb19fa74d861315b71f21c9ace8b9f85c75
  • 4b188d179e50e8208a6efec85e273e88d8fc390c836f299ba12915e0840408fd
  • eb4e1394d537d8eba509dd5c57e7aaf4c1df57715c7161330012a11f6202af84

Package

  • abuden1 1.1.7, 1.7.7, 2.0.0
  • abuden2 1.1.7, 1.7.7, 2.0.0
  • abuden21 1.1.7, 1.7.7, 2.0.0
  • abuden210 1.1.7, 1.7.7, 2.0.0
  • abuden211 1.1.7, 1.7.7, 2.0.0
  • abuden212 1.1.7, 1.7.7, 2.0.0
  • abuden213 1.1.7, 1.7.7, 2.0.0
  • abuden214 1.1.7, 1.7.7, 2.0.0
  • abuden215 1.1.7, 1.7.7, 2.0.0
  • abuden216 1.1.7, 1.7.7, 2.0.0
  • abuden217 1.1.7, 1.7.7, 2.0.0
  • abuden218 1.1.7, 1.7.7, 2.0.0
  • abuden219 1.1.7, 1.7.7, 2.0.0
  • abuden22 1.1.7, 1.7.7, 2.0.0
  • abuden220 1.1.7, 1.7.7, 2.0.0
  • abuden221 1.1.7, 1.7.7, 2.0.0
  • abuden222 1.1.7, 1.7.7, 2.0.0
  • abuden223 1.1.7, 1.7.7, 2.0.0
  • abuden224 1.1.7, 1.7.7, 2.0.0
  • abuden225 1.1.7, 1.7.7, 2.0.0
  • abuden226 1.1.7, 1.7.7, 2.0.0
  • abuden227 1.1.7, 1.7.7, 2.0.0
  • abuden228 1.1.7, 1.7.7, 2.0.0
  • abuden229 1.1.7, 1.7.7, 2.0.0
  • abuden23 1.1.7, 1.7.7, 2.0.0
  • abuden230 1.1.7, 1.7.7, 2.0.0
  • abuden24 1.1.7, 1.7.7, 2.0.0
  • abuden25 1.1.7, 1.7.7, 2.0.0
  • abuden26 1.1.7, 1.7.7, 2.0.0
  • abuden27 1.1.7, 1.7.7, 2.0.0
  • abuden28 1.1.7, 1.7.7, 2.0.0
  • abuden29 1.1.7, 1.7.7, 2.0.0
  • abuden3 1.1.7, 1.7.7, 2.0.0
  • abuden4 1.1.7, 1.7.7, 2.0.0
  • abuden5 1.1.7, 1.7.7, 2.0.0
  • acidic 2.0.0
  • backup1-gg 1.1.2, 2.0.0
  • backup2-asd 1.1.2, 2.0.0
  • backup3-ff 1.1.2, 2.0.0
  • backup4-gasp 1.1.2, 2.0.0
  • backup5-updated 1.1.2, 2.0.0
  • backupgenuine-updated 1.1.2, 2.0.0
  • backupsitetuff10 1.1.7, 2.0.0
  • backupsitetuff3 1.1.7, 2.0.0
  • backupsitetuff6 1.1.7, 2.0.0
  • backupsitetuff9 1.1.7, 2.0.0
  • bismillahitidakimas 1.1.2, 2.0.0
  • bomboclatwallahi 1.1.2, 2.0.0
  • captainindia 1.1.2, 2.0.0
  • changiairportpromax 1.1.3, 2.0.0
  • charlie-kirk 2.0.0, 3.0.1
  • crazynut 1.1.2, 2.0.0
  • fflc-updated 1.1.2, 2.0.0
  • howmanygreatbritain 1.1.2, 2.0.0
  • ilovefemboys 1.1.3, 2.0.0
  • imillegal1 1.1.7, 1.7.7, 2.0.0
  • imillegal2 1.1.7, 1.7.7, 2.0.0
  • imillegal3 1.1.7, 1.7.7, 2.0.0
  • imillegal4 1.1.7, 1.7.7, 2.0.0
  • imillegal5 1.1.7, 1.7.7, 2.0.0
  • ishowfeet1 1.1.7, 1.7.7, 2.0.0
  • ishowfeet10 1.1.7, 1.7.7, 2.0.0
  • ishowfeet11 1.1.7, 1.7.7, 2.0.0
  • ishowfeet12 1.1.7, 1.7.7, 2.0.0
  • ishowfeet13 1.1.7, 1.7.7, 2.0.0
  • ishowfeet14 1.1.7, 1.7.7, 2.0.0
  • ishowfeet15 1.1.7, 1.7.7, 2.0.0
  • ishowfeet16 1.1.7, 1.7.7, 2.0.0
  • ishowfeet17 1.1.7, 1.7.7, 2.0.0
  • ishowfeet18 1.1.7, 1.7.7, 2.0.0
  • ishowfeet19 1.1.7, 1.7.7, 2.0.0
  • ishowfeet2 1.1.7, 1.7.7, 2.0.0
  • ishowfeet20 1.1.7, 1.7.7, 2.0.0
  • ishowfeet3 1.1.7, 1.7.7, 2.0.0
  • ishowfeet4 1.1.7, 1.7.7, 2.0.0
  • ishowfeet5 1.1.7, 1.7.7, 2.0.0
  • ishowfeet6 1.1.7, 1.7.7, 2.0.0
  • ishowfeet7 1.1.7, 1.7.7, 2.0.0
  • ishowfeet8 1.1.7, 1.7.7, 2.0.0
  • ishowfeet9 1.1.7, 1.7.7, 2.0.0
  • kirkland 1.1.2, 2.0.0
  • lowkeybored 1.1.2, 2.0.0
  • lowkirkuenly 1.1.2, 2.0.0
  • midnightrush 1.1.2, 2.0.0
  • miguelphonk 1.1.2, 2.0.0
  • nottuff1 1.1.7, 1.7.7, 2.0.0
  • nottuff10 1.1.7, 1.7.7, 2.0.0
  • nottuff11 1.1.7, 1.7.7, 2.0.0
  • nottuff12 1.1.7, 1.7.7, 2.0.0
  • nottuff13 1.1.7, 1.7.7, 2.0.0
  • nottuff14 1.1.7, 1.7.7, 2.0.0
  • nottuff15 1.1.7, 1.7.7, 2.0.0
  • nottuff16 1.1.7, 1.7.7, 2.0.0
  • nottuff17 1.1.7, 1.7.7, 2.0.0
  • nottuff18 1.1.7, 1.7.7, 2.0.0
  • nottuff19 1.1.7, 1.7.7, 2.0.0
  • nottuff2 1.1.7, 1.7.7, 2.0.0
  • nottuff20 1.1.7, 1.7.7, 2.0.0
  • nottuff21 1.1.7, 1.7.7, 2.0.0
  • nottuff22 1.1.7, 1.7.7, 2.0.0
  • nottuff23 1.1.7, 1.7.7, 2.0.0
  • nottuff24 1.1.7, 1.7.7, 2.0.0
  • nottuff25 1.1.7, 1.7.7, 2.0.0
  • nottuff26 1.1.7, 1.7.7, 2.0.0
  • nottuff27 1.1.7, 1.7.7, 2.0.0
  • nottuff28 1.1.7, 1.7.7, 2.0.0
  • nottuff29 1.1.7, 1.7.7, 2.0.0
  • nottuff3 1.1.7, 1.7.7, 2.0.0
  • nottuff30 1.1.7, 1.7.7, 2.0.0
  • nottuff4 1.1.7, 1.7.7, 2.0.0
  • nottuff5 1.1.7, 1.7.7, 2.0.0
  • nottuff6 1.1.7, 1.7.7, 2.0.0
  • nottuff7 1.1.7, 1.7.7, 2.0.0
  • nottuff8 1.1.7, 1.7.7, 2.0.0
  • nottuff9 1.1.7, 1.7.7, 2.0.0
  • omglucidesotuff 1.1.2, 2.0.0
  • omgyesyesyes 1.1.2, 2.0.0
  • pasirianspirit 1.1.2, 2.0.0
  • ratelimitsucks 1.1.2, 1.1.7, 1.7.7, 2.0.0
  • ratelimitsucks1 1.1.3, 1.1.7, 2.0.0
  • ratelimitsucks10 1.1.7, 1.7.7, 2.0.0
  • ratelimitsucks2 1.1.4, 1.1.7, 1.7.7, 2.0.0
  • ratelimitsucks3 1.1.5, 1.1.7, 2.0.0
  • ratelimitsucks4 1.1.6, 1.1.7, 2.0.0
  • ratelimitsucks5 1.1.7, 1.7.7, 2.0.0
  • ratelimitsucks6 1.1.7, 1.7.7, 2.0.0
  • ratelimitsucks9 1.1.7, 2.0.0
  • sixseven1 1.1.7, 1.7.7, 2.0.0
  • sixseven10 1.7.7
  • sixseven2 1.1.7, 1.7.7, 2.0.0
  • sixseven3 1.1.7, 1.7.7, 2.0.0
  • sixseven4 1.1.7, 1.7.7, 2.0.0
  • sixseven5 1.1.7, 1.7.7, 2.0.0
  • sixseven6 1.1.7, 1.7.7, 2.0.0
  • sixseven7 1.7.7
  • sixseven8 1.7.7
  • sixseven9 1.7.7
  • speed1 1.1.7, 2.0.0
  • speed2 1.1.7, 2.0.0
  • speed3 1.1.7, 2.0.0
  • speed4 1.1.7, 2.0.0
  • speed5 1.1.7, 2.0.0
  • testdonotredeemit 1.0.0, 2.0.0, 2.1.1
  • thebigyahu 1.1.2, 2.0.0
  • timmytuffknuckles3 1.1.7, 2.0.0
  • timmytuffknuckles6 1.1.7, 2.0.0
  • timmytuffknuckles9 1.1.7, 2.0.0
  • whatsadmaidk 1.1.2, 2.0.0

Комментарии: 0