تقرير CVE-2023-28218
نظرة عامة على الخطأ
خطأ يؤدي إلى تصعيد الامتيازات في نواة Windows. يظهر الخطأ في برنامج التشغيل Windows Ancrillary Function Driver for WinSock (AFD.sys). تم إصدار الإصلاح في تحديث 11/04/2023. تبلغ نقاطه CVSS:3.1 7.0 / 6.1 ويُقيَّم بأنه Important.
وصف الخطأ
- نوع الخطأ:
Double fetch وInteger overflow يؤديان إلى pool overflow.
- يحدث الخطأ في الدالتين
Afd!AfdComputeCMSGLength وAfd!AfdCopyCMSGBuffer.

تستقبل هاتان الدالتان v82 كوسيط إدخال. v82 هو عنوان يتحكم فيه usermode. في الدالة Afd!AfdComputeCMSGLength، تتم الإشارة إلى هذا العنوان مباشرة للحصول على القيمة. ثم تُحسب قيمة length لمخزن CMSG وتُعاد. بعد ذلك يتم تخصيص pool بهذا الحجم. ومن خلال التحكم في وسيطي الإدخال a1 وa2، يمكننا التحكم في الحجم الذي سيُعاد في الوسيط a3.

في الدالة Afd!AfdCopyCMSGBuffer، تتم الإشارة إلى العنوان v82 مباشرة للحصول على القيمة. وبعد عدة خطوات فحص، تُستخدم هذه القيمة كحجم لعملية memmove.

تحتوي هذه الدالة على خطأ Integer overflow، وبالاقتران مع قيام الدالتين بالجلب المباشر من العنوان في جهة usermode، يمكننا تغيير قيمته أثناء التشغيل. مما يؤدي إلى إنشاء قيمة size كبيرة جدًا عند memmove. وعند النسخ إلى منطقة ذاكرة يتعذر الوصول إليها، يحدث try catch. لكن النسخ إلى مناطق الذاكرة السابقة قد حدث بالفعل. وبهذا يمكننا النسخ بالحجم الذي نريده.

