
विंडोज कर्नेल शोषण CVE-2021-1732 के लिए, win32kfull.sys में एक use-after-free जो कस्टम विंडो निर्माण और कॉलबैक हेरफेर के माध्यम से स्थानीय विशेषाधिकार वृद्धि सक्षम करता है।
win32kfull!NtUserCreateWindowEx फ़ंक्शन में कर्नेल कॉलबैक यूज़र-मोड मेमोरी आवंटन और tagWND->flag गुण सेटिंग के बीच सिंक्रोनाइज़ेशन की कमी के कारण उत्पन्न होती है। इससे tagWND->offset मान को गलत साबित करके मेमोरी में बाउंड से बाहर जाना संभव हो जाता है।win32kfull.sys NtUserCreateWindowEx को कॉल करके विंडो बनाता है, तो यह tagWND->cbWndExtra (विंडो इंस्टेंस के लिए अतिरिक्त आवंटित मेमोरी की संख्या) की जाँच करता है। यदि यह मान गैर-शून्य है, तो यह win32kfull!xxxClientAllocWindowClassExtraBytes फ़ंक्शन को कॉल करता है जो यूज़र-लेयर user32.dll!__xxxClientAllocWindowClassExtraBytes को कॉलबैक करके स्पेस आवंटित करता है। आवंटित पते को NtCallbackReturn फ़ंक्शन का उपयोग करके स्टैक को ठीक करने के बाद कर्नेल लेयर पर वापस लौटाया जाता है, सहेजा जाता है और निष्पादन जारी रहता है। जब tagWND->flag मान में 0x800 गुण शामिल होता है, तो यह सहेजा गया मान एक ऑफसेट बन जाता है।user32.dll!_xxxClientAllocWindowClassExtraBytes फ़ंक्शन को हुक कर सकते हैं, NtUserConsoleControl को कॉल करके tagWND->flag में 0x800 गुण जोड़ सकते हैं, और फिर NtCallbackReturn का उपयोग करके कर्नेल के tagWND->offset में एक कस्टम मान लौटा सकते हैं।win32kfull!NtUserCreateWindowEx में होती है।win32kfull.sys NtUserCreateWindowEx को कॉल करता है, तो यह tagWND->cbWndExtra की जाँच करता है। यदि गैर-शून्य है, तो win32kfull!xxxClientAllocWindowClassExtraBytes को कॉल करके यूज़र लेयर user32.dll!__xxxClientAllocWindowClassExtraBytes के माध्यम से मेमोरी आवंटित की जाती है। आवंटित पते को NtCallbackReturn से स्टैक ठीक करने के बाद कर्नेल पर वापस भेजा जाता है, सहेजा जाता है और निष्पादन जारी रहता है। जब tagWND->flag में 0x800 गुण होता है, तो उस मान के लिए ऑफसेट एड्रेसिंग का उपयोग किया जाता है।NtUserConsoleControl का उपयोग करके flag में 0x800 गुण जोड़ा जाता है।17763:[[gpKernelHandleTable] + 0x18 * ((hwnd->cx * [gSharedInfo+0x10]) >> 5)]
यह उल्लेख किया गया है कि NtUserConsoleControl को कॉल करने से tagWND->offset और tagWND->flag मान (जिसमें 0x800 गुण शामिल है) रीसेट हो जाते हैं। flag मान में 0x800 गुण होने पर ऑफसेट एड्रेसिंग का उपयोग किया जाता है। वर्तमान कॉल में NtUserConsoleControl का उद्देश्य tagWND->flag मान में 0x800 गुण जोड़ना है, और फिर NtCallbackReturn फ़ंक्शन को एक निर्दिष्ट मान लौटाने के लिए कॉल करना है ताकि tagWND->offset को फिर से सेट किया जा सके, क्योंकि win32kfull!xxxClientAllocWindowClassExtraBytes रिटर्न वैल्यू को tagWND->offset में डालता है।
+0x058 KernelCallbackTable : 0x00007ffb0e9d1070 Void
00007ffb0e9d1448`