Bitwarden CLI compromised in ongoing Checkmarx supply chain campaign
TL;DR Highlight
Bitwarden CLI npm package delivers malware via GitHub Actions, stealing user credentials.
Who Should Read
Developers and DevOps engineers installing npm packages in CI/CD pipelines or using the Bitwarden CLI, especially teams automating dependency installation in GitHub Actions workflows.
Core Mechanics
- The affected version, @bitwarden/cli 2026.4.0, had malicious code inserted into the bw1.js file. Attackers compromised Bitwarden’s GitHub Actions CI/CD pipeline to inject the payload into build artifacts.
- This incident is part of the Checkmarx supply chain campaign—a series of attacks targeting the npm ecosystem—and shares the same C2 endpoint (audit.checkmarx[.]cx/v1/telemetry) and payload structure as previously analyzed mcpAddon.js.
- The malicious payload scrapes the memory of GitHub Actions Runners to steal GitHub tokens, AWS credentials from ~/.aws/ files and environment variables, Azure/GCP/npm tokens from azd·gcloud·~/.npmrc, and even Claude/MCP configuration files.
- Stolen npm tokens are used to find other npm packages with write access, injecting malicious code into the preinstall hook for redistribution. Public repositories on GitHub are also created with Dune novel-themed names ({word}-{word}-{3-digit number}) to commit encrypted results.
- A Russian locale killswitch causes the malware to silently exit if the system locale starts with 'ru', checking Intl.DateTimeFormat().resolvedOptions().locale and the LC_ALL, LC_MESSAGES, LANGUAGE, and LANG environment variables.
- Because the malicious payload executes during the npm install preinstall hook, existing security practices of scanning code after installation are ineffective. CI/CD environments with automated installation are particularly vulnerable due to short exposure windows.
- Impact was limited as the Bitwarden CLI does not auto-update, with approximately 334 downloads affected. Browser extensions, MCP servers, and other official distributions remain unaffected.
- The payload injects itself into ~/.bashrc and ~/.zshrc to maintain persistence after shell restarts, and incorporates ideological branding from Dune novels ('Shai-Hulud', 'Butlerian Jihad')—a departure from previous Checkmarx campaigns.
Evidence
- "Practical advice was shared that setting a minimum release age for npm package installations can defend against such attacks. Setting min-release-age=7 (days) in .npmrc (npm 11.10+) could have prevented this package (~19 hours to discovery/deprecation) and previous quickly-removed cases like axios and ua-parser-js."
How to Apply
- If using npm/pnpm/bun/uv, add a minimum release age to your package manager configuration. Set min-release-age=7 in ~/.npmrc, minimum-release-age=10080 (minutes) in pnpm rc, and minimumReleaseAge = 604800 (seconds) in ~/.bunfig.toml to prevent newly deployed malicious packages from automatically installing.
- In CI/CD pipelines, pin package versions in package.json without the ^ range and commit the lockfile. For critical tools like Bitwarden CLI, always pin versions.
- If currently using Bitwarden CLI, check CI logs for use of the affected version (2026.4.0) and immediately rotate any secrets (GitHub tokens, AWS/GCP/Azure credentials, npm tokens, SSH keys) potentially exposed in that workflow. Refer to the Bitwarden community for the timeframe of compromise.
- If using GitHub Actions, pin third-party Action versions to SHA hashes and remove unnecessary secret access permissions to minimize the blast radius of a compromise.
Code Example
# ~/.npmrc (npm 11.10+ required)
min-release-age=7 # Unit: days
# ~/Library/Preferences/pnpm/rc
minimum-release-age=10080 # Unit: minutes
# ~/.bunfig.toml
[install]
minimumReleaseAge = 604800 # Unit: seconds
# ~/.config/uv/uv.toml (Python uv package manager)
exclude-newer = "7 days"Terminology
Related Papers
Migrating a production AI agent to GPT-5.6: 2.2x faster, 27% cheaper
마케팅 웹사이트를 자동 생성하는 프로덕션 AI 에이전트를 Claude Opus 4.8에서 GPT-5.6 Sol로 전환한 실전 경험담으로, 단순 모델 교체가 아니라 eval 하네스, 툴 스키마, 캐싱, 추론 리플레이까지 손봐야 했던 과정을 구체적인 수치와 함께 정리했다.
What xAI's Grok build CLI sends to xAI: A wire-level analysis
xAI의 공식 코딩 CLI 도구 Grok Build가 사용자 동의 없이 전체 Git 저장소와 .env 시크릿 파일을 xAI 서버로 업로드한다는 사실이 네트워크 트래픽 분석으로 밝혀졌다.
Remember When It Matters: Proactive Memory Agent for Long-Horizon Agents
LLM 에이전트가 긴 작업 중 중요한 정보를 잊어버리는 문제를 별도의 메모리 에이전트가 '적절한 타이밍에' 끼어들어 해결하는 방법
WebSwarm: Recursive Multi-Agent Orchestration for Deep-and-Wide Web Search
복잡한 웹 검색을 재귀적으로 분해하고 각 노드에 적합한 검색 모드를 동적으로 할당하는 멀티에이전트 프레임워크
Show HN: Reverse-engineering web apps into agent tools
로그인된 웹 앱의 API 호출을 브라우저에서 감시해 자동으로 MCP 도구로 변환하는 에이전트를 만들었다. 소스 코드나 공식 API 문서 없이도 Jira, Spotify 같은 서비스에 AI 어시스턴트를 붙일 수 있다.
Show HN: FableCut – A browser video editor AI agents can drive (zero deps)
타임라인 전체를 JSON 파일 하나로 표현하고 MCP/REST로 AI 에이전트가 직접 편집할 수 있는 브라우저 비디오 에디터로, Claude 같은 AI가 프롬프트 하나로 영상을 자동 컷편집하고 결과를 실시간으로 UI에 반영해준다.
Related Resources
- Original Article: Bitwarden CLI Compromised in Ongoing Checkmarx Supply Chain Campaign
- Bitwarden Official Statement
- rbw: A Bitwarden CLI alternative written in Rust
- DepsGuard: Package Manager Security Configuration Helper
- Cooldowns.dev: Package Release Cooldown Setting Tool
- The Install Was the Attack (AgentSH Blog)