148 Malicious npm Packages ('Lucide Proxy') Disguise as School Wi-Fi Bypass / Tutoring Proxies to Hijack Browsers into a DDoS Botnet

148 Malicious npm Packages ('Lucide Proxy') Disguise as (TL-2026-1296), also tracked as Lucide Proxy campaign, is a high-severity supply-chain compromise, first published 2026-07-14. It is attributed to GitHub org lucideproxy with low confidence, affects npm, Inc. (npm public registry) 148 malicious npm packages published, maps to 23 MITRE ATT&CK techniques (T1027, T1027.010, T1036), and is covered by 9 detection rules and 31 indicators of compromise.

Key facts for TL-2026-1296

Threat ID
TL-2026-1296
Also known as
Lucide Proxy campaign, Riverbend Tutoring, Northstar Tutoring
Severity
HIGH
Status
ACTIVE
Category
SUPPLY_CHAIN
First published
2026-07-14
Last reviewed
2026-07-14
Attribution
GitHub org lucideproxy
Attribution confidence
LOW
Motivation
FINANCIAL
Target sectors
education
Target regions
North America
Detection rules
9
Indicators of compromise
31

Malware and tooling in 148 Malicious npm Packages ('Lucide Proxy') Disguise as

Malware and tooling: Scramjet

SafeDep and JFrog identified 148 npm packages, published by accounts terminal3airport (May) and a second unnamed account (July 8), branded 'Lucide Proxy' behind fake 'Riverbend Tutoring' and 'Northstar Tutoring' landing pages, that abuse a Scramjet-based service-worker web proxy to serve popunder ads/tracking and, in a mid-May build, add a mutable GitHub/jsDelivr remote script loader and a Wisp-protocol WebSocket flood generator that turned visitor browsers into a distributed DDoS botnet (up to ~2GB/s HTTP flood against cdn.caan.edu from 1,000 concurrent tabs, plus WebSocket socket-exhaustion floods against lunaron[.]top).

How 148 Malicious npm Packages ('Lucide Proxy') Disguise as works

Beginning in March 2026 as a plain adware campaign, an npm account (terminal3airport, registered under a disposable Gmail address) published a browser-based web-proxy tool branded 'Lucide Proxy' disguised behind two fake tutoring-service landing pages, 'Northstar Tutoring' and 'Riverbend Tutoring,' both claiming to operate out of Portland, Oregon. The tool was designed to let students on school or workplace networks bypass content-filtering Wi-Fi restrictions to reach games and blocked sites. Each npm package's `package.json` sets `main: sw.js` with no npm install hooks, meaning the packages function purely as static web-asset bundles hosted for free on the npm registry/jsDelivr CDN rather than as consumable Node.js modules — an abuse of the public registry as disposable, unauthenticated CDN infrastructure.

The `sw.js` service worker registers capture-phase fetch-event listeners and routes all same-origin traffic through the open-source Scramjet web-proxy engine, injecting a script into every proxied HTML response. That injected script hooks `window.open`, anchor clicks, and form submissions to intercept new-tab navigation and relay it back to the parent frame via `postMessage`, and on first user interaction (click, keypress, or touch) triggers a popunder ad to `abdct[.]com` gated by a 15-minute localStorage cooldown. All 141 originally-cataloged packages phone home to a single Google Analytics property (G-0VL3ZSBXDH) and load monetization/ad scripts from `cdn.21baseballacademy.com` and `woofbeginner.com`.

Publication occurred in three waves under the terminal3airport account: May 7 (2 packages, v1.1.3, unobfuscated readable source, 'Northstar Tutoring' branding), May 26 (23 packages, v1.1.2, hex-obfuscated JavaScript with randomized filenames, 'Riverbend Tutoring' branding), and May 27 (116 packages, v1.1.7, mass-published in under 35 minutes via a bundled `auto-publish.sh` shell script that rewrote `package.json` name fields and republished in batches of 3). JFrog's deobfuscation of the 5.4 MB single-line minified entry bundle unpacked into over 20,600 lines of readable code and, cross-referenced with archived payloads pulled from the Wayback Machine, revealed that within 48 hours in mid-May the operators quietly added two additional hidden modules absent from SafeDep's initial adware-only classification:

**Module G2 (remote script loader):** fetches and executes arbitrary JavaScript from the mutable `main` branch of a GitHub repository via the `cdn.jsdelivr.net/gh/...` CDN path, with no Subresource Integrity (SRI) hash pinning. Because jsDelivr's `gh` endpoint mirrors whatever is currently on the branch, this let the operators re-arm or change the payload running in every visitor's browser at will, without any npm package update — the fetched code executes with the proxy site's own origin privileges, i.e. full access to cookies, localStorage, and same-origin endpoints.

