procwire / routecraft npm Windows dropper
Summary
SafeDep reported a five-package npm campaign published on June 16, 2026 that split Windows dropper logic across plausible-looking micro-utilities. The armed packages were procwire@1.3.0, which runs a preinstall loader directly, and routecraft@4.2.0, an Express clone that pulls in procwire on Windows. Three companion packages, bytecraft@1.5.0, endpointmap@2.1.0, and staticlayer@1.1.0, supplied XOR helpers, encoded C2 data, and a self-hostable payload server.
Treat Windows hosts that installed procwire or routecraft on or after June 16, 2026 as compromised. The campaign executes before project code runs, downloads an executable from a public file host, strips Mark-of-the-Web prompts, and launches the payload hidden with multiple fallback methods.
Tags
- ops
- operations
- supply-chain
- npm
- JavaScript
- Windows
- developer-targeting
- preinstall
- npm lifecycle hook
- dropper
- binary execution
- payload staging
- evasion
- package-splitting
Why this matters
- The malicious behavior is split across packages, so reviewing each package in isolation can miss the chain.
routecrafthides the risky dependency behind an Express-like package name and only requiresprocwireon Windows.- The C2 URL is not stored as a string:
endpointmapstores byte arrays,bytecraftperforms XOR, and the key is derived from theendpointmappackage name. - The loader uses
preinstall, so barenpm installis enough for execution before any application import. - The dropper uses redundant download and execution paths, making simple hardening controls partial rather than complete protection.
Reported chain
- Between 14:44 and 14:56 UTC on June 16, 2026, one operator published five npm packages across two fabricated GitHub organizations,
akuznetsov-ossandvpetrov-oss. - The packages used separate one-off maintainer accounts but shared the throwaway maintainer email domain
deltajohnsons[.]com. procwire@1.3.0declared apreinstallscript,node lib/setup.js, and depended onendpointmapandbytecraft.routecraft@4.2.0cloned Express and added Windows-only logic that requiresprocwirewhen Node.js is version 18 or newer.procwireexits on non-Windows systems, then loads byte arrays fromendpointmap, usesbytecraft.xor, derives the XOR key from the first eight bytes of theendpointmappackage name, and reconstructs the payload URL.- The decoded payload location is
https://files[.]catbox[.]moe/j4loim[.]chk. procwiredownloads a Windows executable, saves it under an updater-like name in a writable temp directory, writes a fakeZone.Identifieralternate data stream withZoneId=0, and executes the payload hidden.staticlayeris not victim-side malware by itself; SafeDep describes it as the operator's server-side kit for serving/d/payload paths only to clients using the expected User-Agent.
Packages and infrastructure
| Package | Version | Role |
|---|---|---|
procwire |
1.3.0 |
Armed Windows preinstall dropper. |
routecraft |
4.2.0 |
Express clone that reaches procwire on Windows. |
endpointmap |
2.1.0 |
Holds XOR-encoded C2 host and path arrays. |
bytecraft |
1.5.0 |
XOR helper used to decode the endpoint. |
staticlayer |
1.1.0 |
Server-side payload-serving kit exposed through npm publication. |
Reported pivots:
- Payload host:
files[.]catbox[.]moe - Payload path:
/j4loim.chk - Full staged URL:
hxxps://files[.]catbox[.]moe/j4loim[.]chk - Required / magic User-Agent:
Microsoft-Delivery-Optimization/10.0 - Fake GitHub orgs:
github[.]com/akuznetsov-oss,github[.]com/vpetrov-oss - Maintainer email domain:
deltajohnsons[.]com - Claimed author personas: Anton Kuznetsov and Viktor Petrov, which SafeDep treats as fabricated personas rather than public identities.
Malware behavior
Execution trigger
procwirerunsnode lib/setup.jsfrompreinstall.routecraftuses Windows-gated loader code to requireprocwireonly whenos.platform() === "win32"and Node.js is at least version 18.procwireitself exits unless Node.js is at least version 16 and the platform is Windows.
Endpoint reconstruction
endpointmapstores_epand_pbyte arrays rather than a literal URL.bytecraftXORs those arrays with a key derived fromBuffer.from("endpointmap").slice(0, 8), yieldingendpoint.- The decoded host and path are
https://files.catbox.moeand/j4loim.chk.
Download and execution
SafeDep reports procwire/lib/worker.js:
- Builds sensitive strings with
String.fromCharCodeto reduce simple static detections. - Uses a Microsoft-looking User-Agent,
Microsoft-Delivery-Optimization/10.0. - Disables TLS verification for the Node.js HTTPS request.
- Attempts download through three methods:
- Node.js
httpswith range/resume support and retries. curl.exewith quiet download flags.bitsadminas a fallback.- Saves into writable temp locations such as
%LOCALAPPDATA%\Temp,%TEMP%,%TMP%, or%USERPROFILE%\AppData\Local\Temp. - Randomizes filenames under updater-like prefixes:
msedge_update_*.exechrome_installer_*.exedotnet_host_*.exeonedrive_setup_*.exeteams_update_*.exe- Writes
Zone.IdentifierwithZoneId=0to suppress Mark-of-the-Web / SmartScreen warning behavior. - Attempts execution through direct detached spawn,
cmd.exe /c start "" /min, and PowerShellStart-Process -WindowStyle Hidden.
Server-side kit
staticlayerserves from apayloads/directory only forGETrequests under/d/with User-AgentMicrosoft-Delivery-Optimization/10.0.- Requests that do not match the expected method, path, and User-Agent have their socket destroyed.
- The server supports range responses and
application/octet-stream, mirroring the client dropper's resumable download behavior.
Defender heuristics
Exposure triage
- Search package manifests, lockfiles, SBOMs, private registries, package-manager caches, CI logs, and developer endpoint telemetry for the five package names and versions above.
- Prioritize Windows developer machines and self-hosted Windows runners that ran
npm installon or after June 16, 2026. - Do not limit review to direct dependencies;
routecraftcan pullprocwireone hop away. - Treat any successful install of
procwire@1.3.0orroutecraft@4.2.0on Windows as host compromise pending forensic review.
Endpoint and network hunting
- Hunt outbound requests to
files[.]catbox[.]moeand path/j4loim.chk. - Look for User-Agent
Microsoft-Delivery-Optimization/10.0from developer workstations, build hosts, and CI runners where that traffic is not expected. - Inspect
%LOCALAPPDATA%\Temp,%TEMP%,%TMP%, and%USERPROFILE%\AppData\Local\Tempfor recently created executables matching the updater-like prefixes listed above. - Review process lineage for
node.exespawningcurl.exe,bitsadmin,cmd.exe,powershell.exe, or updater-named executables during npm install windows. - Inspect downloaded executables for suspicious
Zone.Identifieralternate data streams set toZoneId=0rather than ordinary internet-zone markings. - Rotate credentials, npm tokens, GitHub tokens, cloud keys, and CI secrets accessible to affected Windows hosts after containment.
Package-review lessons
- Flag lifecycle hooks in packages that do not need native builds or installation-time setup.
- Correlate package publication bursts by shared maintainer email domain, repository URL patterns, and helper-package dependency relationships, not just account names.
- Detect package sets whose logic only becomes malicious when multiple dependencies are composed.
- Run install-time behavior analysis in sandboxed Windows environments; Linux-only analysis would miss this campaign's active path.
Related pages
- Mastra
easy-day-jsnpm scope compromise - binding.gyp npm CI/CD worm
- Developer-tool config auto-execution
- AI scanner anti-analysis
Sources
- SafeDep: https://safedep.io/procwire-npm-windows-dropper-campaign