Supply Chain Security

Corepack Has No Official Website. Attackers Built One Anyway.

Dark cyberpunk illustration of two nearly identical glowing doorways side by side, one calm cyan light and one bleeding amber light back into a hidden server rack, representing a fake software download page impersonating a real one

Search for corepack today and the second organic result on DuckDuckGo, and a comparably strong ranking on Google, does not belong to the Node.js project. It belongs to corepack.org, a site built by unknown operators to look like an official download page. Clicking its download button drops an infostealer and enrolls the victim's machine in a bandwidth-sharing proxy network. Socket's threat research team disclosed the campaign on July 24, tracing exactly how a routine toolchain change became a live malware distribution channel.

The opening these attackers found is Node.js 25, which stopped bundling Corepack by default earlier this year. Developers who had relied on the bundled version and hit a missing command went looking for how to get it back, and a slice of that search traffic landed on a page with no real connection to the project. Socket's writeup describes the site itself as unmistakably synthetic: an AI-generated FAQ that confuses Yarn the package manager with yarn the craft material, a download button labeled "Downlaod," and no maintainer name anywhere on the page. None of that kept it from ranking, or from working.

This is a story about your build pipeline, not your firewall. If nobody on your team installs developer tooling by searching the web and clicking whatever result promises a download, this specific campaign does not reach you, though the pattern is worth remembering the next time a familiar tool changes how it ships. If your developers do occasionally reach for a browser to sort out a broken toolchain, and Node 25 dropping bundled Corepack is exactly the kind of change that produces that behavior, check your own environment against what follows before you file this away.

The stakes are higher on a developer workstation than on an average end-user laptop. A stolen SSH key is often the same key that authenticates to your source control, your build servers, and any host the developer manages directly. Browser-profile theft on a machine where a developer stays logged into GitHub, a cloud console, or a CI dashboard hands an attacker session cookies for all of it at once, without a single password ever changing hands. None of that requires the attacker to do anything clever after the initial infection. It only requires that the workstation was, as developer workstations usually are, more privileged than it looks.

How a placeholder page turned into a top search result

corepack.org is not new. A Node.js contributor flagged it in GitHub issue #803 back on March 9, 2026, at a point when the site was still a thin, low-quality page rather than a malware dropper. That issue asked, reasonably, whether the site could be updated with current command documentation, on the assumption that it was simply an outdated fan resource. Nobody at the Node.js project controls its content or ever did. Sometime after that report, the operators added an executable download path, and the domain's existing search ranking carried straight over to the new payload. A domain with a plausible name and months of indexed history is a more effective phishing asset than a domain registered yesterday, and this campaign is a clean demonstration of why.

What actually happens after the click

Socket's analysis found two separate delivery chains running off the same domain. The primary path routes through a fake VPN landing page and drops vpnsetup_d9gfqvs3dsic73fcvi90.exe. Running it installs an infostealer Socket calls OpenShield alongside a persistence component named Apprunner. Between the two, the malware reads browser-profile data and stored SSH keys, runs host and process discovery, executes arbitrary PowerShell and shell commands, and writes a run-key so it survives a reboot. It also enrolls the machine in a bandwidth-sharing scheme, commonly called proxyjacking, that resells the victim's internet connection to route someone else's traffic without the machine's owner seeing it happen.

A second click path on the same domain uses malvertising redirects to serve a disguised Opera GX installer instead, a separate deception aimed at whichever visitors do not follow the first funnel. Either way, the visitor believed they were downloading a legitimate developer tool, and instead got software chosen to stay quiet: an infostealer that does not announce itself, and a proxy client that looks like background network usage on a monitoring dashboard that is not specifically looking for it.

The proxyjacking piece deserves its own line, because it is easy to underrate next to credential theft. Operators of these bandwidth-sharing networks pay a small residual to whoever hosts the client, then resell the exit IP and connection to third parties running scraping, ad-fraud, or account-abuse traffic through it. Your office network, if a developer machine on it is compromised, becomes an exit node other people's traffic is laundered through. That traffic can attach your organization's IP reputation to activity nobody authorized and nobody sees, right up until an abuse report or a blocked outbound connection makes it visible.

The gap: Corepack never had an official download page to begin with

