← Back to the cybersecurity blog

jscrambler on npm: the infostealer that now hunts your AI tooling secrets

By Adrián González · CEO · Published: 26 July 2026 · Updated: 26 July 2026
jscrambler npm infostealer stealing AI tooling credentials

On 11 July 2026, someone borrowed jscrambler's publishing account on npm and pushed a trojanised release of a tool that is, of all things, sold to protect code. Version 8.14.0 looked like a routine update to a package with roughly 15,800 weekly downloads. It actually carried a credential stealer written in Rust that ran the moment the package was installed. Socket flagged it six minutes after publication.

What sets this apart from the long list of npm compromises in 2026 is not the vector —a stolen publishing credential, again— but the attacker's shopping list. Alongside the usual cloud keys and crypto wallets, the stealer deliberately hunted for the configuration files of Cursor, Windsurf, Claude Desktop and MCP servers: the place where development teams now keep the keys to their AI assistants. The software supply chain and AI security meet inside the same binary.

What happened, in order

The entry point was not a vulnerability. jscrambler itself confirmed that the attacker published the packages using a compromised npm publishing credential, according to SecurityWeek. It is the same underlying story we have watched repeat all year: you do not need an exploit when a key nobody revoked will do.

The first malicious release, 8.14.0, appeared and Socket caught it within six minutes. Over the next three hours the same actor pushed 8.16.0, 8.17.0, 8.18.0 and 8.20.0. Clean releases were mixed in, such as 8.15.0, and 8.22.0 is the good version to move to, as The Hacker News reports. That blend of clean and malicious releases is deliberate: it complicates triage and stretches the window of exposure.

The damage did not travel in the jscrambler code a reviewer would open, but in a native binary the package dropped and executed, with a separate build for Windows, macOS and Linux. It is the same family of tactic we analysed in the easy-day-js attack on the Mastra ecosystem, except the end goal here is far more ambitious.

The anatomy: from preinstall to import-time execution

The early releases used an npm preinstall hook, the instruction that runs automatically when a package is installed. Such hooks exist for legitimate reasons —compiling native modules, for one— but they are also a code-execution doorway that many organisations do not watch.

From 8.18.0 the attacker changed tactics, and that shift is the interesting part. Instead of the install hook, the same loader was injected as a self-executing function at the top of the module's entry files. Conceptually the effect matters: the code stops firing at install time and starts firing when the package is imported or its command-line tool is run.

That move slips past scanners that only inspect install scripts and survives even when a package is installed with those scripts disabled. The habit of installing dependencies “without running scripts” gives a false sense of safety once the malicious code has moved into the module's own entry point. This is not an implementation footnote; it is a lesson about where we place our monitoring.

What the stealer was after

The Rust binary sweeps the developer's machine for secrets and ships them over TLS to a collection server. The target list, documented by Socket and CSO Online, maps out what is worth money on a development laptop today:

  • Cloud credentials from AWS, Azure and Google Cloud, including the metadata endpoints that CI runners rely on.
  • Cryptocurrency wallets and seed phrases from MetaMask, Phantom and Exodus.
  • The Bitwarden password manager vault and browser profiles from Chrome, Brave, Edge and Chromium.
  • Discord, Slack, Telegram and Steam sessions, along with operating-system keyrings.
  • Configuration files for AI coding tools: Claude Desktop, Cursor, Windsurf, VS Code, Zed and MCP server configurations, which typically hold API keys and connection details.

To avoid depending on a single run, the stealer installed persistence through Windows Task Scheduler and macOS LaunchAgents. This is the behaviour of a mature infostealer, not a proof of concept.

Why AI tooling has become the prize

Until recently, an infostealer that reached a development team went after the predictable: cloud tokens, SSH keys, git credentials. What is new here is that the attacker treats AI assistant configuration as a first-class asset. And it makes sense: a Claude Desktop, Cursor or MCP server file can hold API keys with access to models, repositories, ticketing systems and, increasingly, actions against infrastructure itself.

Those keys are rarely rotated, almost never carry a second factor, and often grant more permission than they need. To an attacker they are poorly governed non-human identities with a direct line into the development pipeline. If your organisation already wires agents into internal systems, it is worth revisiting your production controls for MCP and enterprise AI agents with this threat in mind.

Why the usual controls fall short

In many organisations the developer laptop is still an implicit trust zone. It installs dependencies daily, runs third-party code and holds production credentials. Three assumptions fail here at once: that reviewing the package code is enough, when the harm sat in a binary and in the module entry point; that disabling install scripts protects you, when execution moved to import; and that traditional antivirus will stop a fresh binary compiled for three platforms.

Dependency scanning that only reads manifests and install scripts does not reach far enough either. You need to watch runtime behaviour, not just declared content. Development-chain security is decided as much by DevSecOps practices as by endpoint telemetry.

Detection: what to actually watch

