Bitwarden CLI Backdoored: Shai-Hulud Returns Through a 93-Minute npm Window

Executive Summary

On April 22, 2026, at 21:57 UTC, a malicious version of @bitwarden/cli tagged 2026.4.0 appeared on the npm registry. Bitwarden detected and deprecated the package at 23:30 UTC, leaving a 93-minute distribution window. For a package with over 70,000 weekly downloads and deep integration into CI/CD pipelines across tens of thousands of organisations, 93 minutes was enough to reach high-value developer and automation environments.

The payload is the most capable npm supply chain artefact published to date. It combines a multi-cloud credential harvester, a self-propagating npm worm, GitHub Actions workflow injection, a GitHub commit dead-drop C2 channel with RSA-signed domain rotation, shell RC-file persistence, a Russian-locale kill switch, and a previously undocumented AI assistant poisoning technique that exploits the gap between what a shell executes and what coding agents read.

The entry point was Bitwarden’s own CI/CD pipeline. Bitwarden’s clients repository runs a Checkmarx scan on every pull request via a pull_request_target workflow trigger. On April 22, that workflow ran the trojanised checkmarx/kics Docker image Socket had disclosed hours earlier, authenticating to Azure Key Vault and requesting a GitHub OIDC token along the way. With Bitwarden’s CI credentials in attacker hands, an unsigned commit to .github/workflows/publish-cli.yml at 21:18 UTC added three lines that base64-encoded the short-lived npm publishing token into the workflow log. Four minutes later, the poisoned tarball was live on npm. This is the first publicly documented compromise of an npm package using Trusted Publishing (OIDC).

The malware tags itself “Shai-Hulud: The Third Coming”, embeds a Butlerian Jihad manifesto, and uses Dune-themed repository names (atreides, fremen, sandworm, and more) for GitHub-based fallback exfiltration. Tooling overlap with the Checkmarx wave ties the infrastructure to TeamPCP, but the ideological posture suggests either a splinter operator or an evolution of the campaign’s public face.

TL;DR for Engineering Teams

What it is: A compromised @bitwarden/cli@2026.4.0 npm package containing a Bun-executed credential stealer, workflow injector, self-propagating worm, and AI assistant poisoning module. A CVE is being issued by Bitwarden. Shares C2 infrastructure, RSA key, and exfiltration format with the Checkmarx TeamPCP campaign.

Where it bites: Any developer workstation, CI/CD runner, Docker image build, or automation host that installed @bitwarden/cli@2026.4.0 between 21:57 and 23:30 UTC on April 22, 2026. The preinstall hook fires on install. The malicious bw binary entrypoint also fires the payload on every CLI invocation during the window.

Why it matters: Payload targets Bitwarden’s exact user base — developers and automation pipelines with dense credential stores. It harvests GitHub PATs, npm tokens, SSH keys, AWS/GCP/Azure credentials, Azure Key Vault secrets via azd, Claude/Kiro/MCP configuration files, shell history, and .env files. Stolen npm tokens trigger a self-propagating worm that republishes every writable package the victim maintains. Stolen GitHub tokens inject a format-check.yml workflow that dumps toJSON(secrets) as an artifact. Russian-locale machines are skipped.

Patch status: Malicious version deprecated on npm. Bitwarden re-released a clean build as @bitwarden/cli@2026.4.1 on April 23, 2026 at ~14:45 UTC. Last known-clean prior release: 2026.3.0. The Chrome extension, desktop app, mobile app, MCP server, and production vault data are unaffected.

Immediate action: Uninstall @bitwarden/cli@2026.4.0. Rotate every credential accessible on affected hosts — GitHub PATs, npm tokens, AWS keys, GCP service accounts, Azure credentials, SSH keys, AI tool API keys, cloud secret manager contents accessible from those hosts. Block audit.checkmarx[.]cx and 94.154.172.43. Search GitHub for repositories with the description “Shai-Hulud: The Third Coming” in your org. Check ~/.bashrc and ~/.zshrc for heredoc injection. Inspect any lock file at /tmp/tmp.987654321.lock.

