
تقرير وPOC لـ CVE-2020-0753 و CVE-2020-0754 وست ثغرات DOS مُصلحة في Window.
خدمة الإبلاغ عن أخطاء Windows (WER) قامت بإصلاح ثغرتين لرفع الامتيازات في آخر Patch Tuesday، وقد تم تخصيص الثغرتين بـ CVE-2020-0753 و CVE-2020-0754. تستغل كلتا الثغرتين ثغرة حالة سباق في عمليات نظام الملفات في الخدمة. ومع ذلك، فإن هاتين الثغرتين ليستا سهلة الاستغلال بسبب نوافذ السباق الصغيرة ومواقع إسقاط الملفات غير المؤكدة. هنا نشارك تقنياتنا لاستغلالهما.
السبب الجذري لثغرتي السباق موضح في تقاريرنا، ويمكن التعبير عن السبب الفعلي بأنه المتوقع ضعيف. عندما تقوم خدمة WER بمعالجة الملفات المؤقتة، فإنها تتعامل مع موقع الملف C:\ProgramData\Microsoft\Windows\WER\Temp، وهو دليل قابل للقراءة والكتابة للمستخدمين الموثوقين. وهذا يعني أن مستخدمًا عاديًا من مستوى التكامل المتوسط (medium-IL) يمكنه استبدال ملف تم إنشاؤه بواسطة خدمة WER، وحتى تحويله إلى رابط نظام ملفات لإتلاف/حذف ملفات أخرى لم يكن قادرًا على لمسها.
للحفاظ على سلامة عمليات الملفات، تعتمد خدمة WER على واجهة برمجة تطبيقات قياسية تسمى GetTempFileNameW وتغليفها بـ wersvc.dll->UtilGetTempFile، ستساعد واجهة API هذه خدمة WerSvc على إنشاء اسم ملف عشوائي غير مشغول بالصيغة "WER****.tmp"،
يتم إنشاء الجزء العشوائي من اسم الملف برقم سداسي عشري مكون من 4 بايت، من 0000 إلى FFFF، إذا تم أخذ رقم لإنشاء ملف، ستأخذ واجهة API اسم ملف عشوائي آخر.
من الواضح أن الاستراتيجية بها ثغرة إذا قام شخص بإنشاء 65535 ملفًا باسم من WER0000.tmp إلى
WERFFFE.tmp، ستختار واجهة API رقمًا عشوائيًا وتختبر اسم الملف لمعرفة ما إذا كان موجودًا، مثل WERA560.tmp، ستجد أن الملف موجود بالفعل، وبالتالي ستستمر في الاختبار من WERA560.tmp حتى WERFFFF.tmp، وأثناء استمرار الاختبار، تظهر نافذة تحضيرية لأننا وجدنا طريقة لجعل WerSvc يتعطل في استدعاء GetTempFileNameW لمدة 4-5 ثوانٍ، وهي فجوة زمنية كبيرة نسبيًا. في هذه الأثناء، نجبر الخدمة على إنشاء ملف مؤقت باسم ملف ثابت، وهو
WERFFFF.tmp.
بعد أن تقوم الخدمة بإنشاء الملف المؤقت المسمى WERFFFF.tmp، تقوم واجهة API تلقائيًا
بإغلاق المقبض (handle) الذي تمسك به للملف، وإرجاع اسم الملف إلى الخدمة لإجراء عمليات أخرى على الملف، وهذه هي النقطة التي تقدم الثغرة. تتحقق ثلاثة شروط:
الملف الذي تم إنشاؤه بواسطة الخدمة موجود في موقع يمكن للمستخدم العادي التحكم فيه.
تغلق الخدمة جميع المقابض (handles) التي تحتفظ بها للملف.
ستستخدم الخدمة الملف لاحقًا (الكتابة أو الحذف).
هنا ستقوم الخدمة بكتابة محتويات في الملف وحذفه. كل من الكتابة والحذف سيؤديان إلى رفع الامتيازات من خلال استغلال روابط نظام الملفات وتقنيات استغلال معينة.
لتحويل الثغرة إلى حذف ملف تعسفي، نستخدم بشكل إبداعي وصلات دليل متعددة (directory junctions) لإكمال الاستغلال. يحتوي استغلالنا على الخطوات التالية:
WER***.tmp في $pwd\1\، ونقوم بعمل junction $pwd\2\ -> $pwd\1\;$pwd\2\. ونقوم بإنشاء عملية أخرى لتنفيذ الأمر SetOplock $pwd\1\WERFFFF.tmp باستمرار;$pwd\2\ -> \RPC CONTROL\، ثم نقوم بإنشاء رمز كائن (object symbolic) \RPC CONTROL\WERFFFF.tmp -> $target و \RPC CONTROL\WERFFFF.tmp.etl -> $targetتم توفير الاستغلال التفصيلي وPOC في WERReport-CVE-2020-0753.
من خلال استغلال الثغرة في GetTempFileNameW، نحصل على موقع يمكن التنبؤ به حيث ستتعامل الخدمة؛ وباستخدام وصلات دليل متعددة المستويات، نجعل حالة السباق قابلة للاستغلال بشكل موثوق.
في الوقت نفسه، لاحظنا أن هذا النوع من ثغرات السباق يمكن أن يسبب أيضًا مشكلة استبدال ملف، مما قد يؤدي إلى ثغرات رفع الامتيازات في ظل ظروف معينة.
لشرح السبب وراء إمكانية تحويل إفساد ملف تعسفي (إذا كان بإمكانك التحكم في جزء صغير جدًا من محتوى الملف: أقل من 63 بايت) إلى EoP (رفع الامتيازات)، نحتاج إلى الانتباه إلى آلية عمل Windows Defender.
يمتلك Windows Defender قاعدة بيانات لتوقيعات البرامج الضارة. إذا احتوى ملف على بعض توقيعات البرامج الضارة، فسيعتبره Defender برنامجًا ضارًا ويحذفه. ومع ذلك، ستؤدي هذه الميزة إلى سطح هجوم إضافي. على سبيل المثال، في WCTF2019 صمم @icchy من tokyowesterns تحديًا لنظام Windows في CTF باسم "Gyotaku The Flag"، والذي يستخدم هذه الميزة كأوراكل لتسريب المعلومات.
هنا نستفيد من هذه الميزة في Windows Defender لحذف ملف تعسفي إذا كان لدينا إفساد ملف تعسفي مع تحكم جزئي في محتوى الملف. يمكننا فقط كتابة توقيع برنامج ضار في ملف وتشغيل فحص افتراضي بواسطة Windows Defender، سيتم وضع الملف في منطقة العزل الخاصة بـ Defender، والتي يمكن لمستخدم عادي (أي مستخدم غير مسؤول من مستوى تكامل متوسط (medium-IL) حذفه ببساطة عن طريق تشغيل عملية الفحص مرتين.
لذا يمكن تحويل ثغرة إفساد ملف تعسفي إلى حذف ملف تعسفي طالما يمكن وضع سلسلة توقيع برنامج ضار في الملف الهدف باستخدام الثغرة.
إفساد الملف الهدف باستخدام ثغرة، ووضع سلسلة مميزة يمكن لـ Windows Defender التعرف عليها فيه.
تشغيل Windows Defender لفحص الملف الهدف، مما يتسبب في عزله.
تشغيل الفحص مرة أخرى، سيتم حذف الملف الهدف.
من خلال استخدام هذه التقنية، نحصل على حذف ملف تعسفي بمساعدة Defender.
يمكن استغلال حذف الملف التعسفي بسهولة أكبر للحصول على امتيازات إضافية.
Microsoft OneDrive هي حزمة تطبيق توفر خدمة تخزين سحابي شخصي،
تم دمج هذا التطبيق مع Windows كخيار تثبيت افتراضي منذ Windows 8. أثناء بحثنا، تم العثور على 6 ثغرات في مهام الخدمة المجدولة لـ OneDrive وتقديمها إلى MSRC.
إليك جدول الثغرات التي سنكشف عنها في مهام OneDrive المجدولة ذات الصلة:
جميع الثغرات الست ناتجة عن معالجة الخدمة بشكل غير صحيح للروابط الصلبة (hardlinks) والروابط الرمزية (symlinks) أثناء العمل في مواقع يمكن للمستخدم العادي التحكم بها. أثناء استغلال هذه الثغرات، تأتي الصعوبة من أن اسم الملف يحتوي عادةً على معرف العملية (pid) للعملية الحالية أو طابع زمني يشير إلى وقت تشغيل الملف. يمكن حل كليهما عن طريق تعيين Oplock على ملف DLL فريد ستحاول الخدمة تحميله عند تشغيلها، حيث لدينا القدرة على الحصول على كل ما نحتاجه للتنبؤ باسم الملف الذي ستحاول الخدمة التعامل معه لاحقًا. تم توفير مثال POC في دليل FileSyncConfigTemp_hardlink.
جميع الثغرات الست المذكورة أعلاه مقدمة مع تقرير كامل وبرنامج POC، على الرغم من أن معظم الثغرات تسبب إفساد ملف تعسفي في المقام الأول، إلا أن هذا النوع من الثغرات لا يزال يسبب تعطل النظام (عن طريق استبدال ملف تكوين نظام حاسم)، وكلها ستتطلب إعادة تثبيت Windows. وبالتالي تفي بمعيار نوع ثغرة رفض الخدمة (DoS) في نظام Windows.
بالإضافة إلى ذلك، يمكن لهذا النوع من الثغرات أن يسبب رفع الامتيازات في سياق معين. ناقشنا تقنية الاستغلال التي يمكنها استغلال مشكلة استبدال ملف تعسفي لتحقيق عملية حذف ملف تعسفي أساسية، وبالتالي يمكن تحقيق رفع الامتيازات.
Zhiniang Peng of Qihoo 360 Core Security
02 فبراير 2020: تم الإبلاغ عن الثغرات
08 فبراير 2020: قام MSRC بالتحقيق والرد بشأن الثغرات الست في OneDrive التي قدمناها، وكان استنتاجهم هو عدم الإصلاح بسبب مطلوب تفاعل كبير من المستخدم / صعوبة بناء استغلال موثوق.
08 فبراير 2020: ردينا: لا حاجة لتفاعل المستخدم. كل ما عليك فعله هو انتظار تشغيل المهمة المجدولة. لذا، هذا السيناريو نموذجي.
11 فبراير 2020: رد MSRC: كيف تحصل على الملف المحدد على جهاز المستخدم؟ وهل تضع كل اختلاف من ذلك الملف في ذلك المجلد؟ هل يجب أن يتطابق بالضبط مع التاريخ/الساعة/PID؟ لهذه الأسباب يبدو أن هذا يتطلب جهدًا كبيرًا من المستخدم.
11 فبراير 2020: ردينا: POC الخاص بنا هو نسخة مبسطة. لتقليل جهد التنبؤ باسم الملف. في الواقع، تحتاج فقط إلى تعيين Oplock. ثم يمكنك الحصول على كل من {pid} و{hour} و{data}. لذا، لا حاجة لتفاعل المستخدم.
12 فبراير 2020: سؤال: هل يمكننا نشر التقرير لهذه الثغرات الست.
13 فبراير 2020: رد MSRC: يمكنك نشر التقرير.
22 فبراير 2020: تم نشر التفاصيل.
تحديث الحالة: جميع الثغرات الست حصلت على إصلاح في Patch Tuesday مارس 2020.
| البرنامج الضعيف | النوع | POC المقدم |
|---|
| FileSyncConfig.exe | HardLink | نعم |
| FileSyncHelper.exe | HardLink | نعم |
| OneDriveFileSyncConfig.exe | SymLink | نعم |
| OneDriveSetup.exe | HardLink | نعم |
| OneDriveSetup.exe | HardLink | نعم |
| OneDriveStandaloneUpdater.exe | HardLink | نعم |