Impact:
The 183 packages span nine scoped namespaces mirroring specific internal service names — including billing, VPN, Kubernetes, ML inference, IAM, loan flows, deposit forms, debit card applications, and crypto exchange modules, indicating the actor profiled each target organization's internal package ecosystem before publishing. The specificity of package names such as @cloudplatform-single-spa/certificate-manager, @cloudplatform-single-spa/vpn, @cloudplatform-single-spa/ml-inference, and @sber-ecom-core/sberpay-widget confirms targeted reconnaissance rather than opportunistic squatting.
On install, the postinstall hook transmits the victim's full process.env to oob.moika.tech — capturing any API keys, CI secrets, cloud credentials, npm tokens, GitHub PATs, or other secrets present in the developer or CI environment at install time. A second-stage binary is simultaneously fetched from https://oob.moika.tech/payload/{mac|win|linux}.js and spawned as a detached child process using .unref(), surviving after npm install exits.
Wave 4 (June 1) introduced home-directory persistence, writing the payload to ~/.emcd-vue_init.js rather than os.tmpdir(), which survives reboots and OS temp cleanup. The RECON_ONLY=1 flag, currently set server-side, indicates that the actor is collecting environment fingerprints and holding exploitation for a follow-on phase. Server-side toggling means full exploitation can be enabled against already-compromised environments without requiring a new install.
The campaign pre-staged benign versions of @capibar.chat/ui-kit and @sber-ecom-core/sberpay-widget on May 4, 2026 — 23 days before the malicious wave — to establish namespace presence and bypass registry age-based filters. All packages carried a shared hardcoded X-Secret header value (l95HdDaz3kQx1Zsg3WxH6HvKANf51RY1) across all four accounts and all four waves, tying the entire campaign to a single operator.