ChainDrop

Self-propagating npm supply-chain worm (Mini Shai-Hulud variant) · Credential-stealing infostealer · First reported August 4, 2026 ·

Overview

ChainDrop is the name Microsoft Threat Intelligence gave to a large-scale npm supply-chain compromise it reported on August 4, 2026. Microsoft identified more than 400 compromised packages across multiple unrelated publishers, including packages associated with the keyv, flat-cache, and cache-manager ecosystems. The malicious releases carry a Mini Shai-Hulud variant: a self-propagating credential-stealing worm delivered through a large, heavily obfuscated Bun-based JavaScript payload.

ChainDrop is the latest wave of the Shai-Hulud worm lineage. The original Shai-Hulud campaign surfaced in September 2025, named after a workflow file it dropped, and prompted a CISA alert warning of a self-replicating worm that had compromised hundreds of npm packages by abusing developer credentials and npm publish workflows. Later waves reused and refined the same toolchain. ChainDrop continues that pattern, with the defining change being preinstall execution and a broader set of credential collectors.

The worm typically executes automatically through an npm preinstall lifecycle hook, before package installation completes. Once running, it searches developer workstations and continuous integration and continuous delivery (CI/CD) environments for npm, GitHub, cloud, and infrastructure credentials, then uses recovered identities to authenticate to npm, GitHub, Amazon Web Services (AWS), Kubernetes, and HashiCorp Vault. Collected data is encrypted and transmitted through an attacker-controlled HTTPS endpoint, with attacker-created public GitHub repositories serving as a fallback exfiltration channel.

The most consequential capability is automated propagation. After obtaining an npm publishing token, the payload enumerates packages available to the compromised identity, downloads their latest tarballs, inserts the malware and a loader, adds a preinstall hook, increments the patch version, and republishes. One stolen token produces malicious patch releases across every package that identity can write to. This is why many malicious versions appeared as ordinary patch bumps with no corresponding source commit, pull request, or tag.

Why this matters for defenders: ChainDrop is a developer supply-chain threat first and an endpoint threat second. Its blast radius is credentials, not files. An install on one build runner can hand over npm tokens, GitHub tokens, cloud keys, Kubernetes access, and Vault secrets, and each stolen npm token can seed the next wave of poisoned packages. Removing the offending package does not remediate the compromise. Credential rotation from a known-clean environment and a review of the publishing pipeline are both required.

Verify before relying on this: package and version counts differ across trackers and were revised repeatedly as the investigation continued. Attribution to a named actor remains unresolved. Treat the affected-version lists and infrastructure indicators as time-limited and source them live from Microsoft and CISA rather than a fixed snapshot.

Operational attack chain · install-to-propagate
  1. Poisoned package installed

    Trojanized patch release pulled by npm install or CI rebuild.

  2. preinstall hook fires

    node setup.mjs launches the obfuscated Bun payload.

  3. Environment triage

    Workstation vs CI/CD; guardrails; detached background copy.

    T1480
  4. Credential sweep

    Files, env vars, shell, SSH keys, GitHub Actions runner memory.

    T1552.001
  5. API-verified enumeration

    npm, GitHub, AWS, Kubernetes, Vault access validated live.

    T1526
  6. Encrypt & exfiltrate

    AES-256-GCM + RSA-OAEP; HTTPS C2, GitHub repo fallback.

    T1567
  7. Repo persistence

    Injects into .claude/ and .vscode/ config paths.

    T1546
  8. Worm republishes packages

    Stolen npm token bumps patch, republishes, new node infects.

    T1195.002

The chain is a loop, not a line. Every stolen npm publishing token can restart the cycle across a new set of packages, and every developer who installs one of those packages becomes a new propagation node. None of the individual steps is novel; the significance is that credential theft and republishing are automated, so the blast radius grows in waves rather than being contained after first disclosure.

Stop threats before they spread

Detect malicious behavior, contain affected endpoints, and remediate attacks with Malware Protection Plus.

Free for 30 days. Unlimited endpoints. No credit card required.

Tactics, techniques, and procedures

ChainDrop concentrates in Credential Access, Discovery, and Defense Evasion, with Initial Access and Command and Control carrying the worm logic. The mapping below reflects Microsoft Threat Intelligence reporting on the August 2026 wave and documented Shai-Hulud lineage behavior. Because affiliates and waves reuse the same toolchain, treat this as the common core rather than a fixed script.