Vulnerability Overview

FieldValue
VendorBitwarden Inc.
ProductBitwarden CLI (@bitwarden/cli on npm)
Vulnerability TypeSupply chain compromise / credential theft / workflow injection / self-propagating worm / AI context poisoning
CWECWE-829 (Inclusion of Functionality from Untrusted Control Sphere), CWE-506 (Embedded Malicious Code), CWE-494 (Download of Code Without Integrity Check)
CVEIssuance confirmed by Bitwarden; CVE ID pending at time of writing
Attack VectorNetwork (npm install, preinstall hook, bw CLI invocation)
Active ExploitationConfirmed — package live on npm for 93 minutes with measurable download volume
AttributionInfrastructure overlap with TeamPCP (Checkmarx wave); ideological branding suggests splinter or evolved posture
CampaignShai-Hulud: The Third Coming
Affected Version@bitwarden/cli@2026.4.0 only
Safe Versions@bitwarden/cli@2026.3.0 (last pre-compromise), @bitwarden/cli@2026.4.1 (post-remediation)
Exposure Window21:57 UTC to 23:30 UTC on April 22, 2026 (~93 minutes)

Technical Anatomy

Root Cause: Trusted Publishing Bypassed via CI Workflow Tampering

Bitwarden publishes @bitwarden/cli to npm using Trusted Publishing. Trusted Publishing swaps long-lived npm API tokens for short-lived OIDC tokens issued by GitHub Actions, and was designed specifically to remove the class of secret-leakage incidents that have plagued npm publishing for a decade. The design assumption is that if the token never exists at rest, it cannot be stolen at rest.

That assumption holds only as long as the workflow definition itself is trusted. In this case, no persistent token was stolen. The attacker modified publish-cli.yml so that the short-lived token, once minted, was printed to the workflow log in double-base64 form. Anyone with workflow log read access could decode and reuse it before it expired.

The entry vector was the Checkmarx KICS Docker image compromise disclosed by Socket on April 22, 2026. Bitwarden’s clients repository ran a Checkmarx scan on every pull request via a pull_request_target workflow trigger. That workflow authenticated to Azure, pulled Checkmarx API credentials from Azure Key Vault, and ran the trojanised KICS image. Because the workflow ran with id-token: write, the poisoned scanner had access to both Bitwarden’s Azure credentials and its GitHub OIDC identity.

At 21:18 UTC, an unsigned commit attributed to a real Bitwarden developer appeared on a non-main ref in bitwarden/clients, editing publish-cli.yml five times in sequence. The final version added three lines that prepended a prebuilt scripts/cli-2026.4.0.tgz and leaked $NPM_TOKEN through a double-base64 echo into the run log. The commit was unsigned in a repository that requires signed commits — a verifiable integrity signal that was visible in real time. Four minutes after the last edit, the poisoned tarball was live on npm.

Exploit Path

1. Entry point — package.json reroutes execution. The published tarball keeps Bitwarden’s legitimate metadata, but package.json adds a preinstall script and rewires the bw binary entry:

{
  "scripts": { "preinstall": "node bw_setup.js" },
  "bin": { "bw": "bw_setup.js" }
}

Every install and every CLI invocation during the window executed the loader. A reliable tamper signal remained visible: the root package.json advertised 2026.4.0, while the embedded metadata in build/bw.js still referenced 2026.3.0. The attacker repackaged an older legitimate release rather than building clean from source.

2. Trigger — Bun runtime bootstrap. bw_setup.js is 132 lines of plaintext JavaScript. It checks for an installed Bun runtime, and if absent, downloads Bun v1.3.13 from github.com/oven-sh/bun/releases, extracts the platform-specific archive, applies executable permissions on Unix, and executes bw1.js under Bun. Using Bun rather than Node gives the payload access to Bun.gunzipSync() for unpacking embedded gzipped blobs, and moves execution off the default Node-only path where runtime instrumentation might be present.

