
PoC الأصلي لـ CVE-2023-32784
تم تعيين الثغرة الأمنية CVE-2023-32784 وتم إصلاحها في KeePass 2.54. شكرًا مرة أخرى لدومينيك ريشل على استجابته السريعة وإصلاحه الإبداعي!
توضيح: يجب كتابة كلمة المرور على لوحة المفاتيح، وليس نسخها من الحافظة (انظر قسم كيفية العمل).
أولاً، قم بالتحديث إلى KeePass 2.54 أو أحدث.
ثانيًا، إذا كنت تستخدم KeePass لفترة طويلة، فقد تكون كلمة المرور الرئيسية (وربما كلمات مرور أخرى) موجودة في ملف الصفحة/ملف المبادلة وملف السبات وملفات تفريغ الأعطال. بناءً على مستوى شكك، يمكنك التفكير في هذه الخطوات لحل المشكلة:
C:\Windows\memory.dmp، ولكن قد يكون هناك ملفات أخرى)/w على ويندوز)أو فقط اكتب فوق القرص الصلب وقم بتثبيت نظام تشغيل جديد.
قائمة غير كاملة بالمنتجات التي لا تتأثر (يرجى إنشاء طلب سحب أو مشكلة لإضافة المزيد). القاعدة العامة هي أنه إذا لم يكن التطبيق هو KeePass 2.X الأصلي المكتوب بـ .NET، فمن المحتمل أنه غير متأثر.
أداة تفريغ كلمة المرور الرئيسية لـ KeePass هي أداة إثبات مفهوم بسيطة تستخدم لتفريغ كلمة المرور الرئيسية من ذاكرة KeePass. باستثناء الحرف الأول من كلمة المرور، فهي قادرة في الغالب على استعادة كلمة المرور بنصها العادي. لا يلزم تنفيذ كود على النظام المستهدف، فقط تفريغ للذاكرة. لا يهم من أين تأتي الذاكرة - يمكن أن تكون تفريغ العملية، ملف الصفحة (pagefile.sys)، ملف السبات (hiberfil.sys)، ملفات تفريغ الأعطال المختلفة أو تفريغ ذاكرة الوصول العشوائي (RAM dump) للنظام بأكمله. لا يهم ما إذا كانت مساحة العمل مقفلة أم لا. من الممكن أيضًا تفريغ كلمة المرور من ذاكرة الوصول العشوائي بعد توقف KeePass عن العمل، على الرغم من أن فرصة نجاح ذلك تقل مع مرور الوقت منذ ذلك الحين.
تم اختبارها مع KeePass 2.53.1 على ويندوز (إنجليزية) و KeePass 2.47 على دبيان (حزمة keepass2). يجب أن تعمل أيضًا مع إصدار macOS. للأسف، تمكين خيار إدخال المفتاح الرئيسي على سطح مكتب آمن لا يساعد في منع الهجوم. قد يواجه إثبات المفهوم مشاكل مع قواعد البيانات التي تم إنشاؤها بواسطة إصدارات أقدم من KeePass، لكنني لم أتمكن من تكرار ذلك (انظر المشكلة #4).
تم تأكيد الاكتشاف بواسطة دومينيك ريشل، مؤلف KeePass، هنا. أنا أقدر استجابة دومينيك السريعة. نأمل أن يتم إصلاحه قريبًا!
git clone https://github.com/vdohney/keepass-password-dumper أو قم بتنزيله من GitHubcd keepass-password-dumperdotnet run PATH_TO_DUMPأسهل طريقة لاختبار ذلك على ويندوز هي إنشاء تفريغ عملية في مدير المهام عن طريق النقر بزر الماوس الأيمن على عملية KeePass واختيار "إنشاء ملف تفريغ".

dotnet run PATH_TO_DUMP PATH_TO_PWDLIST لإنشاء قائمة بجميع كلمات المرور المحتملة بدءًا من الحرف الثاني.يعتمد ذلك على نموذج التهديد الخاص بك. إذا كان جهاز الكمبيوتر الخاص بك مصابًا بالفعل ببرامج ضارة تعمل في الخلفية بصلاحيات المستخدم الخاص بك، فإن هذا الاكتشاف لا يجعل وضعك أسوأ بكثير. ومع ذلك، قد يكون من الأسهل للبرامج الضارة أن تكون متخفية وتتفادى برامج مكافحة الفيروسات، لأنه على عكس KeeTheft أو KeeFarce، لا يلزم حقن عملية أو أي نوع آخر من تنفيذ الكود.
إذا كان لديك شك معقول بأن شخصًا ما يمكنه الوصول إلى جهاز الكمبيوتر الخاص بك وإجراء تحليل جنائي، فقد يكون هذا سيئًا. أسوأ سيناريو هو استعادة كلمة المرور الرئيسية، على الرغم من أن KeePass مقفل أو لا يعمل على الإطلاق.
إذا كنت تستخدم تشفير القرص الكامل بكلمة مرور قوية وكان نظامك نظيفًا، فستكون بخير. لا يمكن لأحد سرقة كلمات المرور الخاصة بك عن بُعد عبر الإنترنت بهذا الاكتشاف وحده.
يستخدم KeePass 2.X مربع نص مخصص لتطوير كلمة المرور، SecureTextBoxEx. لا يُستخدم هذا المربع النصي فقط لإدخال كلمة المرور الرئيسية، ولكن في أماكن أخرى في KeePass أيضًا، مثل مربعات تحرير كلمة المرور (لذا يمكن أيضًا استخدام الهجوم لاستعادة محتوياتها).
الضعف المستغل هنا هو أنه لكل حرف يتم كتابته، يتم إنشاء سلسلة متبقية في الذاكرة. بسبب كيفية عمل .NET، يكاد يكون من المستحيل التخلص منها بمجرد إنشائها. على سبيل المثال، عند كتابة "Password"، ستنتج هذه السلاسل المتبقية: •a, ••s, •••s, ••••w, •••••o, ••••••r, •••••••d. يبحث تطبيق إثبات المفهوم في التفريغ عن هذه الأنماط ويقدم حرف كلمة المرور المحتمل لكل موضع في كلمة المرور.
يمكن أن تتأثر موثوقية هذا الهجوم اعتمادًا على كيفية كتابة كلمة المرور وعدد كلمات المرور التي تم كتابتها في الجلسة. ومع ذلك، اكتشفت أنه حتى لو كانت هناك عدة كلمات مرور في الجلسة أو أخطاء إملائية، فإن الطريقة التي يقوم بها CLR لـ .NET بتخصيص هذه السلاسل تعني أنها من المحتمل أن تكون مرتبة بشكل جيد في الذاكرة. لذا إذا تم كتابة ثلاث كلمات مرور مختلفة، فمن المحتمل أن تحصل على ثلاثة مرشحين لكل موضع حرف بهذا الترتيب، مما يجعل من الممكن استعادة جميع كلمات المرور الثلاث.
إنه إثبات مفهوم سريع، لذا من المحتمل ألا يكون موثوقًا وقويًا جدًا. يرجى إنشاء طلب سحب إذا وجدت مشكلة وأصلحتها.
حاليًا، يتم ترميز أحرف كلمة المرور المسموح بها على النحو التالي: ^[\x20-\x7E]+$ (جميع أحرف ASCII القابلة للطباعة والمسافة).
شكرًا لـ adridlug على إضافة إمكانية إنشاء قائمة كلمات المرور تلقائيًا، و ynuwenhof على إعادة هيكلة الكود.
لم أتحقق من أي منها بعد.