**Module I2 (WebSocket flood generator / DDoS engine):** opens 1–30 (up to the browser's 1,024-socket ceiling) WebSocket connections that speak the Wisp proxy protocol, sending valid Wisp CONNECT and CLOSE frames every 100ms directed at `localhost:1` against a targeted `wisp-server-node` endpoint. Because `wisp-server-node` allocates a fresh socket per CONNECT frame without validating whether the destination is a loopback/private address, and logs every attempt, a single fully-loaded browser tab can drive a target Wisp server to allocate and tear down roughly 10,240 connections/second while writing 20,000+ log lines/second — exhausting file descriptors and log storage and crashing the proxy. Separately, an HTTP-flood mode issued randomized-query-parameter, no-cors GET requests (defeating browser/CDN caching) against `cdn.caan.edu`, a nursing-school CDN in Matteson, Illinois; JFrog measured roughly 2MB/s of upload traffic per participating browser, i.e. ~2GB/s aggregate from 1,000 concurrent open proxy tabs. WebSocket-flood traffic separately targeted the `lunaron[.]top` Wisp endpoint, which also injected malvertising into flood participants.

The malicious G2/I2 modules were quietly removed around May 31, coinciding with the start of public reporting. A second wave launched July 8 under a new, as-yet-unnamed npm account brought the total package count to 148 and shipped a 'cleaned up,' adware-only build without the DDoS modules re-included — however, as of July 14, 2026 (report date), specific packages under the 'charlie-kirk' name (versions 2.0.0 and 3.0.1) were still observed serving malicious code, indicating the campaign remains active and evolving rather than fully retired.

Attribution indicators point to a young, likely non-professional operator rather than an organized APT: package names include juvenile/meme strings such as `charlie-kirk`, `ilovefemboys`, `miguelphonk`, `ratelimitsucks`, `ishowfeet1`-`ishowfeet20`, and `abuden1`-`abuden230`; the bundled `auto-publish.sh` automation script was left inside published tarballs; and SafeDep discovered a literal 'TY WAVES + CHATGPT ILY' comment inside the service-worker source, implying AI-assisted (ChatGPT) development. JFrog traced the GitHub organization hosting the malicious modules to `github.com/lucideproxy` (repo `lucideproxy/svg`), whose member accounts were registered mere seconds apart, tied to a commit email at the `geeked.wtf` domain and an associated Discord handle authenticated via a Discord OAuth flow (verification hash `bb7ce9f4c508bc87f13889c18031ca42ad8c1bd5`). Of 93 distinct deployment hostnames identified, 90 resolved to a single IP address, 92.38.177.17, hosted by G-Core Labs — a hosting pattern consistent with a single small-scale operator rather than distributed infrastructure. SVG assets bundled in the packages reference AI platforms (Anthropic, OpenAI, DeepSeek) and Roblox, consistent with the tool's intended student audience seeking to bypass school content filters to reach AI chatbots, games, and Roblox.

This campaign is notable less for technical sophistication and more for its abuse model: it demonstrates that public package registries doubling as free, unauthenticated CDN hosting for client-side web assets (rather than as a source of installed dependencies) sidesteps most existing npm supply-chain defenses, which focus on install-time (`postinstall`) hooks and packages that are actually pulled into build pipelines. Because these packages set no install hooks and are never `npm install`ed by a build system — they are fetched directly as static assets by browsers visiting the tutoring-proxy landing pages — conventional dependency-scanning and SCA tooling that gates on install-time behavior would not have flagged them.

MITRE ATT&CK techniques used in TL-2026-1296

Defense Evasion

T1027 Obfuscated Files or Information; T1027.010 Command Obfuscation; T1036 Masquerading

Execution

T1059.007 JavaScript; T1204.001 Malicious Link

Command and Control

T1071.001 Web Protocols; T1102 Web Service; T1104 Multi-Stage Channels; T1105 Ingress Tool Transfer; T1571 Non-Standard Port

Persistence

T1176 Software Extensions; T1546 Event Triggered Execution

Collection

T1185 Browser Session Hijacking; T1560 Archive Collected Data

Initial Access

T1189 Drive-by Compromise; T1195.002 Compromise Software Supply Chain

initial-access

T1199 Trusted Relationship

Impact

T1496 Resource Hijacking; T1498.001 Direct Network Flood; T1499.003 Application Exhaustion Flood

Resource Development

T1583.006 Web Services; T1584 Compromise Infrastructure; T1587.001 Malware

Affected products and versions in 148 Malicious npm Packages ('Lucide Proxy') Disguise as

  • npm, Inc. (npm public registry) — 148 malicious npm packages published under accounts terminal3airport and a second July 2026 account
    Vulnerable versions: v1.1.3 (May 7 wave, 2 packages); v1.1.2 (May 26 wave, 23 packages); v1.1.7 (May 27 wave, 116 packages); second wave packages published July 8, 2026 (27 additional packages, total 148); charlie-kirk v2.0.0; charlie-kirk v3.0.1
    Fixed in: All identified packages should be removed/unpublished; no legitimate fixed version exists

Remediation for 148 Malicious npm Packages ('Lucide Proxy') Disguise as

Immediate actions

  • Block all listed campaign domains and IPs at DNS/perimeter firewall, prioritizing woofbeginner.com, 21baseballacademy.com, abdct.com, lunaron.top, and 92.38.177.17
  • Search web-filtering/proxy logs for access to Riverbend Tutoring / Northstar Tutoring / Lucide Proxy branded pages and any of the 148 known npm package names
  • On affected endpoints, unregister service workers and clear browser cache, cookies, and localStorage for any domain that served the proxy
  • Investigate anomalous outbound browser upload volume or sustained WebSocket connections to non-standard ports as indicators of active participation in the flood

Workarounds

  • Where full blocking is not feasible, rate-limit or block WebSocket connections to non-standard high ports and Wisp-protocol traffic at the network egress

Longer-term hardening

  • Deploy DNS-layer content filtering that blocks known web-proxy/unblocker services rather than relying solely on category filtering
  • Adopt dependency and asset scanners capable of flagging npm packages used purely as static web-asset CDN hosting (no install hooks, main pointing to non-Node.js browser scripts) rather than scanning only install-time behavior
  • Educate student/end-user populations on the risk of third-party 'Wi-Fi bypass' and unofficial proxy tools distributed via unofficial channels
  • Monitor Wisp-protocol proxy server deployments (wisp-server-node) for unauthenticated/unvalidated CONNECT frame targets and rate-limit socket allocation per client

Weaknesses (CWE) in 148 Malicious npm Packages ('Lucide Proxy') Disguise as

CWE-494, CWE-829, CWE-400, CWE-1021

Timeline of 148 Malicious npm Packages ('Lucide Proxy') Disguise as

  • Lucide Proxy project begins as a plain adware/monetized web-proxy tool, per JFrog's Wayback Machine reconstruction.
  • npm account terminal3airport publishes first 2 packages (v1.1.3) with readable, unobfuscated source and 'Northstar Tutoring' branding.
  • Within a 48-hour window in mid-May, hidden modules G2 (mutable GitHub/jsDelivr remote script loader) and I2 (Wisp-protocol WebSocket flood generator) are quietly added to the codebase.
  • 23 additional packages published (v1.1.2, 'Riverbend Tutoring' branding) with hex-obfuscated JavaScript and randomized filenames.
  • 116 packages mass-published in under 35 minutes (v1.1.7) via bundled auto-publish.sh automation script, bringing the account total to 141 packages; SafeDep publishes initial adware-classification research.
  • G2 and I2 modules are quietly removed from the codebase, coinciding with the start of public security reporting.
  • A second, unnamed npm account publishes an additional ~27 packages with a cleaned-up, adware-only build (no DDoS modules), bringing the total package count to 148.
  • JFrog publishes deobfuscated technical analysis covering the full campaign, DDoS mechanics, and attribution; The Hacker News and Cyber Security News publish coverage.
  • Specific 'charlie-kirk' package versions (2.0.0 and 3.0.1) are still observed serving malicious code, indicating the campaign remains active despite the July 8 'cleanup' wave.

Sources cited for 148 Malicious npm Packages ('Lucide Proxy') Disguise as

Threats related to 148 Malicious npm Packages ('Lucide Proxy') Disguise as

Detection coverage for TL-2026-1296

As of 2026-07-14, Threadlinqs Intelligence publishes 9 detection rule(s) for TL-2026-1296 across Splunk SPL, Microsoft KQL and Sigma, covering 31 indicator(s) of compromise. The whole corpus is readable without an account; a free account unlocks full detection query text in Splunk SPL, Microsoft KQL and Sigma; paid tiers add raw indicator values, correlation and the MCP server. Threadlinqs MCP server · View plans.

Further reading

Threadlinqs Intelligence — Real-Time Threat Detection Platform

[ 0 threats ] [ 0 det ] [ CRIT: 0 ] [ HIGH: 0 ]
// threat_feed
$ sort --newest
Showing all threats

Latest Threats