
Windows CLFS टाइप कन्फ्यूज़न (CVE-2022-24481) का गहन विश्लेषण, जिसमें मूल-कारण स्पष्टीकरण, शोषण प्रवाह, कर्नेल गैजेट विवरण और कार्यशील स्थानीय विशेषाधिकार वृद्धि PoC शामिल है।
टाइप कन्फ्यूज़न
clfs.sys
क्योंकि rgContainers[0] के लिए सत्यापन तर्क सख्त नहीं है, rgContainers[0] को जाली बनाने के बाद, ClientContext, ContainerContext संरचना के साथ ओवरलैप हो जाता है। यदि नकली डेटा स्वीकार कर लिया जाता है, तो CloseHandle के बाद, CClfsLogFcbPhysical::FlushMetadata ClientContext डेटा को पुनर्स्थापित करता है।
rgContainers[0] को जाली बनाने के बाद, ClientContext, ContainerContext संरचना के साथ ओवरलैप हो जाता है। यदि नकली डेटा स्वीकार किया जाता है, तो CloseHandle के बाद, CClfsLogFcbPhysical::FlushMetadata ClientContext डेटा को पुनर्स्थापित करता है। चूँकि संरचनाएँ ओवरलैप होती हैं, यह प्रक्रिया ContainerContext->pContainer को जाली डेटा में बदल देती है। अंत में, जब CClfsBaseFilePersisted::RemoveContainer कॉल किया जाता है, तो यह एक अप्रत्यक्ष सदस्य-फ़ंक्शन कॉल को ट्रिगर करता है, एक विशिष्ट गैजेट निष्पादित करता है, और विशेषाधिकार वृद्धि की ओर ले जाता है।
createlog एक नई लॉग फ़ाइल बनाता है।
एक Container प्रविष्टि जोड़ें।
एक सिम्बोलिक लिंक X:\ बनाएँ जो वर्तमान निर्देशिका की ओर इंगित करता है।
cbSymbolName_start -> cbSymbolName_end रेंज को साफ़ करें।
cbSymbolName_start को X:\N पर सेट करें।
ContainerContext_start -> New_cbSymbolName_end में मौजूद डेटा को ClientContext में कॉपी करें।
rgContainers[0] को अपडेट करें ताकि यह नए ContainerContext_start स्थान को इंगित करे।
नए ContainerContext->pContainer मान को अपडेट करें।
चेकसम की पुनर्गणना करें।
कर्नेल मेमोरी में गैजेट एड्रेस ढूँढें।
नकली वर्चुअल टेबल बनाएँ।
शेष मेमोरी सेटअप करें।
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 निर्देश [rax+8] पर 16 बाइट लिखता है (XMMWORD, 128 बिट)।
अनुक्रमिक निष्पादन के बाद, परिणाम यह होता है कि poi(rdx) 0xFFFFFFFF से 16-बाइट डेटा 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