
تحليل معمّق لثغرة الارتباك النوعي (Type Confusion) في Windows CLFS (CVE-2022-24481) مع شرح السبب الجذري، وتدفّق الاستغلال، وتفاصيل أدوات النواة (Kernel Gadgets)، وإثبات مفهوم (PoC) عملي لتصعيد الصلاحيات محليًا.
خلط الأنواع (Type Confusion)
clfs.sys
نظرًا لأن منطق التحقق من rgContainers[0] ليس صارمًا، فبعد تزوير rgContainers[0]، يتداخل ClientContext مع بنية ContainerContext. إذا تم قبول البيانات المزورة، فبعد CloseHandle، يقوم CClfsLogFcbPhysical::FlushMetadata باستعادة بيانات ClientContext.
بعد تزوير rgContainers[0]، يتداخل ClientContext مع بنية ContainerContext. إذا تم قبول البيانات المزورة، فبعد CloseHandle، يقوم CClfsLogFcbPhysical::FlushMetadata باستعادة بيانات ClientContext. نظرًا لتداخل البنيتين، تعمل هذه العملية على تغيير ContainerContext->pContainer إلى البيانات المزورة. أخيرًا، عند استدعاء CClfsBaseFilePersisted::RemoveContainer، يتم تشغيل استدعاء دالة عضو غير مباشر، وتنفيذ أداة (gadget) محددة، مما يؤدي إلى تصعيد الامتيازات.
يقوم createlog بإنشاء ملف سجل جديد.
أضف إدخال Container.
أنشئ رابطًا رمزيًا X:\ يشير إلى الدليل الحالي.
امسح النطاق cbSymbolName_start -> cbSymbolName_end.
اضبط cbSymbolName_start على X:\N.
انسخ البيانات الموجودة في ContainerContext_start -> New_cbSymbolName_end إلى ClientContext.
حدّث rgContainers[0] بحيث يشير إلى موقع ContainerContext_start الجديد.
حدّث قيمة ContainerContext->pContainer الجديدة.
أعد حساب المجموع الاختباري (checksum).
حدد عنوان الأداة (gadget) في ذاكرة النواة.
ابنِ الجدول الافتراضي المزور.
أكمل إعداد الذاكرة المتبقي.
CClfsLogFcbPhysical::Initialize
يخزن 00000001C0002EDB بيانات ClientContext.
بعد CloseHandle، يعمل CClfsRequest::Cleanup->CClfsLogFcbPhysical::FlushMetadata.
يقوم بنسخ البيانات المزورة مرة أخرى إلى ClientContext. نظرًا لأن ClientContext يتداخل مع ContainerContext، يتم استبدال ContainerContext->pContainer بالبيانات المزورة.
بعد ذلك ينفذ CClfsBaseFilePersisted::RemoveContainer الأداة الخاصة بنا، مما يؤدي إلى كتابة 16 بايت إلى عنوان عشوائي.
https://zhuanlan.zhihu.com/p/645490730
https://github.com/fr4nkxixi/CVE-2022-24481-POC
https://securelist.com/windows-clfs-exploits-ransomware-cve-2022-24521/111580/
https://starmap.dbappsecurity.com.cn/blog/articles/2022/05/10/cve-2022-24481/
https://www.4awl.net/9646.html
win10_21H2_19044.1620
روتين تهيئة CClfsLogFcbPhysical::Initialize(0x??7c) لفتح الملف
bp clfs!CClfsLogFcbPhysical::Initialize + 0x45F
يقوم هذا الكود بتخزين ذاكرة ClientContext.

بعد CloseHandle، يتم تنفيذ CClfsRequest::Cleanup->CClfsLogFcbPhysical::FlushMetadata.
bp clfs!CClfsLogFcbPhysical::FlushMetadata + 0x46
يقوم هذا باستعادة بيانات ClientContext.

CClfsBaseFilePersisted::RemoveContainer
bp clfs!CClfsBaseFilePersisted::RemoveContainer + 0x10F
استخدم مؤشر الجدول الافتراضي المزور للوصول إلى الأداة.

لاحظ أنه إذا فشل الملف المزور، فسيفشل فتح الملف وسيكشف GetLastError السبب. في هذه الحالة، لا يمكن متابعة تدفق الاستغلال.
CClfsBaseFilePersisted::RemoveContainer

CLFS!ClfsEarlierLsn
nt!SeSetAccessStateGenericMapping

nt!SeSetAccessStateGenericMapping

movdqu xmmword ptr [rax+8], xmm0 يكتب 16 بايت إلى [rax+8] (XMMWORD، 128 بت).
بعد التنفيذ المتسلسل، تكون النتيجة كتابة البيانات ذات الـ16 بايت من poi(rdx) 0xFFFFFFFF إلى poi(poi(rcx+0x48)+0x8).
rcx هو موقع مؤشر الجدول الافتراضي، وهذا الموقع تحت سيطرتنا.
https://github.com/uname1able/CVE-2022-24481.git
winver
win10_21H2_19044.1620

bp clfs!CClfsBaseFilePersisted::RemoveContainer + 0x10F
winver
win11_21H2_22000.593

bp clfs!CClfsBaseFilePersisted::RemoveContainer + 0x183