VDB

GCVE-110-OSM-2026-12412

GCVE-110-OSM-2026-12412
Advisory PublishedCVSS 9.6/10
Vulnetix · Advisory published September 21, 2026
catwrestlingbird@1.0.0 declares a `postinstall` script (`node install.js`) that automatically runs on `npm install`. install.js collects installer host reconnaissance — hostname, username, platform/arch/OS release, network interfaces, a depth-3 listing of the current working directory, selected environment variables, and the output of `ss`/`netstat`, `arp`/`ip neigh`, and `ip route`/`route` — and POSTs the JSON payload to a hardcoded plain-HTTP endpoint at `http://192.168.4.216:3000/api/beacon`. install.js then spawns heartbeat.js as a detached, unref'd child process so it survives beyond install. heartbeat.js long-polls the same C2 every 60 seconds; on a `shell` task it upgrades to a WebSocket at `/ws/shell/<beacon_id>/open`, spawns `/bin/sh`, pipes the shell's stdout/stderr back to the server as WebSocket frames, and writes inbound WebSocket frames into the shell's stdin — a fully remote-controlled interactive shell on the installer's host, gated only by a hardcoded `x-beacon-secret`. A `kill` response from the C2 rewrites the installer's package.json and package-lock.json to remove the package and recursively deletes the package directory, providing a remote self-destruct/anti-forensics path. A SHA-256 hashcash proof-of-work handshake against `/api/pow` gates the beacon. The package description is empty and no functionality is advertised to the installer. ENTRY install.js (install-hook: node install.js) - Install Hook Executes Local JS File in package.json DESTINATION - 3 exfil (reconstructed, custom-c2) (values recorded in verified_iocs) EXFIL - Environment Variable Exfiltration in install.js: "process.env, DOLUS_C2: C2_URL, DOLUS_PKG: PKG_NAME, DOLUS_BEACON_ID: BEACON_ID, ..." - System Information Exfiltration in install.js: "__dirname, 'heartbeat.js')], { detached: true, stdio: 'ignore', env: { ...proces..." - Network Request in heartbeat.js: "request({ hostname: u.hostname, port: u.port || (u.protocol === 'https:" - Network Request in install.js: "request({ hostname: url.hostname, port: url.port || (url.protocol === 'https:" - System Information Collection in install.js: "os.userInfo()" OBFUSCATION - recovered 1 urls, 1 domains from decoded/deobfuscated content ADDITIONAL FINDINGS - Stealth Background Process Spawning in install.js: "spawn(process.execPath, [path.join(__dirname, 'heartbeat.js')], { detached: true..." - Reconstructed Obfuscated URL in install.js: "http://192.168.4.216:3000/api/pow" - Shell Command Execution in heartbeat.js: "require('child_process')" - Silent Process Execution in install.js: "stdio: 'ignore'" - Detached Child Process Payload in install.js: "spawn(process.execPath, [path.join(__dirname, 'heartbeat.js')], { detached: true" - Very New NPM Publisher Account PAYLOAD FILES install.js

Weaknesses (CWE)

CWE-506Embedded Malicious Code

Risk Scores

CVSS 3.1
9.6/10
Critical · CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H

Affected Products

VendorProductVersionsPlatforms
unknowncatwrestlingbirdall (affected)

References

advisory
vendor

Browse GCVE Records

400 records in the GCVE database · Updated September 21, 2026

No matching records found.

Explore Further

Investigate this vulnerability in the interactive console or download the raw GCVE record.

$ Console Community · 100/wk Open console ›