Understanding why this worked requires knowing how Corepack is actually supposed to reach a machine. Per the project's own repository, Corepack shipped bundled with Node.js from version 14.19.0 up to, but not including, 25.0.0; on any of those versions, the command is already present and corepack enable is the entire installation step. Node.js 25 removed that bundling, and the documented fallback is npm install -g corepack, using the very package manager Corepack exists to wrap. At no point in that history has there been a standalone Windows installer, a marketing site, or a download button. Corepack.org had no legitimate reason to exist, and the absence of any real content behind it was the actual warning sign developers walked past.

Generalize the lesson past this one tool. Any project that changes its default distribution method, drops a bundled component, deprecates an old install path, or moves its documentation, opens a window where developers go looking for an install method and a search engine, not the project itself, decides what they find. The durable habit is a boring one: pull install instructions from the project's repository or README, not from whatever ranks first when a familiar command stops working.

This campaign is also a different shape than the typosquat most teams train against. A typosquat relies on a misspelled package name slipping past a tired developer typing fast. Ranking an aged, plausible domain ahead of a project's own GitHub page relies on nothing being misspelled at all; the developer typed the right word into a search engine and trusted whatever came back first. Package-registry scanning and dependency-confusion tooling do not catch this variant, because nothing about it touches package.json or a lockfile. It lives entirely in the browser, before a single line of project code is involved. If your team already pins its package manager version with the packageManager field Corepack itself reads from package.json, that habit is worth extending to the tool that reads it: treat any manual, browser-driven install of core tooling as an event worth a second look, not a routine chore.

Checking your own environment

You do not need Socket's full indicator list to get a fast answer. Two checks cover most of what matters here: whether either malware component ever ran, and whether your own install path for Corepack, or any similarly recently-unbundled tool, actually came from the project rather than a search result.

# PowerShell -- look for the infostealer / persistence components and their
# staged filename on a Windows endpoint
Get-Process | Where-Object { $_.ProcessName -match 'OpenShield|Apprunner' }
Get-CimInstance Win32_StartupCommand |
    Where-Object { $_.Command -match 'vpnsetup_|OpenShield|Apprunner' }
Get-ItemProperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Run' |
    Get-Member -MemberType NoteProperty |
    Where-Object { $_.Name -notmatch '^PS' }

# Bash -- confirm the only sanctioned install path for Corepack itself
node -v                       # 25.x and newer ships without Corepack bundled
npm view corepack version     # confirm you are pulling from the real registry
npm install -g corepack       # the only supported manual install; never a .exe

If either check turns up something

  • Treat the host as compromised, not merely inconvenienced by adware. OpenShield reads SSH keys and browser data, so assume both are exposed until proven otherwise.
  • Rotate SSH keys and any credentials stored in the affected browser profile, and check for logins from unfamiliar IPs on any account those keys or cookies could reach.
  • Block outbound traffic to the domains in Socket's published indicator list at your DNS or proxy layer; several of the secondary redirect domains stayed live even after corepack.org itself went dark.
  • Check egress monitoring or EDR alerts for sustained, low-and-slow outbound connections consistent with proxyjacking, a quieter signature than the infostealer's own activity.

Route toolchain installs through the project, not a search result

There is no patch here, so the fix is a habit change. When a developer needs to install or reinstall a piece of tooling, the instructions come from that project's own repository or documentation, not from whichever page a search engine ranks first that day. Put that sentence in onboarding material and in whatever internal wiki covers your build pipeline, because the next tool to quietly drop a bundled dependency will create the same opening this one did. Reporting following the disclosure confirms the original domain now returns a 404, but the operators left several secondary redirect domains live, and nothing stops the same crew, or a copycat, from registering the next plausible tool name the moment another project changes how it ships.

Primary sources: Socket's original disclosure and indicator list, the nodejs/corepack GitHub issue that first flagged the domain, the Corepack project repository documenting the real distribution model, and iTnews's follow-up reporting on the takedown.

We review developer tooling and build-pipeline hygiene as part of our application and network security assessments, including exactly this kind of exposure: a tool your team trusts because it has always been there, sourced a different way after an upstream change nobody flagged internally.

Need help auditing where your team's tooling actually comes from?

We review software supply chain hygiene as part of our application and network security assessments, including how developer tooling gets sourced, installed, and verified. Book a session to talk through your environment.