
Bitwarden Server v2026.9.2 - عالي - IDOR - زرع عناصر خزنة قابلة لفك التشفير في مجموعات لا يملك المستدعي صلاحية الكتابة فيها
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · bitwarden-cipher-create-acl
المقال التفصيلي: https://abraxaslabs.tech/research/bitwarden-cipher-create-acl
Bitwarden Server v2026.9.2 - Bitwarden
إنشاء عنصر مشفّر (cipher) على مستوى المؤسسة عبر مسار Entity Framework (MariaDB وPostgres وSQLite) يُسقط معرّف المستدعي قبل ربط المجموعة. يمكن لعضو مؤكَّد أن يزرع عنصرًا بمفتاح المؤسسة داخل مجموعة لا يملك صلاحية الكتابة فيها. يقوم أعضاء المجموعة بمزامنته كتسجيل دخول مشترك عادي.
| المعرّف | لا يوجد CVE بعد |
| CWE | CWE-863 / CWE-639 |
| CVSS | عالٍ: 7.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:L |
| المنتج | Bitwarden Server |
| المتأثر | v2026.9.2 (9ee4e0eb) lite EF (MariaDB / Postgres / SQLite). أما MSSQL/Dapper فيحتفظ بـ @UserId. |
| المصادقة | عضو مؤكَّد في المؤسسة |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
يقوم المهاجم بإضافة عناصر إلى خزنة مجموعة مشتركة. وهو لا يقرأ أو يستبدل الأسرار الموجودة فيها بالفعل.
يمتلك العضو المؤكَّد في المؤسسة مفتاح المؤسسة مسبقًا، لذا يُفكّ تشفير العنصر الجديد لكل من يمكنه رؤية تلك المجموعة. ويعرضه Bitwarden كتسجيل دخول أو ملاحظة أو بطاقة أو مفتاح SSH مشترك عادي من داخل خزنة الشركة.
Okta، GitHub، VPN، Payroll) يشير عنوان URI الخاص به إلى مضيف يتحكم به المهاجم. يفتحه أعضاء المجموعة من Bitwarden فيصلون إلى صفحة المهاجم، أو يُملأ تلقائيًا مقابل موقع مماثل.new AWS key، bastion SSH key، DB password after change). فينسخه أحدهم إلى بيئة الإنتاج أو إلى طرفية.Production أن يُسقط عنصرًا جديدًا فيها على lite EF.إذا لم تكن لديهم صلاحية الوصول إلى المجموعة المستهدفة، فقد يُرجع POST /api/ciphers/create رمز 404 بعد أن تكون الكتابة قد نُفّذت بالفعل. ومع ذلك يتلقى الضحايا العنصر عند المزامنة.
ثبّتُّ إصدار bitwarden/server v2026.9.2 (9ee4e0eb) بعد موجة 2026: طلب المسؤول TDE (CVE-2026-60104)، واقتطاع SSO ExternalId (CVE-2026-101878)، واستيراد المؤسسة للمجموعات الفارغة (CVE-2026-43638). تلك الثغرات مغلقة. أما قائمة التحكم بالوصول (ACL) للمجموعة عند الإنشاء فلم تكن كذلك.
لا يتحقق CiphersController.PostCreate إلا من عضوية المؤسسة، ثم يمرّر skipPermissionCheck: true عند تعيين OrganizationId. بعد ذلك يتعامل SaveDetailsAsync مع عبارة "هذه المجموعة موجودة في المؤسسة" باعتبارها الفحص الوحيد للمجموعة.
تستخدم MariaDB/Postgres/SQLite في lite إطار EF. يضبط CreateAsyncReturnCipher القيمة cipher.UserId = null لوجود معرّف مؤسسة، ثم يمرّر هذه القيمة الفارغة إلى UpdateCollectionsAsync. معرّف المستخدم الفارغ يعني كل المجموعات في المؤسسة. أما SQL Server Dapper فيحتفظ بـ @UserId من أجل Cipher_UpdateCollections (ReadOnly = 0). ذلك المسار هو الحالة السلبية.
المسارات الخاطئة المسجّلة مسبقًا: التعامل مع POST /organizations السحابي كأنه إنشاء الاستضافة الذاتية (فهو [NotSelfHostedOnly]؛ وتحتاج النسخة الخفيفة إلى ملف ترخيص، لذا يزرع المختبر صفوف المؤسسات بعد التسجيل)؛ والزرع في مجموعة لا يستطيع المستدعي قراءتها وقراءة HTTP 404 كأنها عدم إصابة (فصف CollectionCipher مُثبَّت بالفعل)؛ والافتراض بأن MSSQL الخفيف سيُظهره (فـ Dapper لا يُسقط معرّف المستدعي)؛ وترك BW_ENABLE_ADMIN معطّلًا بحيث لا تُهاجر النسخة الخفيفة User / OrganizationDomain أبدًا (فالمشرف هو مُهاجِر EF على هذه الصورة)؛ وإغفال Bitwarden-Client-Version على /identity/connect/token ومشاهدة منح كلمة المرور يعيد 400. صدفة عكسية. مسرح.
cd lab
./run.sh
استهدف فقط http://127.0.0.1:18160. الصورة ghcr.io/bitwarden/lite:2026.9.2 بالإضافة إلى MariaDB.
SUCCESS BITWARDEN-CIPHER-CREATE-ACL create-http=404 collectioncipher=1 victim-sync-has-cipher=yes cipher=<id> negative-http=404 readonly-http=200 BITWARDEN-CIPHER-CREATE-ACL-WITNESS
تُرجع محفظة النبات بدون صلاحية وصول 404 بعد تنفيذ CollectionCipher. يحتوي كل من GET /api/ciphers و/api/sync الخاص بالضحية على المعرّف الجديد. القراءة فقط على B تُرجع 200 ولا تزال تزرع. تبقى مجموعة المؤسسة الخارجية 404 دون صف انضمام.
مرّر معرّف المستخدم الحافظ إلى UpdateCollectionsAsync في EF بالطريقة نفسها التي لا يزال بها CipherDetails_CreateWithCollections يمرّر @UserId بعد أن يجعل عمود UserId المخزّن فارغًا (null). لا تتعامل مع مستخدم فارغ على أنه "كل المجموعات" في مسار إنشاء العضو. الوجود في المؤسسة ليس صلاحية كتابة.
CiphersController.cs (Post، PostCreate)CipherService.cs (SaveDetailsAsync)CipherRepository.cs (CreateAsyncReturnCipher، UpdateCollectionsAsync)