- Một GitHub Action bị chiếm đã đẩy @bitwarden/cli@2026.4.0 chứa mã độc bw1.js lên npm trong 93 phút, hút token GitHub, AWS, npm, SSH và .env về audit.checkmarx[.]cx.
- Vault người dùng an toàn, nhưng 334 máy dev/CI cần rotate toàn bộ secret ngay.
TL;DR
Ngày 22/04/2026, từ 5:57 PM đến 7:30 PM ET (khoảng 93 phút), một bản @bitwarden/cli@2026.4.0 chứa payload bw1.js được đẩy lên npm thông qua một GitHub Action bị chiếm trong pipeline CI/CD của Bitwarden. Payload hút GitHub tokens, npm tokens, AWS/Azure/GCP credentials, SSH keys, .env và shell history về domain giả mạo audit.checkmarx[.]cx. Bitwarden xác nhận vault người dùng, production data và production systems không bị ảnh hưởng. Chỉ 334 người tải bản độc; họ cần update lên 2026.4.1 và rotate toàn bộ secret trong phạm vi máy đã chạy CLI.

What’s new
Bitwarden công bố chính thức ngày 23/04/2026 rằng nhóm bảo mật đã phát hiện và cô lập một bản npm độc của Bitwarden CLI chỉ khoảng hơn 1 tiếng rưỡi sau khi nó xuất hiện. Đây không phải là một package typosquat — đây là bản chính thức của maintainer thật, được ký và phát hành từ đúng pipeline CI/CD của Bitwarden, nhưng GitHub Action dùng để build đã bị chiếm dụng.
Sự cố này thuộc chiến dịch lớn hơn mang tên Checkmarx supply chain campaign do nhóm TeamPCP đứng sau. Trong vòng 48 giờ từ 21 đến 23/04/2026, cùng hạ tầng đã đập vào Checkmarx KICS (Docker Hub), Trivy, LiteLLM và lan sang ~250 package npm do các nạn nhân phụ làm maintainer.
Why it matters
Điều đáng sợ nhất của vụ Bitwarden không phải là con số 334 lượt tải — mà là kiểu tấn công. Kẻ xấu không cần lừa ai cài sai tên package. Họ không cần chiếm npm account. Họ chiếm một bước trong GitHub Actions workflow, để pipeline hợp pháp tự tay build và publish một release có thêm một file bw1.js. Với người dùng cuối, artifact trông hoàn toàn chính chủ: cùng tên, cùng maintainer, cùng chữ ký npm.
Điều đó có nghĩa là các biện pháp bảo vệ kinh điển — chỉ cài từ maintainer đáng tin, kiểm chữ ký, tránh typosquat — không còn đủ. Nếu bạn npm install -g @bitwarden/cli trong 93 phút đó trên một CI runner có quyền AWS/GCP/GitHub, bạn đã cho phép TeamPCP đọc mọi thứ đó.
Technical facts
Các chỉ số kỹ thuật chính từ phân tích của Socket Research Team và CyberInsider:
| Thuộc tính | Giá trị |
|---|---|
| Package | @bitwarden/cli |
| Version độc | 2026.4.0 |
| Version sạch | 2026.4.1 |
| Cửa sổ phân phối | 22/04/2026, 5:57–7:30 PM ET (~93 phút) |
| Lượt tải độc | 334 |
| File payload | bw1.js |
| C2 endpoint | audit.checkmarx[.]cx/v1/telemetry |
| C2 IP | 94.154.172.43 |
| Runtime thả xuống | Bun v1.3.13 (tải từ GitHub releases) |
| Lock file | /tmp/tmp.987654321.lock |
| Mã hoá exfil | AES-256-GCM |
| Obfuscation | __decodeScrambled |
Danh mục credential bị nhắm: GitHub PATs (kể cả scrape từ bộ nhớ Runner.Worker), npm config, AWS keys, Azure tokens, gcloud credentials, ~/.ssh, .env, shell history, GitHub Actions secrets, và cả file cấu hình Claude/MCP.
Hành vi giống worm
Điểm tệ hơn là payload có logic tự nhân bản: dùng GitHub token đánh cắp để chèn workflow GitHub Actions trái phép vào repo của nạn nhân, và dùng npm token để republish các package khác mà nạn nhân đang maintain với cùng postinstall hook. Đó là cách cùng một chiến dịch nở ra thành 250+ package bị nhiễm trong 48 giờ.
Secrets exfil không chỉ gửi về C2 — chúng còn được commit vào các repo public mới tạo dưới account nạn nhân, đặt tên theo chủ đề Dune (gesserit-melange, mentat-fedaykin, prescient-ghola, atreides-ghola…). Mục đích: tạo kênh lấy dữ liệu bền vững ngay cả khi C2 bị takedown.

Comparison — Chiến dịch TeamPCP trong 48 giờ
| Chiến dịch | Mục tiêu | Ecosystem | Payload |
|---|---|---|---|
| Checkmarx KICS | Docker image + VS Code extension | Docker Hub | Overwrite tag alpine, latest, v2.1.20 |
| Bitwarden CLI | @bitwarden/cli@2026.4.0 | npm | bw1.js |
| Trivy / LiteLLM | Dev CI tools | npm / PyPI | Cùng C2, cùng AES-GCM |
| CanisterSprawl | pgserve + 250+ republish | npm & PyPI | Worm postinstall, C2 trên ICP canister |
| xinference | 3 bản liên tiếp | PyPI | SSH + ví crypto |
Khác biệt với sự cố Nx s1ngularity tháng 9/2025: lần này kẻ tấn công không chiếm npm account — họ chiếm GitHub Actions runner, để bản độc được ký bằng chính danh tính maintainer thật. Đó là kiểu tấn công khó phát hiện hơn nhiều.
Use cases — Ai cần lo, ai không
- End user của password manager Bitwarden (desktop / browser / mobile / app cloud): không bị ảnh hưởng. Không cần đổi master password.
- Developer & DevOps đã chạy
npm install -g @bitwarden/clitrong khung giờ 5:57–7:30 PM ET ngày 22/04/2026: coi như mọi secret trong shell/CI runner đó đã lộ. Rotate GitHub PAT, npm token, AWS/Azure/GCP keys, SSH keys, và bất kỳ biến nào trong.env. - Security / blue team: truy outbound traffic tới
audit.checkmarx[.]cxhoặc94.154.172.43; grep filebw1.js,/tmp/tmp.987654321.lock, binarybunbất ngờ. Audit repo cho workflow mới và repo public lạ có tên kiểu Dune dưới account đã bị ảnh hưởng.
Limitations & pricing
Bitwarden là open-source và miễn phí; không có tác động về giá hay gói dịch vụ. Chi phí thực sự là lao động remediation ở 334 máy đã tải cộng với các pipeline CI downstream. Giới hạn phân tích hiện tại: chưa có con số chính thức về số repo/secret bị đánh cắp — researcher cho rằng hành vi worm-like có thể còn đang phơi bày nạn nhân mới.
What’s next
Nếu bạn vận hành một open-source project có pipeline npm/PyPI/Docker, bài học lặp lại: GitHub Actions là supply chain. Gắn OIDC thay cho PAT dài hạn, pin action bằng commit SHA thay vì tag, chia quyền runner theo job, và bật protection cho môi trường publish. Mong đợi TeamPCP tiếp tục đập vào các maintainer khác trong vài tuần tới — Socket và GitGuardian đều cảnh báo đây là làn sóng chứ không phải sự cố đơn lẻ.
Nguồn: Bitwarden official statement, Socket Research Team, CyberInsider, The Hacker News, GitGuardian.

