Amazon's threat intelligence team disclosed this week that the group behind the recent compromise of the axios JavaScript library also planted malicious code in a small package called typo-crypto in March 2025 — a full year earlier — and in the widely used debug and chalk packages in September 2025. Researchers connected the four incidents by tracing domain records tied to the axios attack back to the earlier activity. Until now, the three prior compromises had not been publicly attributed to the same actor. (Source: Cyberscoop)
That actor is tracked as UNC1069, Sapphire Sleet, and Stardust Chollima, and is tied to North Korea. Amazon CISO CJ Moses described the March 2025 typo-crypto operation as a rehearsal, chosen because its low download count let the group test its methods "without putting that on the big stage."
The distinction matters for how you assess your own risk. This was not a coding flaw in a dependency you pulled in, and there is no CVE to triage. A state-sponsored group cultivated relationships with maintainers who already had publish rights, then used that legitimate access to push an update carrying hidden code.
Scale is what turns that into a business problem. Axios alone is downloaded more than 100 million times a week, and Wiz found that the debug and chalk incident touched roughly one in ten cloud computing environments inside a two-hour window.
"Going from there not being a vulnerability, to there being a vulnerability, to there being an exploited vulnerability … used to be days to weeks. Now it's hours to minutes," Moses said.
If your development teams install npm packages by name and version without verifying who published a given release, your build pipeline treats a trusted maintainer account and a compromised maintainer account identically. The four campaigns show a group deliberately working its way up from obscure packages to ones sitting in production at organizations worldwide.
How Malicious npm Packages Propagate Through Development Pipelines
The delivery mechanism in all four package compromises was publishing access, not name confusion. Amazon said the attackers built a relationship with a maintainer who already held publish rights, then used that access to push an update containing hidden code — mapping to MITRE ATT&CK T1195.002 (Compromise Software Supply Chain) carried out with legitimate credentials rather than an exploit. "They didn't break through a window," said CJ Moses, Amazon's chief information security officer. "They basically earned the trust of an employee to hand them the keys."
That distinction matters for your dependency policy. Pinning to a well-known maintainer's package, requiring signed publishes, or checking download counts does not filter out a malicious version that the real maintainer's account published.
Inside the typo-crypto package, the naming deception operated one level down. The malicious file was named core.js, built to resemble the unrelated legitimate package core-js — a file a developer skimming a directory listing would likely read past.
The payload itself was staged and conditional. Amazon said the file activated only when it received a specific numeric input, then contacted an attacker-controlled server to pull a second piece of code, with different second-stage variants for Windows, macOS, and Linux. In ATT&CK terms that combines execution guardrails (T1480), ingress tool transfer (T1105), and OS-specific tailoring — the malicious logic that actually runs never ships in the registry artifact at all.
The obfuscation was deliberately modest: encoded text paired with a cipher, which Moses said was meant to slow analysis, including by AI-based review tools, without relying on heavy encryption. Heavily encrypted or high-entropy blobs draw attention from automated scanners; lightly encoded strings do not.
Two properties explain why routine dependency checks missed this class of compromise:
- Conditional runtime trigger — the code stays dormant until called with the right input, so install-time or sandbox execution shows nothing anomalous.
- No advisory exists at publish time —
npm auditcompares your resolved versions against published advisories, and a newly pushed malicious version has none until researchers catch it. - Transitive depth — debug and chalk are typically pulled in indirectly by other packages rather than listed in your own
package.json, so a developer reviewing direct dependencies never sees them.
Speed is the operational consequence. Wiz found that roughly 1 in 10 cloud computing environments were affected by the debug and chalk incident within a two-hour span. Moses framed the compression plainly: the path from no vulnerability, to a vulnerability, to an exploited vulnerability "used to be days to weeks. Now it's hours to minutes."
There is a second entry path that bypasses maintainer trust entirely. Rick Anthony, senior engineering manager at Amazon Web Services, described attackers registering package names that AI coding assistants sometimes generate in error, so a developer following a suggestion installs malicious code without mistyping anything. Researchers added that generative AI also makes it cheaper to produce authentic-looking code, documentation, and contribution histories — the reputation-building that the xz-utils backdoor required months of patient effort to achieve.
Volume follows from that economics. The group tracked as TeamPCP has injected malicious code into more than 1,000 software packages over a four-month span this year.
The forensic record sits in build infrastructure rather than the registry: resolved versions and integrity hashes recorded in package-lock.json, on-disk copies under node_modules, cached tarballs and container image layers from CI runs, registry publish metadata showing which account pushed which version and when, and egress records from build agents or production hosts reaching second-stage download infrastructure.
Business and Operational Impact for Cloud and Software Development Organizations
Axios is downloaded more than 100 million times a week, and most organizations pulling it do so indirectly — it arrives inside another dependency rather than in a line your developers wrote. That is why the exposure question for your business is rarely "did we install it" but "which of our builds, container images, and shipped artifacts contained it during the affected window."
Wiz found that roughly 1 in 10 cloud computing environments were affected by the debug and chalk incident within a two-hour span. Moses cited that number to describe compression of the timeline: "Going from there not being a vulnerability, to there being a vulnerability, to there being an exploited vulnerability … used to be days to weeks. Now it's hours to minutes."
For a software vendor or SaaS provider, that timeline creates supply chain liability that runs downstream. If a compromised version made it into a release your customers installed, you are the distribution channel, and your contracts likely carry notification clauses that trigger regardless of whether the malicious code executed in their environment.
The reporting obligations follow from that. Public companies face materiality assessments and disclosure decisions on a short clock; regulated firms face breach notification requirements that depend on whether customer data was accessible, not on whether you can prove it was taken. Both determinations require evidence your build systems may not retain.
That evidentiary gap is the expensive part. The typo-crypto payload stayed dormant until it received a specific numeric input, and the second stage differed depending on whether the host ran Windows, macOS or Linux. Dormant code means your network logs from the install window may show nothing at all — which makes it hard to demonstrate to a customer, regulator, or insurer that you were unaffected rather than simply not triggered.
Your development teams absorb the operational cost:
- Reconstructing lockfiles and dependency trees for every service built during the affected period, including transitive dependencies nobody documented
- Rebuilding and redeploying container images, then invalidating CI caches and internal package mirrors that may still serve the compromised version
- Rotating any credential, API key, or token that was present in a build environment or developer workstation during that window
- Answering customer security questionnaires and SBOM requests, which arrive in volume and take engineering time to answer accurately
Feature work stops while that happens. For a small engineering organization, a full dependency audit across active projects can consume a sprint or more, and the cost lands as delayed releases and missed commitments rather than as a line item on an incident invoice.
Attribution changes how you scope the response. A financially motivated crew monetizes access quickly, which means the incident has a visible endpoint. Anthony described the other mindset directly: "Let me get my package deployed in as many places as possible so that I can spring the trap later." When the actor is building long-term access, removing the package does not close the incident — it only removes one delivery path, and your investigation has to assume persistence and credential theft occurred and look for both.
State attribution also brings law enforcement engagement, more scrutiny of your own disclosure timeline, and questions from customers about whether your organization was specifically targeted or caught in the blast radius. Those conversations tend to reach procurement and renewal discussions.
The volume problem is separate and larger. TeamPCP injected malicious code into more than 1,000 packages over a four-month span this year, and attackers now register package names that AI coding assistants invent, so a developer following a suggestion installs malicious code without mistyping anything. Dependency review is becoming a recurring operational load, not an occasional incident.
Detection and Immediate Response for Compromised Dependencies
The first thing to do is separate declared dependencies from installed ones. Your package.json tells you what a developer asked for; your package-lock.json tells you what actually landed on the build agent. Run npm ls axios debug chalk core-js across every repository — including archived projects, internal tooling, and Lambda or container build contexts nobody has touched in a year — and pull the resolved version strings from lockfile history with git log -p package-lock.json.
Cross-reference those install timestamps against the three known windows: March 2025 for typo-crypto, September 2025 for debug and chalk, and the recent axios compromise. Registry advisories carry the exact affected version ranges; use those rather than assuming a "latest is fine" upgrade cleaned it up.
Two detection details from Amazon's analysis matter for how you search. The typo-crypto payload shipped as a file named core.js, dressed up to resemble the unrelated legitimate package core-js — so a filename match alone is not confirmation, and a mismatch between the file and its parent package is. The loader also stayed dormant until it received a specific numeric input, then fetched a second stage tailored to Windows, macOS, or Linux.
- Search build and endpoint telemetry for Node processes spawning shells,
curl, orpowershellduring dependency installation. - Flag outbound connections from CI runners to destinations outside a known egress allowlist during
npm install. - Grep source trees for encoded string blobs paired with a small decode routine — the group combined encoded text with a cipher specifically to slow both human and AI-assisted review, without heavy encryption that would stand out.
Because of the numeric trigger, quiet telemetry does not mean you were unaffected. Treat presence of an affected version as the finding, and callback evidence as escalation. In environments Capstone manages, SentinelOne flags exactly this behavior — a Node process spawning a child process and reaching out to unfamiliar infrastructure mid-build — on developer laptops and build agents across managed environments.
Within 24 to 48 hours, work forward from the build system rather than backward from the endpoint. Pull CI/CD job logs for the affected window and list every artifact, container image, and release produced from a compromised tree. Then answer the question your customers and auditors will ask: did any of it ship. Rebuild and republish affected artifacts from clean lockfiles, and rotate the secrets those runners held — npm publish tokens, cloud access keys, and code-signing credentials — since a downloader with arbitrary second-stage execution had the same access your build job did.
For the longer term, the controls that actually change outcomes are unglamorous. Use npm ci in every pipeline so builds are reproducible from a committed lockfile. Disable lifecycle scripts by default with --ignore-scripts and maintain a short allowlist of packages that genuinely need them. Proxy the public registry through an internal mirror that quarantines newly published versions for a set period, which converts a fast-moving compromise into a window your team can react inside.
Add one habit for AI-assisted development: verify that any package name an AI coding tool suggests actually exists and has real history before installing it. Attackers register the names those tools invent, so a developer can install malicious code without mistyping anything. Scale is the reason to formalize this now — TeamPCP injected malicious code into more than 1,000 packages over a four-month span this year.
Defending the npm Ecosystem Against State-Sponsored Package Injection
The highest-value change you can make is to stop your build agents from talking directly to the public npm registry. Route every install through a private proxy — Artifactory, Nexus, or an equivalent internal mirror — with a quarantine period on newly published versions and an approval step before a new or updated package becomes available to developers. A delay of even a few days on brand-new versions puts most of the public disclosure cycle ahead of your build, which is the difference between shipping a compromised artifact to customers and never fetching it.
Turn on signature verification next. Add npm audit signatures to your CI pipeline and configure the job to fail the build rather than warn, so an unsigned or provenance-less package stops the pipeline instead of generating a ticket nobody reads.
Be clear-eyed about what signing does and does not cover. Provenance attestation proves an artifact came from the account and workflow that claims to have published it — it does not help when the publish rights themselves were used as intended by someone who should not have them. Signing catches artifact tampering; it does not catch a legitimate release containing hidden code.
That is why allowlisting matters for anything you ship or run in production. For your critical projects, define an approved set of packages and exact versions, remove caret and tilde ranges from production manifests, and reject installs outside that set at the proxy. Allowlisting also closes the AI-suggestion problem Rick Anthony of AWS described, where attackers register package names that coding assistants sometimes invent — if the name is not on the list, the install fails whether a developer mistyped it or a model made it up.
Monitor registry metadata, not just package contents. The signals worth alerting on are:
- New maintainers added to a package you depend on
- Maintainer email or account changes on existing packages
- A version republished under the same tag
- Version bumps that arrive outside a project's normal release cadence
- Packages that suddenly gain publish activity after long dormancy
Because that compromise path starts with a maintainer or developer account rather than an exploit, identity telemetry is where it first becomes visible. Adlumin ITDR tracks authentication anomalies on developer and registry-linked accounts across managed environments, surfacing impossible-travel logins, new device enrollments, and MFA changes on the accounts that hold publish rights to your internal packages.
Detection alone was never going to hold here. The typo-crypto payload only activated on a specific numeric input and delivered different second-stage code depending on whether the host ran Windows, macOS, or Linux — behavior a static scan of the published tarball can easily miss. Prevention of execution is the control that works: run installs with --ignore-scripts where your toolchain permits it, execute builds in ephemeral containers that are destroyed afterward, and apply an egress allowlist so a build agent cannot reach an attacker-controlled host to pull stage two.
If you ship software to customers, generate an SBOM for every release and store it alongside the artifact, so you can answer "which of our shipped versions contained the affected dependency" in hours rather than days. Pair that with a written customer notification protocol — who drafts the advisory, who approves it, which contact list receives it — decided before you need it. Contractual disclosure windows do not pause while you build the process.
Why This Campaign Matters: State-Sponsored Supply Chain Targeting of Developer Tools
The pattern extends well beyond one actor. Two years after the xz-utils backdoor — where an attacker spent time earning maintainer trust before inserting code — Moses described that case as an early example of behavior now appearing at scale and tied to a nation-state. A separate group, TeamPCP, has injected malicious code into more than 1,000 packages over a four-month span this year.
What changed is where adversaries aim. Rick Anthony, senior engineering manager at AWS, framed the attacker's job as two problems: getting code into a package that will eventually execute inside an organization, and keeping it hidden from developers and security tooling. Neither problem is solved at your perimeter, because the code arrives through your build process with a valid publisher behind it.
Generative AI has made both problems easier to solve. Researchers said attackers now use it to produce code, documentation, and contribution histories that read as authentic — the credibility signals your developers rely on when choosing a dependency. Anthony also described attackers registering package names that AI coding assistants sometimes invent, so a developer following a suggestion installs malicious software without mistyping anything.
The strategic point for your leadership team is narrow: part of your security depends on the integrity of individual open-source maintainers and on registry infrastructure you do not operate or audit. That dependency existed before this campaign; what the Amazon research establishes is that a state-sponsored group treated it as a target worth a year of preparation, starting small deliberately.
The useful response is to give dependency provenance a permanent owner in your organization, with the same standing as patch management. It is a structural question about how you decide to trust third-party code, not a single incident to close out.