PhantomRaven is a supply-chain campaign that has pushed more than 200 malicious packages into the public npm registry since August 2025, drawing over 86,000 installs before the first wave was pulled. Its signature is a technique researchers named Remote Dynamic Dependencies (RDD): instead of shipping malicious code inside the published tarball, each package declares a dependency as a raw http:// URL. Registry-side analysers do not follow those links, so the package renders as "0 Dependencies" — while npm quietly downloads and runs attacker code on install.
In September 2026, CrowdStrike tied the operation to an individual who publicly claims to be a bug-bounty hunter, active since November 2022, and assessed with high confidence that the malware itself was written with the help of a large language model. The payload rifles a developer's machine and build environment for GitHub tokens and CI/CD secrets — the exact credentials that let one poisoned laptop metastasise into a repository-wide breach.
This report walks the full campaign: the actor profile, the multi-wave timeline, how RDD defeats dependency scanners, what the payload harvests, the C2 and exfiltration model, a responder's investigation runbook, the complete IOC set, paired KQL/SPL hunt queries, the MITRE ATT&CK mapping, and concrete hardening for developers and SOC teams.
◈ Table of Contents
01 · THREAT ACTOR PROFILE
AttributionPhantomRaven began as an "unattributed" registry-flooding campaign first documented by Koi Security in October 2025. In September 2026, CrowdStrike published attribution linking the operation to a single operator who has, paradoxically, cultivated a public identity as a bug-bounty hunter — and who, per CrowdStrike, has "collected bounties from" at least nine organisations across technology, retail and hospitality. The same operator is assessed to have leaned on an LLM to author the malware, a growing pattern in low-skill-but-high-volume supply-chain abuse.
| Attribute | Detail |
|---|---|
| Campaign name | PhantomRaven |
| Aliases / persona | Self-described bug-bounty hunter; multiple linked npm handles (see IOCs) |
| Attribution | CrowdStrike — single-operator assessment (Sept 2026) |
| First activity | November 2022 (operator); PhantomRaven npm packages from August 2025 |
| Motivation | Credential & CI/CD secret theft; token/secret monetisation |
| Targeting | Developers & CI/CD build agents worldwide (opportunistic, non-sector-specific) |
| Signature TTP | Remote Dynamic Dependencies (RDD) via http:// URL imports |
| Tooling origin | Assessed LLM-authored (verbose comments, placeholder code, token-analysis patterns) |
Attribution here matters less than the technique. RDD is trivially reusable — any actor can copy the http:// dependency trick tomorrow. Hunt the behaviour (install-time fetches to non-registry hosts), not the persona.
02 · CAMPAIGN TIMELINE
Aug 2025 → Sep 2026PhantomRaven is not a single burst; it is a sustained, multi-wave operation that survived its first public takedown and simply re-seeded the registry.
- 1August 2025 — First PhantomRaven packages appear on npm, seeded with RDD http:// dependencies.
- 2October 2025 — Koi Security publicly documents the first wave: 126 malicious packages with 86,434 downloads, coining the term "Remote Dynamic Dependencies."
- 3Nov 2025 – Feb 2026 — Waves two, three and four: 88 additional packages published. Even after reporting, ~81 remained live on npm.
- 4September 2026 — CrowdStrike attributes the campaign to a single "bug-bounty hunter" operator, assesses LLM-authored malware, and observes expansion attempts to PyPI with a similar infostealer.
- 5Ongoing — Two C2 servers remained active at time of the latest reporting; the RDD technique continues to evade static "0 dependencies" checks.
| Wave | Window | Packages | Notable |
|---|---|---|---|
| Wave 1 | Aug–Oct 2025 | 126 | 86,434 downloads; Koi disclosure |
| Waves 2–4 | Nov 2025–Feb 2026 | 88 | ~81 still live after reporting |
| Attribution | Sep 2026 | — | CrowdStrike single-operator + PyPI pivot |
Removal ≠ remediation. Waves 2–4 show the operator re-publishes faster than the registry can prune. Lockfiles pinned during the Aug 2025–Feb 2026 window may still reference a poisoned version — audit history, not just current installs.
03 · INITIAL ACCESS — SLOPSQUATTING
DeliveryPhantomRaven's entry vector is the developer's own package manager — but the lure is engineered for the age of AI-assisted coding. Alongside classic typosquatting, the operator uses slopsquatting: registering package names that LLM coding assistants are prone to hallucinate. When an assistant confidently suggests a plausible-but-nonexistent package, the attacker has often already claimed that exact name.
A developer asks an assistant to "remove unused imports" and the model suggests installing unused-imports — a truncation of the real eslint-plugin-unused-imports. The legitimate name is long and easy to mis-recall; the short one sounds right. PhantomRaven registered the short name and wired it to RDD.
Slopsquatting weaponises trust in the assistant. Never install a package name you have not verified against its canonical repo — copy the name from the project's README, not from a chat window.
Beyond hallucinated names, the campaign published packages impersonating well-known organisations and even MCP (Model Context Protocol) server packages — riding the current gold-rush around AI tooling to blend into legitimate-looking install commands in tutorials and generated snippets.
04 · TECHNICAL DEEP DIVE — REMOTE DYNAMIC DEPENDENCIES
The core trickThis is the phase that makes PhantomRaven worth studying. npm supports specifying a dependency not only by registry version range, but by a direct URL. PhantomRaven abuses that feature: it points a dependency at an attacker-controlled http:// host. The published tarball on npm therefore contains no malicious code at all — the malice lives at the far end of the URL, fetched only at install time.
A PhantomRaven package's manifest declares a dependency whose value is a raw HTTP URL on the attacker's server. npm dutifully downloads whatever tarball that URL returns and installs it as a transitive dependency. Because npmjs.com's own analysis pipeline does not follow off-registry URLs, the package page shows "0 Dependencies."
The dependency uses plain http://, not https. Any egress proxy that can log or block cleartext HTTP fetches from node/npm to non-registry hosts will catch this — most environments simply never look.
Static supply-chain scanners and the registry UI build their dependency graph from the manifest's registry-resolvable entries. An off-registry URL is opaque to them — they cannot resolve it, so they omit it. The result is a package that looks dependency-free and therefore low-risk, while carrying an entire second-stage supply chain the tools never see.
| Observer | What it sees | Reality |
|---|---|---|
| npm registry page | "0 Dependencies" | 1+ hidden http:// deps |
| Static SCA scanner | Clean dependency tree | Off-registry fetch omitted |
| Developer / assistant | Lightweight, safe-looking | Install-time remote code |
| npm client (install) | Resolves the URL | Downloads + runs payload |
The fetched second-stage package carries a preinstall lifecycle script. npm runs lifecycle hooks automatically during npm install, so the payload executes with the developer's privileges the moment the tree resolves — no manual step, no import, no runtime call required.
Running npm install --ignore-scripts blocks the preinstall hook and neutralises this exact chain. It should be the default in CI and is a one-line win for local dev too.
CrowdStrike assessed with high confidence that the payload was written with an LLM, citing verbose explanatory comments, leftover placeholder code, and statistical token-analysis patterns characteristic of model output. This lowers the skill floor: the operator supplies the delivery trick (RDD) and lets the model generate the stealer logic — enabling the high package volume seen across the waves.
05 · PAYLOAD & CREDENTIAL HARVEST
Post-executionOnce the preinstall hook runs, the payload performs environment reconnaissance and then systematically collects the credentials most valuable in a developer or build context. In CI/CD, those secrets live in environment variables the payload can simply read.
| Collected artefact | Where it lives | Impact |
|---|---|---|
| GitHub tokens / creds | Env vars, git config, npm config | Repo read/write, further supply-chain poisoning |
| CI/CD secrets | GitHub Actions, GitLab CI, Jenkins, CircleCI env | Pipeline takeover, cloud key access |
| npm auth token | ~/.npmrc / CI env | Publish rights → poison more packages |
| Email addresses | git config user.email, environment | Targeting, phishing, identity linking |
| System fingerprint | OS, hostname, architecture | Victim triage, deduplication |
| Public IP address | Outbound lookup | Geolocation, network attribution |
The CI/CD angle is the danger. A GitHub Actions runner that installs a poisoned package hands over the workflow's secrets — cloud keys, registry tokens, signing material — enabling a single build to escalate into a full pipeline compromise. This is precisely how the adjacent CrowdSec/TanStack incident led to 170 private repositories being copied.
Local Developer Laptop
Personal GitHub token + SSH keys stolen; attacker pivots to private repos and cloud consoles the dev can reach.
CI/CD Build Agent
Workflow secrets and cloud OIDC/keys exfiltrated during dependency install — pipeline-wide blast radius.
Package Maintainer
Stolen npm publish token lets the actor poison the maintainer's own packages, spreading the campaign downstream.
06 · C2 & EXFILTRATION
InfrastructureThe same infrastructure that serves the RDD payload also receives the stolen data. Reporting names packages.storeartifact.com as the primary delivery host, and describes an attacker fond of "artifact"-themed naming — a deliberate attempt to look like a benign package mirror in logs.
The payload is served from an attacker-controlled host and stolen data is returned to attacker infrastructure. Two C2 servers were reported active at the time of the latest analysis. The naming conventions themselves are an IOC family: strings evoking package registries and artifact stores.
| Indicator | Type | Note |
|---|---|---|
| packages.storeartifact.com | Domain / C2 | Primary RDD delivery host (Koi) |
| *storeartifact* | Naming pattern | Attacker host convention |
| *jpartifacts* | Naming pattern | Attacker host convention |
| *artifactsnpm* | Naming pattern | Attacker host convention |
To survive network filtering, the stealer exfiltrates over multiple redundant methods: HTTP GET, HTTP POST, and even WebSocket connections. If one channel is blocked, another carries the data — a resilience pattern that also gives defenders multiple detection surfaces.
Multiple exfil channels cut both ways. A hunt that only watches POST bodies misses the GET and WebSocket variants — instrument on the destination host, not the method.
Given the naming conventions, defenders can pivot on the confirmed host and its TLS/HTTP fingerprints to surface sibling infrastructure. Start from the known domain, then pivot on shared certificates, favicons and response bodies.
07 · DFIR INVESTIGATION STEPS
Responder runbookIf you suspect a developer or runner installed a PhantomRaven package, work the following in order. The goal is to find http:// dependencies, confirm whether the preinstall hook ran, and scope credential exposure.
The single highest-signal artefact is a dependency specified as a bare HTTP(S) URL. Grep every manifest and lockfile in the repo and on the host — including historical lockfile entries from the Aug 2025–Feb 2026 window.
The registry page lies; the installed tree does not. Enumerate what actually landed on disk and what a fresh resolve would fetch — a dry-run with scripts disabled is safe.
Assume any secret readable by the install process is compromised. On a build agent, that is the entire workflow secret set; on a laptop, the local git/npm tokens and SSH keys.
- 1Revoke & reissue GitHub PATs / OAuth tokens and npm publish tokens exposed to the host or runner.
- 2Rotate every CI/CD secret in the affected pipeline (cloud keys, registry creds, signing keys).
- 3Review GitHub/GitLab audit logs for anomalous repo clones or new SSH keys after the install time.
- 4Check cloud provider logs for use of exfiltrated keys from unfamiliar IPs.
OAuth-token reuse can leave no trace in GitHub logs for the read itself — pair log review with credential rotation; do not rely on logs alone to rule out access.
08 · INDICATORS OF COMPROMISE
IOCsOnly indicators confirmed in public reporting are listed. Full package lists and file hashes are enumerated in the Koi Security and Sonatype appendices linked in Sources — pull those into your IOC scanner for complete coverage.
| Indicator | Type | Context |
|---|---|---|
| packages.storeartifact.com | Domain | RDD payload delivery / C2 |
| *storeartifact* · *jpartifacts* · *artifactsnpm* | Host patterns | Attacker naming family |
| http:// dependency URL in package.json | Behaviour | Core RDD indicator |
| Package | Note |
|---|---|
| unused-imports | Slopsquat of eslint-plugin-unused-imports |
| ui-styles-pkg | Carried the reported RDD http:// import |
| transform-jsbi-to-bigint | Published via account jpdhellonpm1 (CrowdStrike) |
| sort-imports-es6-autofix | Published via account jpd15 (CrowdStrike) |
| Handle | Handle | Handle |
|---|---|---|
| jpdhellonpm1 | jpd15 | jpd12 |
| jpd13 | npmhell | npmpackagejpd |
| npmtestdharsh | jpdhackerone11 | packagedharsh |
Block/alert on any install-time HTTP fetch from node/npm to a non-registry host. That single behavioural rule catches PhantomRaven regardless of which package name or account is used next.
09 · DETECTION & HUNT QUERIES
KQL · SPL · SigmaEach query below is paired KQL (Microsoft Sentinel / Defender XDR) and SPL (Splunk), with a one-line statement of what it finds. Tune host/process fields to your schema.
10 · MITRE ATT&CK MAPPING
TTPs| Tactic | Technique | ID | PhantomRaven use |
|---|---|---|---|
| Resource Development | Stage Capabilities: Upload Malware | T1608.001 | Poisoned packages hosted on npm + RDD host |
| Initial Access | Supply Chain Compromise: Software Dependencies | T1195.002 | Slopsquat/typosquat packages installed by victims |
| Execution | Command & Scripting: JavaScript | T1059.007 | preinstall lifecycle hook runs stealer |
| Defense Evasion | Obfuscated/Hidden Artifacts | T1027 | RDD hides payload off-registry ("0 deps") |
| Credential Access | Unsecured Credentials: Credentials in Files | T1552.001 | Reads .npmrc, git config, CI env secrets |
| Discovery | System Information Discovery | T1082 | OS, hostname, architecture fingerprint |
| Command & Control | Application Layer Protocol: Web | T1071.001 | HTTP(S)/WebSocket to attacker host |
| Exfiltration | Exfiltration Over C2 Channel | T1041 | Redundant GET/POST/WebSocket exfil |
11 · MITIGATION & HARDENING
DefendPhantomRaven is defeated by two independent controls: stop install-time code execution, and block off-registry fetches. Apply both — belt and braces.
Lifecycle hooks are the execution primitive. Turn them off globally and re-enable only for the handful of packages that genuinely need them.
Pin installs to a trusted registry or internal proxy (Verdaccio, Artifactory, Nexus) and block direct URL dependencies. If npm cannot reach an arbitrary http:// host, RDD cannot deliver.
- 1Enforce
package-lock.jsonand review diffs for URL-valued dependency specs in code review. - 2Scan manifests in CI for
https?://dependency values and fail the build. - 3Use scoped, short-lived tokens and OIDC for cloud auth so a stolen static key is worthless.
- 4Verify package names against canonical repos before install — defeat slopsquatting at the source.
- ignore-scripts is enforced org-wide in CI and recommended for local dev
- npm/yarn egress is restricted to the approved registry/proxy host only
- CI lint fails any manifest with a raw http(s):// dependency value
- CI/CD secrets are scoped, short-lived, and rotated after any suspicious install
- PhantomRaven domains + naming family are loaded into the IOC scanner and SIEM
12 · SOURCES & REFERENCES
VerifyAudit your dependency tree before your next build. Run CyberHawk's free IOC Scanner against the PhantomRaven domains and naming family, and browse our SOP library for the CI/CD Pipeline Injection and GitHub Secret Exposure response playbooks referenced in this report.
Want the paired KQL/SPL hunts as ready-to-deploy analytics rules? They live in our Live Tools collection alongside the full CyberHawk detection pack.
◈ Stay Connected
Follow CyberHawk Threat Intel for threat intelligence, deployment guides and hands-on SOC tooling content.
"They can't exploit you if you are the Exploit."