Anders als frühere npm-Vorfälle zielte die Kampagne nicht auf den Build-Prozess. Laut JFrog enthielten die Pakete weder Lifecycle-Hooks noch native Build-Skripte und waren nie dafür gedacht, in Projekte importiert zu werden. Während etwa der Wurm Shai-Hulud bei mehr als 500 Paketen Entwickler-Geheimnisse abgriff und sich mit gestohlenen Tokens weiterverbreitete und kurz davor ein Phishing-Angriff auf den Maintainer qix schädlichen Code in chalk, debug und 16 weitere Pakete einschleuste, wartete diese Kampagne schlicht auf einen geöffneten Browser-Tab.

Eine frühere Analyse von SafeDep hatte im Mai bereits 141 der Pakete erfasst und die Operation als Adware sowie Missbrauch des Registers beschrieben: Pop-under-Werbung, Monetarisierungsskripte Dritter und Google-Analytics-Tracking auf einem an Schüler gerichteten Scramjet-Proxy. JFrog ging weiter, entschlüsselte das Einstiegspaket der Anwendung – eine 5,4 MByte große einzeilige JavaScript-Datei, die in mehr als 20.600 Zeilen lesbaren Code zerfiel – und rekonstruierte mit archivierten Nutzdaten aus der Wayback Machine den Ablauf der Kampagne.

Unter der Adware lagen zwei Module, die beide vor dem Rendern der React-Oberfläche ausgeführt wurden. Das erste Modul, von JFrog G2 genannt, lud entfernte Skripte über das jsDelivr-CDN aus einem GitHub-Repository nach. Dabei verwies es nicht auf einen festgelegten Commit, sondern auf den veränderlichen main-Branch, verzichtete auf jede Integritätsprüfung und führte den zurückgelieferten Code mit den Rechten der Proxy-Seite aus. Das ermöglichte Zugriff auf Cookies, lokalen Speicher und Endpunkte derselben Herkunft. Eine „kein Referrer“-Richtlinie verbarg dabei die Herkunft der Anfrage.

Als JFrog die Infrastruktur untersuchte, lieferte das Repository bereits einen 404-Fehler. Eine archivierte Kopie vom 30. Mai zeigte jedoch, was zuvor ausgeliefert wurde: ein einfacher HTTP-Flood. Alle 500 Millisekunden erzeugte das Skript eine neue Zeichenkette mit einer Million Zeichen und schickte sie als POST-Anfrage ohne CORS an cdn.caan.edu, das JFrog als öffentliche Domain einer Pflegeschule in Matteson, Illinois identifiziert. Auf Antworten wartete der Code nicht, sodass sich Anfragen aufstauten. JFrog beziffert den Upload pro aktivem Besucher auf rund 2 MByte pro Sekunde; 1.000 geöffnete Proxy-Tabs würden damit etwa 2 GByte pro Sekunde gegen das Ziel senden.

Das zweite Modul, I2, war laut JFrog technisch gefährlicher. Es lud eine Textdatei namens websocket.txt, die eine Ziel-URL für WebSockets und eine Zahl von Verbindungen zwischen 1 und 1.024 vorgab, und öffnete diese Verbindungen versetzt. Die archivierte Konfiguration wies jedem Browser 30 Verbindungen zu einem Wisp-Endpunkt auf lunaron[.]top zu, einem aktiven Proxy, der selbst schädliche Werbung einschleuste. Anschließend sendete jeder Browser im Abstand von 100 Millisekunden gültige Wisp-CONNECT- und CLOSE-Frames an localhost:1 – nicht an den Rechner des Schülers, sondern an den entfernten Wisp-Server.

JFrog beschreibt das als Angriff auf die Steuerungsebene statt als reine Volumenattacke. Ein einzelner Browser mit 1.024 Sockets könne einen Wisp-Server dazu bringen, etwa 10.240 Verbindungen pro Sekunde anzulegen und wieder zu schließen und dabei mehr als 20.000 Log-Zeilen zu erzeugen. JFrog verweist darauf, dass Mercury Workshops wisp-server-node für jeden CONNECT-Frame eine neue Verbindung öffnet, ohne Loopback- oder private Adressen zu prüfen, und jeden Versuch protokolliert. Das erschöpfe Dateideskriptoren, flutet den Log-Speicher und bringe den Proxy zu Fall. wisp-server-node ist bereits abgekündigt; die Maintainer verweisen laut JFrog wegen genau solcher Sicherheits- und Stabilitätsprobleme auf andere Lösungen.

Die Infrastruktur war laut JFrog eng gebündelt und kaum auf Verschleierung ausgelegt. Die Builds führten zu einer GitHub-Organisation namens lucideproxy; die zugehörigen Konten wurden im Abstand von Sekunden registriert und waren mit einer Commit-E-Mail unter geeked[.]wtf sowie einem Discord-Handle verknüpft. 90 von 93 ermittelten Deployment-Hostnamen lösten zu einer einzigen IP-Adresse auf: 92.38.177[.]17 bei G-Core Labs. SafeDep und JFrog halten die Betreiber wegen der Paketnamen, eines in den Tarballs zurückgelassenen Auto-Publish-Skripts und eines von SafeDep entdeckten Kommentars „Danke WAVES + ChatGPT, ich liebe euch“ im Service Worker für jung. Ein Konto veröffentlichte 116 Pakete in weniger als 35 Minuten.

Laut JFrogs Commit-Historie begann das Projekt im März als reine Adware, erhielt in einem zweitägigen Schub Mitte Mai den Remote-Loader und den Wisp-Generator, führte den Flood gegen die Pflegeschule Ende des Monats aus und entfernte die schädlichen Module am 31. Mai wieder, als die Berichterstattung begann. Eine zweite Welle am 8. Juli unter einem neuen Konto erhöhte die Gesamtzahl auf 148 Pakete und lieferte eine bereinigte, nur noch werbefinanzierte Fassung aus. JFrog betont jedoch, dass die DDoS-Fähigkeit nicht verschwunden, sondern nur deaktiviert sei: Der Loader zeigt weiterhin auf einen veränderlichen Branch, ein einziger Commit reiche zur erneuten Aktivierung, ohne dass ein Paket-Update nötig wäre.

Viele Pakete wurden inzwischen aus npm entfernt und durch den Platzhalter 0.0.1-security ersetzt. Eine Stichprobe von The Hacker News am 14. Juli 2026 ergab, dass die meisten verschwunden waren, charlie-kirk jedoch weiterhin die beiden von JFrog als schädlich markierten Versionen 2.0.0 und 3.0.1 auslieferte. JFrog rät Netzwerkadministratoren in Schulen und Unternehmen, die Kampagnendomains auf DNS-Ebene zu blockieren, zunächst vor allem woofbeginner[.]com und c.vipersfutbol[.]com. Wer eine der Proxy-Seiten geladen habe, solle Browser-Cache und lokalen Speicher leeren und verbliebene Service Worker der Nachhilfe- oder Proxy-Domains entfernen. Teams, deren Build-Umgebungen die genannten Pakete abgerufen haben, sollten sie aus Manifesten und Lockfiles entfernen und sauber neu bauen. JFrogs Bericht enthält die vollständige Liste aller 148 Pakete, Domains, IP-Adressen und Hashes.