On Apr. 22, a malicious version of Bitwarden’s command-line interface appeared on npm under the official package name @bitwarden/[email protected]. For 93 minutes, anyone who pulled the CLI through npm received a backdoored substitute for the legitimate tool.
Bitwarden detected the compromise, removed the package, and issued a statement saying it found no evidence that attackers accessed end-user vault data or compromised production systems.
Security research firm JFrog analyzed the malicious payload and found it had no particular interest in Bitwarden vaults. It targeted GitHub tokens, npm tokens, SSH keys, shell history, AWS credentials, GCP credentials, Azure credentials, GitHub Actions secrets, and AI tooling configuration files.
These are credentials that govern how teams build, deploy, and reach their infrastructure.
Targeted secret / data typeWhere it usually livesWhy it matters operationallyGitHub tokensDeveloper laptops, local config, CI environmentsCan enable repo access, workflow abuse, secret listing, and lateral movement through automationnpm tokensLocal config, release environmentsCan be used to publish malicious packages or alter release flowsSSH keysDeveloper machines, build hostsCan open access to servers, internal repos, and infrastructureShell historyLocal machinesCan reveal pasted secrets, commands, internal hostnames, and workflow detailsAWS credentialsLocal config files, environment variables, CI secretsCan expose cloud workloads, storage, and deployment systemsGCP credentialsLocal config files, environment variables, CI secretsCan expose cloud projects, services, and automation pipelinesAzure credentialsLocal config files, environment variables, CI secretsCan expose cloud infrastructure, identity systems, and deployment pathsGitHub Actions secretsCI/CD environmentsCan give access to automation, build outputs, deployments, and downstream secretsAI tooling / config filesProject directories, local dev environmentsCan expose API keys, internal endpoints, model settings, and related credentials
Bitwarden serves over 50,000 businesses and 10 million users, and its own documentation describes the CLI as a “powerful, fully-featured” way to access and manage the vault, including in automated workflows that authenticate using environment variables.
Bitwarden lists npm as the simplest and preferred installation method for users already comfortable with the registry. That combination of automation use, developer-machine installation, and official npm distribution places the CLI exactly where high-value infrastructure secrets tend to live.
JFrog’s analysis shows the malicious package rewired both the preinstall hook and the bw binary entrypoint to a loader that fetched the Bun runtime and launched an obfuscated payload. The compromise is fired at install time and at runtime.
An organization could run the backdoored CLI without touching any stored passwords while the malware systematically collected the credentials governing its CI pipelines, cloud accounts, and deployment automation.
Security firm Socket says the attack appears to have exploited a compromised GitHub Action in Bitwarden’s CI/CD pipeline, consistent with a pattern Checkmarx researchers have been tracking.
Bitwarden confirmed that the incident is connected to the broader Checkmarx supply chain campaign.
The trust bottleneck
Npm built its trusted publishing model to address exactly this class of risk.
By replacing long-lived npm publish tokens with OIDC-based CI/CD authentication, the system removes one of the most common paths attackers use to hijack registry releases, and npm recommends trusted publishing and treats it as a meaningful step forward.
The harder surface is the release logic itself, such as the workflows and actions that invoke the publish step. Npm’s own documentation recommends controls beyond OIDC, such as deployment environments with manual approval requirements, tag protection rules, and branch restrictions.
Layer in the trust chainWhat it is supposed to guaranteeWhat can still go wrongSource repositoryThe intended codebase exists in the expected repoAttackers may never need to alter the main codebase directlyCI/CD workflowAutomates build and release from the repoIf compromised, it can produce and publish a malicious artifactGitHub Actions / release logicExecutes the steps that build and publish softwareA poisoned action or abused workflow can turn a legitimate release path maliciousOIDC trusted publishingReplaces long-lived registry tokens with short-lived identity-based authIt proves an authorized workflow published the package, not that the workflow itself was safenpm official package routeDistributes software under the expected package nameUsers may still receive malware if the official publish path is compromisedDeveloper machine / CI runnerConsumes the official packageInstall-time or runtime malware can harvest local, cloud, and automation secrets
GitHub’s environment settings let organizations require reviewers’ sign-off before a workflow can deploy. The SLSA framework goes further by asking consumers to verify that provenance matches expected parameters, such as the correct repository, branch, tag, workflow, and build configuration.
The Bitwarden incident shows that the harder problem sits at the workflow layer. If an attacker can exploit the release workflow itself, the “official” badge still accompanies the malicious package.
Trusted publishing moves the trust burden upward to the integrity of the workflows and actions that invoke it, a layer that organizations have largely left unexamined.
One token to many doors
For developer and infrastructure teams, a compromised release workflow exposes CI pipelines, automation infrastructure, and the credentials that govern them.
JFrog’s analysis shows that once the malware obtained a GitHub token, it could validate the token, enumerate writable repositories, list GitHub Actions secrets, create a branch, commit a workflow, wait for it to execute, download the resulting artifacts, and then clean up.
Obtaining the token creates an automated chain that transforms a single stolen credential into persistent access across an organization’s automation infrastructure.
A developer’s laptop that installs a poisoned official package becomes a bridge from the host’s local credential store to GitHub access to whatever that GitHub token can reach.
The Bybit incident is a close structural analogy. A compromised developer workstation let attackers poison a trusted upstream interface, which then reached the victim’s operational process.
The difference is that Bybit involved a tampered Safe web UI, while Bitwarden involved a tampered official npm package.
In crypto, fintech, or custody environments, that path can run from a credential store to release signers, cloud access, and deployment systems without ever touching a vault entry.
Within 60 days, Checkmarx disclosed compromised GitHub Actions workflows and OpenVSX plugins, while the Cloud Security Alliance warned that the TeamPCP campaign was actively compromising open-source projects and CI/CD automation components.
JFrog documented how a compromised Trivy GitHub Action exfiltrated LiteLLM’s publish token and enabled malicious PyPI releases, and Axios disclosed that two malicious npm versions circulated for roughly three hours through a compromised maintainer account.
Sonatype counted over 454,600 new malicious packages in 2025 alone, bringing the cumulative total to more than 1.2 million. Bitwarden joins a chain of incidents that confirms release workflows and package registries as the primary attack surface.
Date / periodIncidentCompromised trust pointWhy it mattersMar. 23, 2026Checkmarx disclosed compromised GitHub Actions workflows and OpenVSX pluginsGitHub Actions workflows, developer tooling distributionShows attackers targeting upstream automation and trusted tooling channelsWithin the same campaign windowTrivy / LiteLLM chain documented by JFrogCompromised GitHub Action leading to token theft and malicious PyPI releasesDemonstrates how one poisoned automation component can cascade into package publication abuseMar. 31, 2026Axios malicious npm versionsCompromised maintainer accountShows official package names can become attack vectors through account-level compromiseApr. 22, 2026Bitwarden CLI malicious npm releaseOfficial npm distribution path for a security toolShows a trusted package can expose infrastructure secrets without touching vault contents2025 totalSonatype malware countOpen-source package ecosystem broadlyIndicates the scale of malicious-package activity and why registry trust is now a strategic risk
The precise root cause is not yet public, as Bitwarden has confirmed a connection to the Checkmarx campaign but has not published a detailed breakdown of how the attacker obtained access to the release pipeline.
The outcomes of the attack
The strongest outcome for defenders is that this incident accelerates a redefinition of what “official” means.
Today, trusted publishing attaches provenance data to each released package, thereby confirming the publisher’s identity in the registry. SLSA explicitly documents a higher standard for verifiers to check if provenance matches the expected repository, branch, workflow, and build parameters.
If that standard becomes default consumer behavior, “official” starts to mean “built by the right workflow under the right constraints,” and an attacker who compromises an action but cannot satisfy every provenance constraint produces a package that automated consumers reject before it lands.
The more plausible near-term path runs in the opposite direction. Attackers have demonstrated across at least 4 incidents in 60 days that release workflows, action dependencies, and maintainer-adjacent credentials yields high-value results with relatively low friction.
Each successive incident adds another documented technique to a public playbook of action compromise, token theft from CI output, maintainer account hijack, and trusted-publish-path abuse.
Unless provenance verification becomes the default consumer behavior rather than an optional policy layer, official package names will command more trust than their release processes can justify.