Technique detailKey techniques · ChainDrop / Mini Shai-Hulud
TacticTechniquesWhat ChainDrop doesDefender telemetry
Resource DevelopmentRegistered look-alike C2 domains (npm-cache[.]com, pypi-get[.]com, js-mirror[.]com) and created public GitHub repositories used as a fallback exfiltration sink, each tagged with the description "Shai-Hulud: Here We Go Again".Newly registered domains resembling package-registry infrastructure; sudden creation of public GitHub repos under compromised identities with a consistent description string.
Initial AccessTrojanized versions of legitimate npm packages are the delivery vehicle. Initial seeding used stolen maintainer credentials; subsequent releases used stolen npm publishing tokens and, in some cases, GitHub Actions OIDC publishing. Any install or CI dependency pull of an affected version delivers the payload.Unexpected patch-version bumps with no matching source commit or tag; npm/yarn install events pulling recently published versions; lockfile and CI cache diffs against known-good baselines.
ExecutionA preinstall lifecycle script runs node setup.mjs, which launches a large, obfuscated Bun JavaScript bundle. Because npm runs preinstall before installation completes, the payload executes on workstations and build runners before tests or security checks begin.Process creation of node with command line node setup.mjs; a node parent spawning a bun child from a bun-dl-* path or under node_modules.
PersistenceUsing stolen GitHub credentials, the worm injects loader files into repository branches at editor-configuration paths: .claude/settings.json, .claude/setup.mjs, .vscode/tasks.json, and .vscode/setup.mjs. Later editor activity can restart the payload, creating a developer-to-developer infection path.Unexpected commits adding or modifying .claude/ or .vscode/ config files; new setup.mjs under those directories; VS Code tasks that invoke node against a dropped script.
Defense EvasionThe payload is a large, heavily obfuscated Bun bundle designed to hinder analysis and evade Node.js-focused monitoring. During preflight it checks the environment, exits on Russian-language systems, and avoids duplicate instances. A stolen GitHub token is placed in one fallback path using double Base64 encoding. Using the Bun runtime rather than Node also sidesteps tooling scoped only to Node.Bun runtime installed or executed on a build host with no Bun dependency; base64-heavy command lines; process behavior that diverges by system locale; short-lived detached node children.
Credential AccessA shell collector captures the GitHub CLI token and every process environment variable. A filesystem collector searches credential files, shell histories, cloud configuration, SSH keys, and other sensitive locations. In CI, it stays attached to the active job to reach workflow secrets, runner credentials, and OIDC publishing permissions, including tokens held only in GitHub Actions runner memory.Process reads of ~/.npmrc, ~/.aws, ~/.ssh, shell history, and .env files by a node/bun child; gh auth token, gcloud config config-helper, az account get-access-token invoked by a Bun process.
DiscoveryThe payload first determines whether it runs on a developer workstation or in CI/CD, then uses recovered credentials to call npm, GitHub, AWS, Kubernetes, and HashiCorp Vault APIs to verify access and enumerate packages, repositories, workflow secrets, cloud parameters, and secret-store values. It does not merely grep for token patterns; it validates them live.Bursts of outbound API calls to cloud metadata, Kubernetes, and Vault endpoints from a build host shortly after a package install; GitHub token-scope checks and repository enumeration.
CollectionCollected credentials and validated secrets are serialized to JSON and staged for exfiltration in a single structured result set covering local files, environment, shell, and each authenticated service.Creation of transient JSON result files; bulk reads across unrelated credential locations by one short-lived process.
Command and ControlThe active C2 domain is resolved dynamically. Microsoft documents domain rotation through an on-chain smart-contract read and, as a fallback, a cryptographically signed GitHub commit, letting the operator rotate infrastructure without changing the payload. GitHub itself serves as a fallback exfiltration and delivery service. At analysis time the contract returned npm-cache[.]com.Outbound HTTPS to package-registry look-alike domains; blockchain RPC calls from a build host; repeated GitHub API writes creating result files.
ExfiltrationResults are gzip-compressed and encrypted with a randomly generated AES-256-GCM key and 12-byte IV; the AES key is wrapped with the attacker's RSA public key using RSA-OAEP-SHA256. Delivery goes first to the dynamic HTTPS endpoint; if unavailable, the worm creates a public GitHub repository and commits encrypted files named like results-<timestamp>-<counter>.json.Encrypted POST traffic to look-alike C2; creation of public GitHub repos with the "Shai-Hulud: Here We Go Again" description; commits of results-*.json files.
ImpactThe primary impact is credential theft plus automated supply-chain propagation rather than encryption. In a conditional fallback path, the payload installs a token-monitor component that maintains credential access and carries a destructive handler that can trigger if the monitored token is revoked.Presence of a token-monitor persistence component; destructive actions correlated with token-revocation events; unexpected outbound republishing of packages under a compromised identity.
Reconnaissance / Privilege Escalation / Lateral MovementNo pre-attack reconnaissance, no local privilege escalation, and no classic in-network lateral movement were required. Propagation happens through the package registry and repositories, not host-to-host movement, and the payload runs with whatever privileges the installing process already holds.
Stage 1T1195.002 · T1078