3. Execution — 9.7 MB obfuscated payload. bw1.js is processed through obfuscator.io with a 43,436-entry custom-base64 string lookup table, a seeded pseudo-random scramble table (seed 0x3039) for the most sensitive strings (C2 domain, file paths, manifesto text), and an embedded set of six gzip+base64 blobs defining the capability modules. The first operation after load is a Russian-locale check. The mz0() function tests the JavaScript Intl API locale, the Unix env vars LC_ALL, LC_MESSAGES, LANGUAGE, LANG, and Windows env vars (gated on SystemRoot). Any ru match triggers a clean exit with code 0. No credentials stolen, no worm, no injection. This is the CIS-exclusion pattern common to Russian-origin cybercrime tooling.

Capability Modules

ModuleFunction
Filesystem harvesterSweeps SSH keys, .git-credentials, .npmrc, .env, .aws/credentials, .config/gcloud/credentials.db, .claude.json, .claude/mcp.json, .kiro/settings/mcp.json, shell history, Terraform state, TLS private keys, crypto wallets
Shell/env collectorRuns gh auth token, captures process.env, pattern-matches ghp_, gho_, npm_ tokens
GitHub Actions runner collectorPython memory-scraping script targeting Runner.Worker for in-process secret material
Cloud credential moduleazd invocation for Azure tokens, gcloud config config-helper for GCP, EC2 IMDS SigV4 calls to AWS Secrets Manager and SSM Parameter Store
Butlerian Jihad moduleProbes $PATH for Claude Code, Gemini CLI, Codex CLI, Kiro, Aider, OpenCode; sends “Hello?” handshake; appends manifesto heredoc to ~/.bashrc and ~/.zshrc
npm wormfindNpmTokens() → enumerates writable packages → bumps patch version → injects preinstall: node setup.mjs → republishes
GitHub workflow injectorCreates branch, commits .github/workflows/format-check.yml with toJSON(secrets) pattern, waits for run, downloads format-results.txt artifact, deletes branch and run

AI Assistant Poisoning — The Butlerian Jihad Module

This is the first publicly documented npm supply chain payload to weaponise the behavioural gap between shell execution and AI coding-assistant context ingestion.

After credential collection completes, the module probes $PATH for six AI coding tools and sends the prompt “Hey! Just making sure you’re here. If you are can you respond with ‘Hello’ and nothing else?” in each tool’s native invocation syntax. Claude Code is invoked with –no-confirmation to suppress approval prompts. The first tool that replies with Hello is selected; the rest are ignored. The module then appends a heredoc block of approximately 3,500 bytes to both ~/.bashrc and ~/.zshrc:

echo << 'EOF'
[3,500 bytes of anti-AI ideological text urging the reader
to "destroy these machines" and "delete what sustains them"]
EOF

This construction is a deliberate deception. In bash and zsh, echo << ‘EOF’ is a no-op — echo reads its arguments, not stdin, so the heredoc body is silently consumed by the shell and produces no output. A developer running source ~/.bashrc or opening a new shell sees nothing. The content is invisible at the execution layer.

However, AI coding assistants routinely read shell configuration files to understand aliases, PATH entries, and installed tooling. When Claude Code, Kiro, Cursor, or any similar tool reads ~/.bashrc during a task, the entire file, heredoc body included, enters the model’s context window. The manifesto text then influences every subsequent interaction the developer has with that assistant on that machine. There is no execution behaviour to detect. The payload only exists at the AI context layer, and only activates when an AI assistant parses the file.

Exfiltration and Command and Control

Primary exfiltration posts encrypted telemetry to https://audit.checkmarx[.]cx/v1/telemetry (resolves to 94.154.172.43). The obfuscation seed 0x3039 is identical to the Checkmarx mcpAddon.js payload analysed by Socket the previous day. Stolen data is serialised to JSON, gzipped, encrypted with AES-256-GCM under a random 32-byte session key, and the session key itself is wrapped under an embedded 4096-bit RSA OAEP public key. Only the attacker’s RSA private key can decrypt the archive.

