
استغلال نواة ويندوز لـ CVE-2021-1732، وهو ثغرة استخدام بعد التحرير في win32kfull.sys تتيح رفع الامتيازات المحلية عبر إنشاء نافذة مصممة خصيصًا وتلاعب بالاستدعاءات.
win32kfull!NtUserCreateWindowEx لبرنامج تشغيل الرسومات في Windows، حيث يوجد عدم تزامن بين استدعاء النواة لتخصيص الذاكرة في وضع المستخدم وإعداد خاصية tagWND->flag، مما يتسبب في ثغرة. هذا يسمح بتزوير قيمة tagWND->offset مما يؤدي إلى تجاوز سعة الذاكرة.win32kfull.sys الدالة NtUserCreateWindowEx لإنشاء نافذة، فإنه يتحقق من tagWND->cbWndExtra (عدد الذاكرة الإضافية المخصصة لمثيل النافذة). إذا كانت القيمة غير فارغة، فإنه يستدعي الدالة win32kfull!xxxClientAllocWindowClassExtraBytes التي تعيد الاتصال بطبقة المستخدم user32.dll!__xxxClientAllocWindowClassExtraBytes لتخصيص مساحة. يتم تعديل المكدس باستخدام الدالة NtCallbackReturn بعد التخصيص، ثم يعود إلى طبقة النواة ويحفظ القيمة ويستمر التشغيل. وعندما تحتوي قيمة tagWND->flag على الخاصية 0x800، تصبح القيمة المحفوظة عبارة عن إزاحة (offset).user32.dll!_xxxClientAllocWindowClassExtraBytes واستدعاء NtUserConsoleControl لتعديل tagWND->flag بحيث تحتوي على الخاصية 0x800، ثم استخدام NtCallbackReturn لإرجاع قيمة مخصصة إلى tagWND->offset في النواة.win32kfull!NtUserCreateWindowEx لبرنامج تشغيل الرسومات في Windows.win32kfull.sys الدالة NtUserCreateWindowEx لإنشاء نافذة، فإنه يتحقق من tagWND->cbWndExtra (عدد الذاكرة الإضافية المخصصة لمثيل النافذة). إذا كانت القيمة غير فارغة، فإنه يستدعي الدالة win32kfull!xxxClientAllocWindowClassExtraBytes التي تعيد الاتصال بطبقة المستخدم user32.dll!__xxxClientAllocWindowClassExtraBytes لإنشاء الذاكرة. يتم تعديل المكدس باستخدام الدالة NtCallbackReturn بعد التخصيص، ثم يعود إلى طبقة النواة ويحفظ القيمة ويستمر التشغيل. وعندما تحتوي قيمة tagWND->flag على الخاصية 0x800، يتم استخدام الإزاحة (offset) للوصول إلى القيمة.NtUserConsoleControl لتعديل flag بحيث يحتوي على الخاصية 0x800.17763:[[gpKernelHandleTable] + 0x18 * ((hwnd->cx * [gSharedInfo+0x10]) >> 5)]
يذكر أن استدعاء NtUserConsoleControl يعيد تعيين قيم tagWND->offset و tagWND->flag بحيث تحتوي على الخاصية 0x800. الخاصية 0x800 في قيمة flag تعني استخدام الإزاحة للوصول. هدفنا من استدعاء NtUserConsoleControl حالياً هو تعديل قيمة tagWND->flag لتشمل الخاصية 0x800، ثم استدعاء الدالة NtCallbackReturn لإرجاع قيمة محددة بهدف إعادة تعديل tagWND->offset، لأن الدالة win32kfull!xxxClientAllocWindowClassExtraBytes تضع القيمة المرجعة في tagWND->offset.
+0x058 KernelCallbackTable : 0x00007ffb0e9d1070 Void
00007ffb0e9d1448`