How the attack starts

ChainDrop does not need a phishing lure at the point of infection. The delivery vehicle is a trojanized version of a package a developer already trusts. Microsoft assesses that the earliest poisoned releases were seeded using stolen maintainer credentials, after which the worm sustained itself with stolen npm publishing tokens and, in some workflows, GitHub Actions OIDC publishing. From the victim's side, the trigger is ordinary: running npm install, or a CI pipeline pulling a patch update for a transitive dependency during a routine rebuild.

The affected packages were not fringe libraries. Microsoft reported more than 400 compromised packages across unrelated publishers, including packages in the keyv, flat-cache, and cache-manager ecosystems, which sit deep in the dependency trees of a large share of JavaScript projects. That depth is the point. A team does not have to install a malicious package directly. A dependency three or four levels down is enough, which is why many organizations were exposed without any obviously suspicious action on their part.

Many malicious versions appeared as clean patch bumps with no corresponding source commit, pull request, or tag, because the attacker modified and republished package tarballs directly rather than compromising each public source repository. This is the lineage's signature: the same self-propagating worm behavior CISA warned about for the original Shai-Hulud campaign in September 2025, now delivered through preinstall execution.

Stage 2T1059.007 · T1204.003 · T1082 · T1480

What runs on the endpoint

Affected releases add a preinstall lifecycle script that launches a bundled file, setup.mjs, which in turn runs a large, heavily obfuscated Bun-based JavaScript payload. Because npm executes preinstall scripts before installation completes, the code runs on developer workstations and build runners before application tests or conventional security checks begin. The representative process pattern is a node process invoking node setup.mjs, which then spawns a bun child from a temporary download directory.

On startup the payload runs a short preflight. It determines whether it is on a developer workstation or in a CI/CD environment, checks the runtime environment, exits on Russian-language systems, and avoids launching duplicate instances. On workstations it detaches a background copy so it continues after the install command returns. In CI it stays attached to the active job, because that is where workflow secrets, runner credentials, and OIDC publishing permissions live.

From there the collectors run. A shell collector captures the GitHub CLI token and every process environment variable. A filesystem collector walks credential files, shell histories, cloud configuration, and SSH keys. On CI runners, the payload also reaches for credentials held only in GitHub Actions runner memory, which is why an investigation limited to files on disk can miss the most sensitive exposure.

Stage 3T1027 · T1140 · T1480 · T1568

How the malware evades detection

The evasion is layered and mostly practical rather than exotic. The payload ships as a large, heavily obfuscated Bun bundle. Choosing the Bun runtime instead of Node is itself an evasion: endpoint tooling and monitoring rules scoped to Node process behavior may not inspect a Bun process the same way. The obfuscation is designed to hinder static analysis of the bundle.

Execution guardrails reduce noise and analysis exposure. The payload exits on Russian-language systems, avoids duplicate instances, and behaves differently on a workstation versus a CI runner. In one exfiltration fallback path, a stolen GitHub token is placed into the request using double Base64 encoding, which is encoding for evasion rather than encryption. Because delivery arrives through the legitimate package's own install process, there is no external dropper or email attachment to flag at the point of entry.

Command and control is deliberately resilient. Microsoft documents that the active C2 domain is resolved dynamically through an on-chain smart-contract read, with a cryptographically signed GitHub commit as a fallback source for the current domain. This lets the operator rotate infrastructure without shipping a new payload, so blocking a single domain has limited durable value. If the HTTPS channel is unavailable entirely, the worm falls back to committing encrypted results into an attacker-created public GitHub repository, using a trusted platform as its exfiltration path.

Stage 4T1552.001 · T1528 · T1526 · T1567.001 · T1195.002

What it tries to access or modify