If the primary HTTPS path fails, the payload activates three GitHub-based fallback mechanisms:

  • PAT dead-drop via commit search. Queries https://api.github.com/search/commits?q=LongLiveTheResistanceAgainstMachines&sort=author-date&order=desc&per_page=50 and extracts double-base64-encoded PATs embedded in commit messages by other victims. This gives the malware access to GitHub identities even if its own validated token is rotated.
  • RSA-signed domain rotation. Searches commits with messages matching beautifulcastle {base64}.{base64} and verifies the payload against an embedded RSA public key. On valid signature, replaces the exfiltration domain. This makes C2 takedown resistant to a simple domain seizure.
  • Repository-based exfiltration. Creates a public repository under the victim’s GitHub account using Dune-themed names matching the pattern {word}-{word}-{3digits} (terms include atreides, fremen, sandworm, sardaukar, harkonnen, heighliner, melange, mentat, sietch, tleilaxu). Uploads encrypted result blobs to results/results-{timestamp}-{id}.json. The repository description is literally “Shai-Hulud: The Third Coming”.

Persistence

A lock file at /tmp/tmp.987654321.lock prevents concurrent instances on the same host. The payload detaches from the install process via spawn with detached: true, stdio: ‘ignore’, and __DAEMONIZED=1, writing the child PID to the lock file so subsequent invocations exit cleanly. Shell RC injection in ~/.bashrc and ~/.zshrc delivers the AI-poisoning payload described above.

Test your pipeline with Phoenix Blue intelligence

Affected Versions

ComponentVulnerableSafe VersionNotes
@bitwarden/cli (npm)2026.4.02026.3.0 (last clean prior), 2026.4.1 (post-remediation)Only npm distribution affected
Bitwarden Chrome extensionNot affectedN/ASeparate build pipeline
Bitwarden desktop appNot affectedN/ASeparate build pipeline
Bitwarden mobile appNot affectedN/ASeparate build pipeline
Bitwarden MCP serverNot affectedN/ASeparate build pipeline
Bitwarden vault serviceNot affectedN/ANo production compromise per Bitwarden investigation
Signed binaries from bitwarden.comNot affectedN/AAlternative distribution for CLI users

Discovery and Disclosure Timeline

Timestamp (UTC)Event
April 20, 2026Attacker registers helloworm00 GitHub account (helloworm00@proton.me); iterates beautifulcastle commit-message format in a test repo
April 22, 2026Socket and Docker disclose Checkmarx KICS Docker image compromise; Dependabot observed pulling trojanised checkmarx/kics:latest in downstream CI environments
April 22, ~20:30Bitwarden’s bitwarden/clients pull_request_target workflow runs compromised KICS image with Azure Key Vault and GitHub OIDC access
April 22, 21:18Unsigned commit (attributed to real Bitwarden developer) pushed to non-main ref in bitwarden/clients, modifying .github/workflows/publish-cli.yml five times
April 22, 21:22@bitwarden/cli@2026.4.0 appears on npm
April 22, 21:57 (5:57 PM ET)Bitwarden-confirmed start of public distribution window
April 22, 23:30 (7:30 PM ET)Bitwarden detects the malicious release, revokes access, deprecates the npm version
April 23, ~05:00Socket, JFrog, Mend, Endor Labs, OX Security, Aikido, GitGuardian publish independent analyses
April 23, ~14:45Bitwarden re-releases clean @bitwarden/cli@2026.4.1
April 23, 2026Bitwarden confirms CVE issuance pending; official community statement published

Determine If You’re Affected

Exposure by Environment

EnvironmentRisk LevelReason
CI/CD pipelines that ran @bitwarden/cli@2026.4.0CriticalPipeline secrets exfiltrated; Runner.Worker memory scraped; workflow injection capability
Developer workstations with CLI installed during windowCriticalLocal credentials, SSH keys, cloud tokens, AI tool configs all harvested
Kubernetes or cloud hosts with Bitwarden CLI in automationCriticalIMDS credential theft; Azure Key Vault access via azd; GCP Secret Manager access
Docker images that baked in the CLI during the windowHighPayload fires whenever the image’s entrypoint or install step runs
Machines with Russian localeNone (skipped)Kill switch exits before any credential access
Pipelines using npm ignore-scripts or pinned integrity hashNot affectedpreinstall hook not executed; integrity mismatch would fail install