Framed defensively, the incident leaves clear signals that a threat hunting or response team can turn into concrete detections:

  • A Node.js or npm process launching a freshly written native binary from a temporary directory or inside node_modules is an anomaly the EDR catches through the parent-child relationship.
  • Outbound TLS connections from developer machines or CI runners to domains with no reputation, right after a dependency install or a module import.
  • Creation of scheduled tasks on Windows or LaunchAgents on macOS by development processes: a persistence pattern that should never appear in that context.
  • Reads of browser, password-manager and AI-tool configuration files by processes that are not those applications.
  • Requests to the instance metadata endpoint (169.254.169.254) from a container or CI runner that does not normally make them.

For organisations with operational threat intelligence, the indicators researchers published —affected versions, binary hashes and collection domains— allow a retroactive hunt across historical telemetry, not just a forward block.

Practical defence

  • Pin dependencies with lockfiles and review every version change; avoid loose ranges that resolve to the latest release with no human in the loop.
  • Install in two stages: resolve and audit before allowing install-time code to run, rather than trusting a flag that disables scripts.
  • Isolate continuous integration with ephemeral runners, no long-lived credentials and egress filtering to known destinations.
  • Replace static keys with short-lived credentials and federation (OIDC) wherever you can, so a stolen secret expires on its own.
  • Treat AI-tool and MCP server configuration as secrets: out of version control, rotated regularly and scoped to least privilege.

And if you suspect exposure, the response is the familiar one, only faster: revoke and rotate any credentials that might have lived on those machines, review recent cloud access and trigger incident response if there are signs of misuse.

What compliance expects

For an organisation under NIS2 or DORA, this is not a technical curiosity. Both frameworks put third-party and ICT supply-chain risk at the centre of security management: an inventory of suppliers and components, vulnerability monitoring and a demonstrable ability to react.

An npm package on a build server is, for these purposes, another supplier. Third-party risk management stops being an annual questionnaire and starts including what your people install every day. The difference between a scare and a reportable breach usually comes down to whether the organisation knew which dependencies it ran, and with which credentials.

At a glance

The real message of jscrambler is not “watch out for this package”. It is that your organisation's boundary no longer sits at the firewall or the laptop, but in every dependency your people install and every key your AI assistants hold with nobody watching. That the target was a tool built to protect code only sharpens the irony: securing the development chain has stopped being a developer-only task and become part of the organisation's threat model.

This article describes the incident and its detection and defence measures at a conceptual level, for awareness purposes. It does not include full indicators or exploitation instructions; before acting in your own environment, always cross-check with the sources cited and with your own security team.

Frequently asked questions

What happened with jscrambler on npm?

On 11 July 2026 an attacker used a compromised publishing credential to push trojanised versions of the jscrambler package to npm. Those versions ran a Rust infostealer that harvested credentials from the developer's machine. Socket detected the first malicious release, 8.14.0, six minutes after it was published.

Which versions are affected and which is safe?

The known malicious versions are 8.14.0, 8.16.0, 8.17.0, 8.18.0 and 8.20.0, published within a window of about three hours. Clean releases were interleaved, such as 8.15.0, and the safe version to update to is 8.22.0. Check your lockfile and your build servers in case they resolved to a malicious version during the attack window.

What information did the stealer target?

The binary looked for cloud credentials from AWS, Azure and Google Cloud (including the metadata endpoints CI runners use), cryptocurrency wallets and seed phrases, the Bitwarden vault, browser profiles, Discord, Slack, Telegram and Steam sessions, operating-system keyrings and the configuration files of AI tools such as Claude Desktop, Cursor, Windsurf, VS Code, Zed and MCP servers.

Why did installing with scripts disabled not protect me?

Because from version 8.18.0 the malicious code no longer depended on the install hook. It was injected as a self-executing function in the module's entry point, so it fired when the package was imported or its command was run, not when it was installed. Disabling install scripts does not stop that execution path.

How do I know if my machines are compromised?

Look through telemetry for Node or npm processes launching native binaries, for outbound connections to low-reputation domains after a dependency install, and for scheduled tasks or LaunchAgents created by development processes. Cross-reference the indicators researchers published (versions, hashes and collection domains) with your EDR history, and revoke any credential that might have been exposed.

Why is targeting Cursor, Windsurf or MCP so serious?

Because those assistants' configuration files typically hold API keys with access to models, repositories and, increasingly, actions against infrastructure. They are non-human identities that are rarely rotated and almost never carry a second factor, so a single exposure can open several systems at once.

How does this relate to NIS2 and DORA?

NIS2 and DORA place third-party and ICT supply-chain risk at the centre of security management. An npm package on a build server is, in practice, a supplier. Both frameworks expect the organisation to keep an inventory of components, monitor vulnerabilities and maintain a demonstrable ability to react, which is exactly what this incident tests.