The objective is credentials, and the credential set is broad. The payload does not just scan files for token patterns; it uses the credentials it finds to call service APIs, verify access, and pull additional secrets those identities are entitled to. It authenticates to npm, GitHub, AWS, Kubernetes, and HashiCorp Vault, and enumerates packages, repositories, workflow secrets, cloud parameters, and secret-store values. Discovered GitHub tokens are validated, then used to check token scopes and enumerate writable repositories.

Collected data is serialized to JSON, gzip-compressed, and encrypted with a randomly generated AES-256-GCM key and 12-byte IV; the AES key is wrapped with the attacker's RSA public key using RSA-OAEP-SHA256. Exfiltration goes first to the dynamic HTTPS endpoint, then falls back to a public GitHub repository where encrypted results are committed as files named like results-<timestamp>-<counter>.json.

Two modifications extend the compromise beyond theft. First, worm propagation: npm tokens are checked for package-write permission and 2FA-bypass capability, then the payload downloads a package's latest tarball, copies the malware bundle in, adds a loader, replaces the lifecycle scripts, increments the patch version, and republishes. One token becomes many poisoned releases. Second, repository persistence: using stolen GitHub credentials, the worm injects loader files into .claude/ and .vscode/ configuration paths across repository branches, so future editor activity can restart the payload and infect the next developer who opens the repository. A conditional path also installs a token-monitor component that maintains access and carries a destructive handler if the monitored token is revoked.

Execution flow

What the worm looks like in process and API telemetry

Where Malware Protection Plus fits

ChainDrop lives primarily in the developer supply chain and executes on whatever platform runs the install, often Linux CI runners and macOS or Windows developer laptops. Malware Protection Plus focuses on the Windows-side developer endpoints and build hosts where this activity becomes visible in process telemetry.

On a managed Windows developer machine or build agent, the observable signals are behavioral: a node process spawning node setup.mjs, a node parent launching a Bun runtime from a temporary download path, and a short-lived child process reading credential files and environment variables shortly after a package install. Malware Protection Plus can detect these behaviors, isolate the affected endpoint to interrupt exfiltration and propagation, and provide process-lineage visibility for root-cause investigation.

It does not replace registry-side and pipeline-side controls. Package hygiene, npm token governance, GitHub Actions hardening, and secret-store isolation are the primary defenses against the worm mechanism itself. Malware Protection Plus complements those layers by covering the Windows endpoints inside the blast radius and supporting containment and remediation once an install has already run.

Indicators of compromise

Durable indicators describe behavior and artifact names that should recur across rebuilt infrastructure and future waves. Volatile indicators (domains, hashes) are specific to the August 2026 wave and should be expected to rotate. Because the C2 domain resolves dynamically, treat network indicators as time-limited and source them live from Microsoft and CISA.

Process and command patterns

Durable · 5 patterns

Behavioral chains that should persist across variant and infrastructure changes.

  • node setup.mjs spawned during an npm installpreinstall loader execution — entry-vector indicator
  • node parent → bun child from a bun-dl-* pathsecond-stage Bun payload execution
  • Bun process invoking gh auth token / gcloud config config-helper / az account get-access-tokenAPI-verified credential harvesting
  • Unexpected patch-version publish with no matching source commitworm republishing signature
  • Public GitHub repo created with description "Shai-Hulud: Here We Go Again"fallback exfiltration channel

Filesystem and repository artifacts

Durable · 5 artifacts

File names and repository paths reused across the payload and its persistence routine.

  • setup.mjs (in npm tarball and in repository loaders)loader; present in package and in injected repos
  • Math_Symbol.js / Math_init.js / math_<guid>.jsmalicious JavaScript artifact names in NodeJS directories
  • .claude/settings.json + .claude/setup.mjseditor-config persistence path
  • .vscode/tasks.json + .vscode/setup.mjseditor-config persistence path; restarts payload on editor activity
  • results-<timestamp>-<counter>.json in a new public repoencrypted exfiltration artifact

Network infrastructure

Volatile · resolves dynamically