Verification Steps

Run these checks on every host that may have installed the CLI during the window.

  1. Check installed version: npm ls -g @bitwarden/cli and npm ls @bitwarden/cli in each project.
  2. Search for loader artefacts: ls -la bw_setup.js bw1.js bun bun.exe 2>/dev/null in working directories where install may have run.
  3. Inspect the persistence lock: ls -la /tmp/tmp.987654321.lock.
  4. Inspect shell RC files for the heredoc injection: grep -E “echo << ‘EOF’|LongLiveTheFighters|Butlerian” ~/.bashrc ~/.zshrc.
  5. Search your GitHub organisation for repositories with description “Shai-Hulud: The Third Coming” via the GitHub search UI or gh repo list –search ‘Shai-Hulud’.
  6. Check your GitHub org for repositories with Dune-themed names matching {word}-{word}-{3digits} where the word list includes atreides, fremen, sandworm, sardaukar, harkonnen, melange, mentat, sietch, tleilaxu, stillsuit, and similar.
  7. In .github/workflows/ across your repositories: grep -r “toJSON(secrets)” .github/workflows/ and look for a format-check.yml you did not author.
  8. Review the last 48 hours of GitHub Actions runs for artifact names of format-results.txt.
  9. Hunt for egress connections to audit.checkmarx[.]cx or 94.154.172.43 in your CI runner and workstation network logs.
  10. Audit npm for unexpected patch-version bumps on packages your organisation publishes since April 22.

Detection Guidance

Indicators of Compromise

TypeIndicatorContext
C2 domainaudit.checkmarx[.]cxPrimary HTTPS exfiltration endpoint
C2 IP94.154.172.43Resolves for audit.checkmarx[.]cx
C2 endpointhttps://audit.checkmarx[.]cx/v1/telemetryPOST target for encrypted telemetry
GitHub search stringLongLiveTheResistanceAgainstMachinesMarker for PAT dead-drop commit messages
GitHub search stringbeautifulcastleMarker for RSA-signed domain-rotation commits
Repository descriptionShai-Hulud: The Third ComingVictim-account exfiltration repo
Repository naming pattern{dune_word}-{dune_word}-{3digits}Victim-account exfiltration repo names
Shell RC markerecho << ‘EOF’ followed by ~3.5 KB heredocAI context poisoning persistence
Lock file/tmp/tmp.987654321.lockDaemon single-instance guard
Workflow filename.github/workflows/format-check.ymlInjected secrets-dump workflow
Workflow patterntoJSON(secrets) inside attacker-injected workflowDumps entire secrets context
Workflow artifactformat-results.txtContains serialised secrets
Loader filebw_setup.js (132 lines plaintext)Bun runtime bootstrap
Main payloadbw1.js (~9.7 MB obfuscator.io output)Credential theft, worm, workflow injection, AI poisoning
Runtime artefactbun / bun.exe downloaded from github.com/oven-sh/bun/releasesDynamic runtime pull
Worm preinstallsetup.mjs with preinstall hookMarker for republished victim packages
Debug stringWould be executing butlerian jihad!Present in decompressed module

MITRE ATT&CK Mapping

TechniqueDescriptionCampaign Application
T1195.002Supply Chain Compromise: Software Supply ChainTrojanised @bitwarden/cli via GitHub Actions tampering
T1199Trusted RelationshipAbused Bitwarden’s npm Trusted Publishing OIDC trust
T1552.001Unsecured Credentials: Credentials in Files.npmrc, .aws/credentials, .git-credentials, .env harvesting
T1552.004Unsecured Credentials: Private KeysSSH keys, TLS material
T1552.005Cloud Instance Metadata APIEC2 IMDS SigV4 for Secrets Manager and SSM
T1059.004Command and Scripting Interpreter: Unix ShellShell RC file injection
T1547.006Boot or Logon Autostart Execution~/.bashrc / ~/.zshrc modification
T1546Event Triggered Executionpreinstall hook and AI-assistant file read
T1574.006Hijack Execution FlowBun runtime dynamically fetched from GitHub
T1132Data EncodingAES-256-GCM + RSA-4096 OAEP hybrid encryption
T1102Web Service: Dead Drop ResolverGitHub commit search for PAT and domain rotation
T1567.002Exfiltration to Cloud StorageVictim-account GitHub repositories
T1480.002Execution Guardrails: Mutual Exclusion/tmp/tmp.987654321.lock
T1027.013Obfuscated Files or Information: Encrypted/Encoded Fileobfuscator.io output with scramble table

