Pe 23 aprilie 2026, cercetătorii de la Socket au confirmat că pachetul npm @bitwarden/cli@2026.4.0 a fost compromis ca parte a campaniei Checkmarx de supply chain. Codul malițios injectat printr-un GitHub Action compromis din pipeline-ul CI/CD al Bitwarden fură credențiale GitHub, npm, SSH și cloud (AWS, Azure, GCP) din orice mediu în care pachetul a fost instalat sau executat. Datele din vault-urile utilizatorilor obișnuiți Bitwarden nu sunt afectate direct — compromisul vizează exclusiv mediile de dezvoltare și automatizare care utilizează CLI-ul prin npm.
Dacă folosești Bitwarden prin extensia de browser, aplicația desktop sau aplicația mobilă, datele tale din vault sunt în siguranță. Dacă ai instalat @bitwarden/cli prin npm în scripturi, pipeline-uri CI/CD, servere sau fluxuri de automatizare, tratează incidentul ca o expunere confirmată de credențiale și acționează imediat conform pașilor de mai jos.
Ce s-a întâmplat
Atacul face parte dintr-o campanie mai largă atribuită unui actor identificat ca TeamPCP, care a compromis GitHub Actions din mai multe repository-uri open source în aceeași perioadă. Vectorul de intrare în cazul Bitwarden a fost un GitHub Action compromis din pipeline-ul oficial de build, care a permis injectarea unui fișier malițios denumit bw1.js în pachetul npm publicat ca versiunea 2026.4.0.
Payload-ul din bw1.js partajează infrastructura de comandă și control cu malware-ul mcpAddon.js documentat anterior în aceeași campanie Checkmarx, inclusiv același endpoint de exfiltrare audit.checkmarx[.]cx/v1/telemetry și același mecanism de obfuscare. Codul rulează prin interpretorul Bun descărcat dinamic de la GitHub releases, instalează persistență prin injectare în ~/.bashrc și ~/.zshrc, creează repository-uri publice pe GitHub sub contul victimei cu nume tematice Dune (model: {cuvant}-{cuvant}-{3cifre}) și comite credențialele furate criptat în acele repository-uri cu mesajul marker LongLiveTheResistanceAgainstMachines.
Un detaliu operațional important: payload-ul conține un kill switch pentru localele rusești — verifică Intl.DateTimeFormat().resolvedOptions().locale și variabilele de mediu LC_ALL, LC_MESSAGES, LANGUAGE și LANG și se oprește silențios dacă oricare dintre ele începe cu „ru". Aceasta este o semnătură operațională, nu o declarație de atribuire certă.
Ce credențiale sunt vizate
Payload-ul colectează activ următoarele categorii de credențiale din mediul în care rulează: tokeni GitHub prin scraping de memorie din procesul GitHub Actions Runner.Worker și din variabilele de mediu; tokeni și configurații npm din fișierele .npmrc; credențiale AWS din ~/.aws/credentials, ~/.aws/config și variabile de mediu; tokeni Azure prin azd și configurații locale; credențiale GCP prin gcloud config config-helper; chei SSH private din ~/.ssh/; fișiere .env și variabile de mediu generale; configurații Claude/MCP.
Propagarea laterală este de asemenea încorporată: după ce obține un token npm cu permisiuni de scriere, codul încearcă să identifice alte pachete npm pe care victima le poate publica și le reinjectează cu hook-uri preinstall malițioase, extinzând campania la alte proiecte din ecosistemul victimei.
Ce nu este afectat
Compromisul este limitat la pachetul npm al CLI-ului. Bitwarden a confirmat că extensia Chrome, aplicația desktop, aplicația mobilă și serverul MCP nu sunt afectate de această versiune a atacului. Arhitectura zero-knowledge a Bitwarden înseamnă că vault-urile utilizatorilor sunt criptate local cu master password-ul — chiar și un server Bitwarden complet compromis nu poate decripta datele utilizatorilor fără parola principală. Dacă nu ai instalat niciodată @bitwarden/cli prin npm, nu ai niciun risc direct din acest incident.
Pași de remediere dacă ai instalat pachetul afectat
Dacă @bitwarden/cli@2026.4.0 a fost instalat pe orice sistem — mașina ta de lucru, un server, un runner CI/CD sau un container — tratează toate credențialele care au existat în acel mediu ca expuse și acționează în ordinea de mai jos.
1. Elimină imediat pachetul compromis
npm uninstall -g @bitwarden/cli
# sau, dacă este instalat local în proiect:
npm uninstall @bitwarden/cli
npm cache clean --force
2. Verifică persistența în shell profiles
grep -n "bw1\|checkmarx\|butlerian\|shai-hulud\|tmp.987654321" ~/.bashrc ~/.zshrc ~/.profile 2>/dev/null
Dacă această comandă returnează rezultate, payload-ul a injectat persistență. Deschide fișierele indicate și elimină manual liniile găsite, apoi reîncarcă shell-ul.
3. Verifică lock file-ul și artefactele temporare
ls /tmp/tmp.987654321.lock 2>/dev/null && echo "ATENTIE: lock file prezent" || echo "OK"
ls /tmp/_tmp_* 2>/dev/null
4. Verifică repository-urile GitHub pentru activitate suspectă
Autentifică-te în contul tău GitHub și auditează repository-urile publice create recent. Caută nume care respectă modelul {cuvant}-{cuvant}-{3cifre} sau oricare dintre cuvintele cheie documentate: atreides, harkonnen, fremen, sandworm, sardaukar, melange, stillsuit, sietch. Dacă găsești repository-uri pe care nu le-ai creat tu, șterge-le imediat și revocă toate tokenurile din Settings → Developer settings → Personal access tokens.
5. Rotește toate credențialele expuse
Credențialele nu pot fi „dezexpuse" — dacă au existat în mediul afectat, trebuie rotite indiferent dacă există sau nu dovezi de exfiltrare observabilă:
- GitHub: Revocă toate Personal Access Tokens, regenerează deploy keys, rotește secretele GitHub Actions din toate repository-urile care au rulat pe mediul afectat
- npm: Revocă tokenurile din npmjs.com → Account Settings → Access Tokens
- AWS: Dezactivează și recreează Access Keys din IAM Console; verifică CloudTrail pentru acces neautorizat
- Azure: Revocă tokenurile din Azure Portal → Azure Active Directory → App registrations
- GCP: Rotește Service Account Keys din Cloud Console → IAM & Admin
- SSH: Dacă cheile private din
~/.ssh/au fost expuse, generează perechi noi și actualizează cheile publice pe toate serverele
6. Verifică conexiunile de rețea suspecte
# Verifică logurile pentru conexiuni spre endpoint-ul C2
grep -r "audit\.checkmarx" /var/log/ 2>/dev/null
grep -r "94\.154\.172\.43" /var/log/ 2>/dev/null
Context mai larg: de ce pipeline-urile CI/CD sunt ținta preferată
Campania Checkmarx care a compromis Bitwarden CLI face parte dintr-un pattern mai larg care a accelerat semnificativ în 2025–2026: atacatorii nu mai vizează direct serverele sau utilizatorii finali — atacă punctele de joncțiune ale lanțului de livrare software: GitHub Actions, registrele npm, imaginile Docker. Un singur GitHub Action compromis dintr-un repository popular poate infecta mii de medii de build în ore, înainte ca orice sistem de detecție să semnaleze anomalia.
Acesta este exact motivul pentru care administrarea corectă a unui server Linux include acum nu doar hardening-ul sistemului de operare, ci și izolarea mediilor de build, principiul least privilege pentru tokenii CI/CD și auditarea periodică a dependențelor. Un VPS pe care rulezi pipeline-uri de build sau scripturi de automatizare are o suprafață de atac fundamental diferită față de un server web static — și trebuie tratat ca atare. Dacă rulezi mai multe workload-uri pe același host, serviciul de administrare Linux gestionat ServerSpan acoperă izolarea workload-urilor prin containere și medii dedicate ca parte din baseline-ul standard de hardening.
Pentru operatorii care rulează Bitwarden self-hosted pe propriul VPS, incidentul curent nu afectează instanța self-hosted în sine — dar subliniază importanța de a nu combina niciodată un serviciu de stocare credențiale cu un mediu de build sau automatizare pe același host. Un server care rulează Bitwarden self-hosted și pipeline-uri CI/CD bazate pe npm combină două suprafețe de atac distincte pe o singură mașină. Arhitectura corectă izolează fiecare workload pe un container separat sau pe un VPS dedicat.
Indicatori de compromitere (IOC)
| Tip | Valoare |
|---|---|
| Pachet npm malițios | @bitwarden/cli@2026.4.0 |
| Fișier payload | bw1.js |
| Endpoint C2 (exfiltrare) | audit.checkmarx[.]cx/v1/telemetry |
| IP C2 | 94[.]154[.]172[.]43 |
| Lock file | /tmp/tmp.987654321.lock |
| Director temporar | /tmp/_tmp_<Unix Epoch Timestamp>/ |
| Marker commit GitHub | LongLiveTheResistanceAgainstMachines |
| Pattern repository staging | {cuvant}-{cuvant}-{3cifre} cu terminologie Dune |
Răspunsul Bitwarden
La momentul publicării acestui articol (23 aprilie 2026), Socket și-a publicat analiza tehnică completă și a notificat Bitwarden. Investigația este activă. Urmărește pagina oficială de status Bitwarden și blog-ul de securitate al proiectului pentru actualizări oficiale. Versiunile anterioare și posterioare pachetului 2026.4.0 nu sunt afectate de acest compromis specific.
Rezumat acțiuni imediate: Dacă ai instalat @bitwarden/cli@2026.4.0 prin npm — pe orice sistem — elimină pachetul, verifică shell profiles pentru persistență, auditează GitHub pentru repository-uri neautorizate și rotește toate credențialele care au existat în acel mediu. Datele din vault-urile utilizatorilor obișnuiți Bitwarden nu sunt afectate. Extensia de browser, aplicația desktop și aplicația mobilă nu sunt afectate.
Sursă și Atribuire
Aceast articol se bazează pe date originale ale serverspan.com. Pentru metodologia completă și pentru a asigura integritatea datelor, articolul original trebuie citat. Sursa canonică este disponibilă la: Bitwarden CLI compromis printr-un atac supply chain - Ce s-a întâmplat și ce trebuie să faci chiar acum (23 aprilie 2026).