C2 domains rotate through on-chain resolution. Use as point-in-time signals, source current values from Microsoft's published IOCs.

  • npm-cache[.]com (C2; hxxps[:]//npm-cache[.]com:443/router)active C2 at analysis time
  • pypi-get[.]com · js-mirror[.]comearlier candidate C2 domains
  • On-chain resolver: contract 0xE1f2395ee43e45A1556EC6438a88c31B83493103smart-contract C2 rotation (selector 0x53ed5143); signed fallback marker: thebeautifulmarchoftime

File hashes (SHA-256)

Volatile · changes on rebuild

Tied to the August 2026 samples. Use as confirmation aids, not primary detection rules.

  • 54dc7ea54a1317cca0e890a2770630cf7fa6c97813e0cb9d2caa93012b350668setup.mjs — npm tarball preinstall loader (Microsoft)
  • fd3ca4007b225fdf8de7af4345a19179d5efa8c4bb9205f88cda806e5684b1ebsetup.mjs — .claude / .vscode repository loader (Microsoft)
  • 9fc2570b7cef51c1b8df116d144d11ff4096357be7d2c4c6367cfc2509cf1bccMath_*.js — stealer script (Microsoft)

Detection guidance

Hash-based detection is weak here: the bundle is obfuscated, the C2 rotates, and each wave recompiles. The reliable detections target behavior that a package install should never produce: a package install spawning a runtime that reads credentials, a Bun process calling cloud credential-helpers, and unexpected republishing under a maintainer identity. The detections below are ordered roughly by kill-chain position.

  1. 01

    preinstall script execution during npm install

    Process telemetry

    What to monitor: a node process executing node setup.mjs as part of an npm or yarn install, particularly on build runners and developer machines. Correlate with a node parent spawning a bun child from a bun-dl-* directory or under node_modules.

    Why it works: a routine dependency install has no reason to launch a separate runtime that then reads secrets. This catches the entry behavior regardless of which package delivered it or how the payload is obfuscated.

  2. 02

    Bun runtime on a host with no Bun dependency

    Process telemetry

    What to monitor: installation or execution of the Bun runtime on developer endpoints or CI runners that do not use Bun as part of their normal build. Alert on a Bun process initiated by a node install chain.

    Why it works: the worm uses Bun specifically to sidestep Node-focused monitoring. On a Node-only or non-Bun project, an unexpected Bun process spawned from an install is a strong, low-noise signal. False positives: teams that genuinely use Bun; scope the rule to hosts without a documented Bun dependency.

  3. 03

    Credential-file and env access right after an install

    File / process telemetry

    What to monitor: a node or bun child reading ~/.npmrc, ~/.aws, ~/.ssh, cloud config, shell history, and .env files, or capturing the full process environment, within a short window of a package install.

    Why it works: broad credential enumeration immediately after install is the worm's core objective and is distinct from normal build activity. Correlating the install with the credential reads gives a high-fidelity chain.

  4. 04

    Cloud credential-helper calls from a build process

    Process / cloud telemetry

    What to monitor: gh auth token, gcloud config config-helper, az account get-access-token, or equivalent commands invoked by a Bun or node process spawned from an install chain, followed by API calls to AWS, Kubernetes, or Vault.

    Why it works: the payload validates and expands credentials against live APIs rather than only reading files. Credential-helper execution originating from a dependency install is anomalous and maps directly to documented ChainDrop behavior.

  5. 05

    GitHub Actions runner secret and OIDC access

    CI/CD telemetry

    What to monitor: build jobs that read workflow secrets or request OIDC publishing tokens outside their expected steps, and installs that keep a process attached to the runner beyond normal install duration.

    Why it works: in CI the payload stays attached specifically to reach runner memory, workflow secrets, and OIDC publishing rights. Secret access that does not match the pipeline's declared steps is a reliable CI-side indicator.

  6. 06

    Unexpected package republishing

    Registry / publish telemetry

    What to monitor: patch-version publishes under a maintainer identity that have no corresponding source commit, pull request, or tag, and publish events from unexpected locations or automation. Watch for bursts of publishes across many packages tied to one identity in a short window.

    Why it works: this is the worm mechanism itself. A publish with no matching source change is the clearest sign a stolen token is being used to propagate. Reviewing npm publishing and GitHub repository activity is a primary response action.

  7. 07

    Editor-config injection in repositories

    Source control telemetry

    What to monitor: commits that add or modify .claude/settings.json, .claude/setup.mjs, .vscode/tasks.json, or .vscode/setup.mjs, especially across many branches or repos in a short period, or from an identity that does not normally touch those files.

    Why it works: this is the repository persistence and developer-to-developer spread path. Injected editor tasks restart the payload when the next developer opens the repository, so catching the commit interrupts a secondary infection route.

  8. 08

    Exfiltration to look-alike domains and new public repos

    Network / GitHub telemetry

    What to monitor: outbound HTTPS from a build host to package-registry look-alike domains, blockchain RPC calls from a build process, and the creation of a public GitHub repository with the description "Shai-Hulud: Here We Go Again" or commits of results-*.json files.

    Why it works: because the C2 domain rotates through on-chain resolution, the durable signals are the fallback GitHub repo pattern and the anomaly of a build host performing blockchain lookups. These outlast any single domain block.

Hardening and response recommendations

ChainDrop depends on lifecycle-script execution, long-lived publishing tokens, and secrets left within reach of an install. The controls below target those dependencies. Quick win = single configuration change, deployable in days. Standard = needs a rollout or workflow change, deployable in weeks.

  1. Contain the exposure: pin versions, purge caches, rotate from a clean host

    Critical

    Review dependency trees, lockfiles, artifact repositories, and CI caches for compromised versions, including transitive references, and pin known-good versions. Purge npm and yarn caches on affected endpoints and build hosts, especially where compromised tarballs may have entered shared CI caches. If any build system or workstation imported an affected version, rotate exposed credentials from a known-clean environment.

    Do: treat every credential reachable from an affected workstation or runner as exposed: npm, GitHub, cloud, Kubernetes, Vault, and SSH keys. Rebuild affected projects and shared base images from a trusted baseline so future jobs do not inherit poisoned caches or persistence.

  2. Disable install lifecycle scripts where feasible

    Quick win

    The worm executes through an npm preinstall hook before installation completes. Running installs with lifecycle scripts disabled removes the automatic execution path for this class of attack in environments that do not depend on those scripts.

    Do: use --ignore-scripts (or the equivalent configuration) in CI and for routine installs, and maintain an allowlist for the few packages that genuinely require build scripts. Adopt an install-delay control such as npm's min-release-age so brand-new malicious versions are not pulled immediately.

  3. Move publishing to trusted publishing (OIDC) and kill long-lived tokens

    Standard

    The worm propagates by reusing stolen npm publishing tokens. GitHub's npm security plan deprecates legacy classic tokens, shortens granular token lifetimes, and pushes maintainers toward trusted publishing. Trusted publishing uses short-lived, job-specific OIDC credentials from your CI/CD provider, eliminating the long-lived token the worm needs.

    Do: adopt OIDC trusted publishing for GitHub Actions and GitLab CI, revoke legacy classic tokens, and remove NPM_TOKEN secrets once trusted publishing is configured. Note that trusted publishing does not stop an attacker who subverts the source workflow itself, so pair it with branch protection, required reviewers, and protected environments.

  4. Keep secrets out of reach of an install

    Standard

    The payload harvests whatever an install can read: environment variables, cloud config, SSH keys, and GitHub Actions runner memory. Scope secrets to a dedicated secrets manager, minimize what is present in build environments, and avoid exposing broad cloud, Kubernetes, or Vault credentials to package-install steps.

    Do: use short-lived, least-privilege credentials in CI; separate install steps from secret-bearing steps; and prefer ephemeral runners so harvested runner state does not persist across jobs.

  5. Enforce FIDO-based 2FA and update the npm CLI

    Quick win

    The worm checks stolen npm tokens for 2FA-bypass capability. Enforcing phishing-resistant 2FA on maintainer accounts and requiring publish-time verification raises the cost of token reuse. Keep the npm CLI current so trusted-publishing and token-lifetime controls are available.

    Do: enforce FIDO-based 2FA on npm and GitHub maintainer accounts, disable 2FA-bypass on publishing tokens, and update the npm CLI to a version that supports trusted publishing and current token controls per npm and GitHub guidance.

  6. Respond: isolate, hunt persistence, audit the pipeline

    Quick win

    On suspected ChainDrop activity, isolate affected developer endpoints and build hosts, then hunt for the durable artifacts: setup.mjs, Math_*.js files in NodeJS directories, injected .claude/ and .vscode/ loaders, and any token-monitor persistence component. Because CI runner memory holds ephemeral credentials, do not scope the investigation to on-disk files alone.

    Do: review unexpected npm publishing and GitHub repository activity, rotate and revoke potentially exposed npm, GitHub, cloud, SSH, and automation credentials, and verify the release process itself has not been subverted before trusting new builds. Align containment and recovery order with CISA's npm ecosystem guidance.

Primary references

Source material this page is built on. Technical claims are traced to Microsoft Threat Intelligence, CISA, and GitHub / npm platform documentation, with neutral journalism used for scope and timeline.

Catch the developer-endpoint edges of an npm supply-chain worm.

Malware Protection Plus detects install-time behavioral patterns, credential-access activity, and suspicious process lineage on Windows developer machines and build hosts inside the blast radius.