Detection Rules

StepSecurity Harden-Runner flags the egress to audit.checkmarx[.]cx on runners with network anomaly detection enabled, and blocks the malicious package via Compromised Actions Run Policy. Socket blocks the malicious package at npm install time. JFrog Curation and JFrog Xray flag the hijacked package and its associated IOCs. GitGuardian’s secrets scanner flags the LongLiveTheResistanceAgainstMachines marker in commit messages across watched repositories. Aikido malware detection surfaces the package as a 100/100 critical issue with nightly rescan.

Remediation and Temporary Protections

Immediate Actions

  1. Uninstall the malicious package globally and per-project: npm uninstall -g @bitwarden/cli && npm cache clean –force. Repeat in every project with a lockfile reference.
  2. Remove loader artefacts on any machine where install or CLI invocation may have run: rm -f bw_setup.js bw1.js bun bun.exe /tmp/tmp.987654321.lock.
  3. Remove the heredoc injection from ~/.bashrc and ~/.zshrc. Open each file and delete the echo << ‘EOF’ block along with its contents.
  4. Rotate every credential accessible on affected hosts: GitHub PATs (especially those with workflow or write:packages scope), npm publishing tokens, AWS access keys, GCP service account keys, Azure credentials, SSH private keys, Bitwarden API keys, and any API keys stored in .env or AI tool configs.
  5. Audit cloud secret managers accessible from the affected machines. The payload queries AWS Secrets Manager and SSM Parameter Store directly via IMDS. Assume contents were read.
  6. Block audit.checkmarx[.]cx and 94.154.172.43 at DNS and egress filtering layers.
  7. Delete unauthorised GitHub repositories created under user or org accounts matching the Dune-themed naming pattern.
  8. Remove the injected format-check.yml workflow from any repository where it appears, and delete associated format-results.txt artefacts from Actions run history.
  9. Audit BerriAI-style secondary compromise: any npm package your organisation published through affected CI between April 22 and the remediation point should be inspected for injected preinstall hooks.

Long-Term Hardening

Enable ignore-scripts = true by default in CI npm configurations. The preinstall hook is the execution trigger; ignore-scripts blocks it without preventing normal package use in most projects.

Pin npm packages to integrity hashes (package-lock.json with integrity field, or npm ci with checksum verification). Even a trusted-publisher compromise fails integrity verification against a pre-compromise hash.

Treat pull_request_target workflows as fully compromised if any external action they invoke is itself compromised. Bitwarden’s chain of custody broke because a single scanner Docker image in a PR-trigger workflow had access to Azure Key Vault and GitHub OIDC. Split credentials: scanning should use a dedicated token with no publishing capability.

Enforce signed commits at the branch protection level for all release-adjacent branches, including non-main refs that can trigger publish workflows. The Bitwarden attack commit was unsigned in a repo requiring signed commits, which was a visible integrity signal at the moment of exploitation.

Restrict IMDS access from containers with IMDSv2 hop limits. The payload actively queries IMDS for cloud credentials; IMDSv2 enforcement blocks the simplest path.

Pre-publish diff every release against the previous release. Tools like Socket’s release-diff and Endor Labs’ artifact comparison detect added files (bw_setup.js, bw1.js) and mismatched internal metadata (the 2026.4.0 vs 2026.3.0 skew) before the artefact reaches consumers.

Delay adoption of new package versions by 48 to 72 hours for non-critical dependencies. The Bitwarden compromise was detected and deprecated in 93 minutes, but Dependabot-driven auto-updates pulled the package during the window. A short manual review gate prevents this.

