
PoC لـ CVE-2018-7249
تم اكتشاف ثغرة في ملف secdrv.sys كما هو مضمّن في Microsoft Windows Vista وWindows 7 وWindows 8 وWindows 8.1 قبل KB3086255، وكما هو مضمّن في Macrovision SafeDisc. يمكن لاستدعاءين موقوتين بعناية لـ IOCTL 0xCA002813 أن يسببا حالة سباق تؤدي إلى استخدام بعد التحرير (use-after-free). عند استغلالها، يمكن لمهاجم غير مميز تشغيل كود عشوائي في النواة.
تم إبلاغ Microsoft بهذه الثغرة، وبما أنها لا تؤثر على جهاز Windows محدّث (فقط الإصدارات السابقة لـ KB3086255)، لن يتخذوا أي إجراء. تم اختبارها واستغلالها بنجاح على Windows 7 x86.
يرتبط أيضًا بـ CVE-2018-7250.

توثق هذه الصفحة بحثي الصغير حول برنامج التشغيل secdrv.sys. جميع السلوكيات الموصوفة لبرنامج التشغيل تم استنتاجها عبر الهندسة العكسية وقد تكون غير صحيحة / غير دقيقة.
الإزاحة 0x4 من المخزن المؤقت للإدخال إلى IOCTL (0x0CA002813) تحتوي على رقم سأشير إليه باسم TYPE. تستقبل دالة المعالج الرئيسية لهذا IOCTL (0x0CA002813)، وهي sub_11A88، ثلاثة أنواع مختلفة: 0x96 و0x97 و0x98.
بعد أن يخصص IOCTL من النوع 0x96 كتلة جديدة ويهيئها، ولكن ليس بشكل كامل، ينسخ الكتلة إلى وضع المستخدم. 16 بت في الكتلة المخصصة حديثًا لم تتم تهيئتها، وتحتوي على بيانات من تخصيصات PagedPool السابقة. ثم تُنسخ البتات غير المهيأة إلى وضع المستخدم عند .text:00011BE9 بواسطة تعليمة REP MOVSD. كود إثبات المفهوم هنا.
عند استدعاء IOCTL من النوع 0x97، فإنه يجد الكتلة المطلوبة، التي تم تخصيصها مسبقًا بالنوع 0x96، عن طريق وسمها. إذا كانت الكتلة قد حُررت بالفعل بواسطة IOCTL من النوع 0x97، يقوم DeviceIoControl بإرجاع خطأ. الثغرة هنا هي أن الكتلة المستخدمة بواسطة النوع 0x97 يمكن تحريرها أثناء عملها (نظرًا لعدم استخدام آليات مزامنة)، وبالتالي يتم استخدامها بعد تحريرها إذا تم كسب السباق. إذا تمكن المهاجم من تحرير الكتلة أثناء عمل IOCTL من النوع 0x97 (باستخدام النوع 0x98)، وتخصيص كتلة جديدة يتحكم فيها في نفس موقع الذاكرة تمامًا، فيمكنه استبدال مؤشر إلى بنية أخرى، تحتوي على مؤشر دالة يمكن استخدامه في النهاية لاختطاف تدفق تنفيذ برنامج التشغيل وتنفيذ كود عشوائي في ring 0. نظرًا لأن روتين التشفير يتم على مخزن مؤقت مقدم من المستخدم، والذي يمكن أن يكون ضخمًا في الحجم، فقد يستغرق التشفير وقتًا طويلاً للتنفيذ، مما يوفر نافذة زمنية مثالية لـ IOCTL من النوع 0x98 لتحرير الكتلة بينما لا تزال قيد الاستخدام. يمكن أن تكون النوافذ الزمنية طويلة جدًا (أكثر من ثانية واحدة!)، بحيث يمكن كسب السباق بشكل موثوق من المحاولة الأولى. يبدأ استخدام بعد التحرير عند .text:00011B68، والاستدعاء الفعلي، الذي سيتم اختطافه للقفز إلى shellcode، يحدث عند .text:00011B86.
الخطوات المتخذة لاستغلال هذه الثغرة بنجاح هي كما يلي:
نظام التشغيل: Windows 7 Kernel Version 7600 MP (1 procs) Free x86 compatible Built by: 7600.16385.x86fre.win7_rtm.090713-1255 الجهاز الافتراضي: 4GB RAM, 1 CPU العتاد: Windows 10 Pro 64 bit, Motherboard Gigabyte Z370 HD3, 16GB RAM, Intel i5-8400 2.80GHz (6 CPUs)