- لتشغيل الـ POC، يجب أولاً إنشاء
socket بمعامل type بقيمة SOCK_DGRAM. ثم استخدام handle الخاص بهذا socket كمعامل لاستدعاء الدالة bind. وأخيراً إنشاء خيطين (thread)، حيث يقوم أحدهما باستمرار باستدعاء DeviceControl مع IOCTL بقيمة 0x120D3. يجب إعداد userbuffer مناسب لتجاوز بعض الفحوصات. بينما يقوم الخيط الآخر باستمرار بتغيير القيمة المخزنة في عنوان usermode الذي يُستخدم كمعامل للدالتين المذكورتين.
الاستغلال
- مع هذا الخطأ، يمكننا تنفيذ overflow على pool من نوع non-paged NX بحجم وبيانات يمكن التحكم بها بالكامل من جهة usermode.
- اتجاه الاستغلال هو عمل spray للعديد من كائنات Namedpipe، ثم تحرير بعض الكائنات لإنشاء ثغرات (holes) في الـ heap. بعد ذلك، إنشاء pool بعد حساب الحجم من الدالة
Afd!AfdComputeCMSGLength، ويجب أن يطابق هذا الحجم حجم كائن Namedpipe. عندها سيتم تخصيص الـ pool في الكائنات التي تم تحريرها للتو. نستخدم الخطأ لتجاوز (overflow) كائنات Namedpipe المجاورة، ومن ثم نستخدم آليات Namedpipe للحصول على صلاحية قراءة/كتابة ذاكرة kernel. نقرأ token لعملية النظام ثم نكتبه في token للعملية الحالية.
النطاق المتأثر
- Windows Server 2012 R2 (Server Core installation) build قبل 6.3.9600.20919
- Windows Server 2012 R2 build قبل 6.3.9600.20919
- Windows Server 2012 (Server Core installation) build قبل 6.2.9200.24216
- Windows Server 2012 build قبل 6.2.9200.24216
- Windows Server 2008 R2 for x64-based Systems Service Pack 1 (Server Core installation) build قبل 6.1.7601.26466
- Windows Server 2008 R2 for x64-based Systems Service Pack 1 build قبل 6.1.7601.26466
- Windows Server 2008 for x64-based Systems Service Pack 2 (Server Core installation) build قبل 6.0.6003.22015
- Windows Server 2008 for x64-based Systems Service Pack 2 build قبل 6.0.6003.22015
- Windows Server 2008 for 32-bit Systems Service Pack 2 (Server Core installation) build قبل 6.0.6003.22015
- Windows Server 2008 for 32-bit Systems Service Pack 2 build قبل 6.0.6003.22015
- Windows Server 2016 (Server Core installation) build قبل 10.0.14393.5850
- Windows Server 2016 build قبل 10.0.14393.5850
- Windows 10 Version 1607 for x64-based Systems build قبل 10.0.14393.5850
- Windows 10 Version 1607 for 32-bit Systems build قبل 10.0.14393.5850
- Windows 10 for x64-based Systems build قبل 10.0.10240.19869
- Windows 10 for 32-bit Systems build قبل 10.0.10240.19869
- Windows 10 Version 22H2 for 32-bit Systems build قبل 10.0.19045.2846
- Windows 10 Version 22H2 for ARM64-based Systems build قبل 10.0.19045.2846
- Windows 10 Version 22H2 for x64-based Systems build قبل 10.0.19045.2846
- Windows 11 Version 22H2 for x64-based Systems build قبل 10.0.22621.1555
- Windows 11 Version 22H2 for ARM64-based Systems build قبل 10.0.22621.1555
- Windows 10 Version 21H2 for x64-based Systems build قبل 10.0.19044.2846
- Windows 10 Version 21H2 for ARM64-based Systems build قبل 10.0.19044.2846
- Windows 10 Version 21H2 for 32-bit Systems build قبل 10.0.19044.2846
- Windows 11 version 21H2 for ARM64-based Systems build قبل 10.0.22000.1817
- Windows 11 version 21H2 for x64-based Systems build قبل 10.0.22000.1817
- Windows 10 Version 20H2 for ARM64-based Systems build قبل 10.0.19042.2846
- Windows 10 Version 20H2 for 32-bit Systems build قبل 10.0.19042.2846
- Windows 10 Version 20H2 for x64-based Systems build قبل 10.0.19042.2846
- Windows Server 2022 (Server Core installation) build قبل 10.0.20348.1668
- Windows Server 2022 build قبل 10.0.20348.1668
- Windows Server 2019 (Server Core installation) build قبل 10.0.17763.4252
- Windows Server 2019 build قبل 10.0.17763.4252
- Windows 10 Version 1809 for ARM64-based Systems build قبل 10.0.17763.4252
التصحيح
- تم إصلاح الخطأ عن طريق استبدال الدالتين القديمتين بدالتين جديدتين، حيث أُضيفت اللاحقة
_old إلى نهاية أسماء الدوال القديمة. هذه الدوال الجديدة قد. في الدالتين الجديدتين، ورغم بقاء double fetch، فإن القيمة التي يتم جلبها تُفحص قبل استخدامها. وتُستخدم دوال Rtl لاستبدال العمليات الحسابية، لمنع Integer overflow.
الخلاصة
- نطاق تأثر الخطأ واسع جدًا ويهدد العديد من الأنظمة. ومع ذلك، لا يزال payload الاستغلال عند تشغيله يحمل نسبة صغيرة من الفشل تؤدي إلى انهيار Windows بسبب spray الـ heap. بالإضافة إلى ذلك، بعد تصعيد صلاحيات عملية cmd إلى System، فإن إنهاء هذه العملية سيؤدي أيضًا إلى انهيار Windows، لأن عملية الاستغلال تسببت في إتلاف كائن Namedpipe.
المرفقات
- POC مصغّر

- POC الاستغلال