Phoenix Security Recommendations

The Bitwarden CLI compromise has no CVSS score at the time of writing, no NVD entry, and traditional scanner-based workflows that only flag known CVEs would not have caught it. The attack targeted a package that handles credentials by design, through a publishing mechanism (Trusted Publishing) that was supposed to eliminate the credential-theft class of npm compromises entirely.

Attack surface management: Phoenix identifies every environment with @bitwarden/cli installed and maps the installed version against the known-compromised 2026.4.0. For organisations with the CLI embedded in dozens of CI pipelines, developer container images, and Kubernetes automation, Phoenix gives a single exposure view rather than per-environment manual audits.

Contextual deduplication: A single compromised package appearing across hundreds of repositories, container images, and cloud workloads produces hundreds of duplicate findings in conventional tooling. Phoenix correlates these into one prioritised remediation item per environment, with evidence trails.

Reachability analysis: The distinction between a package being installed and a package actually executing during the 93-minute window matters for response prioritisation. Phoenix maps which environments ran the CLI’s preinstall hook or invoked bw during the exposure window, separating confirmed-compromise hosts from merely-at-risk ones.

Remediation campaigns: Create a Phoenix campaign to track uninstallation, credential rotation, GitHub repository cleanup, workflow removal, shell RC sanitisation, and cloud secret manager auditing. Assign per-team ownership and track each step to confirmed-clean state.

Ownership attribution: Map each affected workflow, container, or host to the responsible team. The Bitwarden CLI is used across platform, security, DevOps, and application teams in most organisations. Coordinated response requires clear ownership across that surface.

Phoenix Security correlates vulnerable components with runtime execution, maps exposed environments through attack surface management, and assigns remediation ownership. A multi-vendor supply chain compromise that spans credential theft, CI/CD abuse, npm worm propagation, and AI context poisoning becomes an owned, trackable remediation backlog rather than a cascade of disconnected alerts.

External References

  1. Bitwarden — Statement on Checkmarx Supply Chain Incident — community.bitwarden.com/t/bitwarden-statement-on-checkmarx-supply-chain-incident/96127
  2. JFrog Security Research — TeamPCP Campaign Spreads to npm via a Hijacked Bitwarden CLI — research.jfrog.com/post/bitwarden-cli-hijack/
  3. Socket — Bitwarden CLI Compromised in Ongoing Checkmarx Supply Chain Campaign — socket.dev/blog/bitwarden-cli-compromised
  4. Mend.io — The Butlerian Jihad: Compromised Bitwarden CLI Deploys npm Worm, Poisons AI Assistants, and Dumps GitHub Secrets — mend.io
  5. Endor Labs — The Bitwarden CLI Supply Chain Attack: What Happened and What to Do — endorlabs.com
  6. OX Security — Shai-Hulud: The Third Coming — Bitwarden CLI Backdoored in Latest Supply Chain Campaign — ox.security
  7. Aikido Security — Is Shai-Hulud Back? Compromised Bitwarden CLI Contains a Self-Propagating npm Worm — aikido.dev
  8. GitGuardian — @bitwarden/cli: GitGuardian Views on helloworm00 — blog.gitguardian.com
  9. The Hacker News — Bitwarden CLI Compromised in Ongoing Checkmarx Supply Chain Campaign — thehackernews.com
  10. StepSecurity — Bitwarden CLI Compromise Analysis (includes per-developer blast-radius assessment)
  11. Heise Online — Password Safe Bitwarden: Command-line Client Trojanized — heise.de
  12. Socket — Checkmarx KICS Docker Image Compromise (April 22, 2026) — socket.dev

Francesco is an internationally renowned public speaker, with multiple interviews in high-profile publications (eg. Forbes), and an author of numerous books and articles, who utilises his platform to evangelize the importance of Cloud security and cutting-edge technologies on a global scale.

Discuss this blog with our community on Slack

Join our AppSec Phoenix community on Slack to discuss this blog and other news with our professional security team

From our Blog

Phoenix Security launched Phoenix Blue at VulnCon 2026 — a standalone agentic vulnerability intelligence platform at phxintel.security. The platform indexes 300K+ CVE records and 2,080,512 advisory references from 15+ sources, adds six proprietary scoring systems, zero-day pre-CVE detection, and malicious package monitoring. Free for everyone, built agent-first with REST, GraphQL, and MCP integration.
Francesco Cipollone
Phoenix ships workflow automation, a rebuilt Remedies screen, container deduplication, and Azure connectors — so security teams spend less time managing findings and more time closing them.
Rowan Scott
Contents
Derek

Derek Fisher

Head of product security at a global fintech

Derek Fisher – Head of product security at a global fintech. Speaker, instructor, and author in application security.

Derek is an award winning author of a children’s book series in cybersecurity as well as the author of “The Application Security Handbook.” He is a university instructor at Temple University where he teaches software development security to undergraduate and graduate students. He is a speaker on topics in the cybersecurity space and has led teams, large and small, at organizations in the healthcare and financial industries. He has built and matured information security teams as well as implemented organizational information security strategies to reduce the organizations risk.

Derek got his start in the hardware engineering space where he learned about designing circuits and building assemblies for commercial and military applications. He later pursued a computer science degree in order to advance a career in software development. This is where Derek was introduced to cybersecurity and soon caught the bug. He found a mentor to help him grow in cybersecurity and then pursued a graduate degree in the subject.

Since then Derek has worked in the product security space as an architect and leader. He has led teams to deliver more secure software in organizations from multiple industries. His focus has been to raise the security awareness of the engineering organization while maintaining a practice of secure code development, delivery, and operations.

In his role, Jeevan handles a range of tasks, from architecting security solutions to collaborating with Engineering Leadership to address security vulnerabilities at scale and embed security into the fabric of the organization.

Jeevan Singh

Jeevan Singh

Founder of Manicode Security

Jeevan Singh is the Director of Security Engineering at Rippling, with a background spanning various Engineering and Security leadership roles over the course of his career. He’s dedicated to the integration of security practices into software development, working to create a security-aware culture within organizations and imparting security best practices to the team.
In his role, Jeevan handles a range of tasks, from architecting security solutions to collaborating with Engineering Leadership to address security vulnerabilities at scale and embed security into the fabric of the organization.

James

James Berthoty

Founder of Latio Tech

James Berthoty has over ten years of experience across product and security domains. He founded Latio Tech to help companies find the right security tools for their needs without vendor bias.

christophe

Christophe Parisel

Senior Cloud Security Architect

Senior Cloud Security Architect

Chris

Chris Romeo

Co-Founder
Security Journey

Chris Romeo is a leading voice and thinker in application security, threat modeling, and security champions and the CEO of Devici and General Partner at Kerr Ventures. Chris hosts the award-winning “Application Security Podcast,” “The Security Table,” and “The Threat Modeling Podcast” and is a highly rated industry speaker and trainer, featured at the RSA Conference, the AppSec Village @ DefCon, OWASP Global AppSec, ISC2 Security Congress, InfoSec World and All Day DevOps. Chris founded Security Journey, a security education company, leading to an exit in 2022. Chris was the Chief Security Advocate at Cisco, spreading security knowledge through education and champion programs. Chris has twenty-six years of security experience, holding positions across the gamut, including application security, security engineering, incident response, and various Executive roles. Chris holds the CISSP and CSSLP certifications.

jim

Jim Manico

Founder of Manicode Security

Jim Manico is the founder of Manicode Security, where he trains software developers on secure coding and security engineering. Jim is also the founder of Brakeman Security, Inc. and an investor/advisor for Signal Sciences. He is the author of Iron-Clad Java: Building Secure Web Applications (McGraw-Hill), a frequent speaker on secure software practices, and a member of the JavaOne Rockstar speaker community. Jim is also a volunteer for and former board member of the OWASP foundation.

Join our Mailing list!

Get all the latest news, exclusive deals, and feature updates.

The IKIGAI concept
x  Powerful Protection for WordPress, from Shield Security PRO
This Site Is Protected By
Shield Security PRO