Report CVE-2023-28218
Bug अवलोकन
यह बग Windows kernel में विशेषाधिकार वृद्धि (privilege escalation) का कारण बनता है। यह बग ड्राइवर Windows Ancillary Function Driver for WinSock (AFD.sys) में मौजूद है। यह बग 11/04/2023 के पैच में जारी किया गया था। इसका CVSS:3.1 7.0 / 6.1 स्कोर है और इसे Important के रूप में मूल्यांकित किया गया है।
Bug विवरण
- त्रुटि का प्रकार:
Double fetch और Integer overflow जो pool overflow की ओर ले जाता है।
- त्रुटि
Afd!AfdComputeCMSGLength और Afd!AfdCopyCMSGBuffer फ़ंक्शन में होती है।

ये दोनों फ़ंक्शन इनपुट पैरामीटर के रूप में v82 प्राप्त करते हैं। v82 एक पता है जो usermode द्वारा नियंत्रित होता है। Afd!AfdComputeCMSGLength फ़ंक्शन में, इस पते को सीधे संदर्भित किया जाता है ताकि इसका मान प्राप्त किया जा सके। फिर CMSG बफर की लंबाई की गणना की जाती है और वापस किया जाता है। इसके बाद इस आकार के अनुसार एक पूल आवंटित किया जाता है। दो इनपुट पैरामीटर a1 और a2 को नियंत्रित करके, हम a3 पैरामीटर में लौटाए जाने वाले आकार को नियंत्रित कर सकते हैं।

Afd!AfdCopyCMSGBuffer फ़ंक्शन में, पता v82 को सीधे संदर्भित करके मान प्राप्त किया जाता है। कुछ जाँचों के बाद, यह मान memmove ऑपरेशन के आकार के रूप में उपयोग किया जाता है।

इस फ़ंक्शन में एक Integer overflow त्रुटि है, और इस तथ्य के साथ कि दोनों फ़ंक्शन usermode पक्ष के पते से सीधे fetch करते हैं, हम रनटाइम पर इसका मान बदल सकते हैं। इससे memmove के लिए एक बहुत बड़ा आकार बनता है। जब एक दुर्गम मेमोरी क्षेत्र में कॉपी किया जाता है, तो try-catch होता है। लेकिन पिछले क्षेत्रों की कॉपी पहले हो चुकी होती है। इसके माध्यम से हम अपने इच्छित आकार से कॉपी कर सकते हैं।

- poc को ट्रिगर करने के लिए, पहले एक
socket बनाना होगा जिसका पैरामीटर type SOCK_DGRAM हो। फिर इस socket के हैंडल का उपयोग करके bind फ़ंक्शन को कॉल करें। अंत में, दो थ्रेड बनाएं, एक थ्रेड DeviceControl को IOCTL 0x120D3 के साथ बार-बार कॉल करेगा। कुछ जाँचों को बायपास करने के लिए उपयुक्त userbuffer सेट करें। दूसरा थ्रेड usermode पते पर संग्रहीत मान को लगातार बदलता रहेगा जो ऊपर बताए गए दोनों फ़ंक्शनों के लिए पैरामीटर है।
शोषण (Exploitation)
- इस त्रुटि के साथ, हम एक non-paged NX पूल को पूरी तरह से नियंत्रित आकार और डेटा से usermode पक्ष से overflow कर सकते हैं।
- शोषण की दिशा यह होगी कि बहुत सारे Namedpipe ऑब्जेक्ट्स को स्प्रे करें, फिर कुछ ऑब्जेक्ट्स को मुक्त (free) करके हीप में छेद (holes) बनाएं। फिर,
Afd!AfdComputeCMSGLength फ़ंक्शन से आकार की गणना करने के बाद पूल बनाएं, यह आकार Namedpipe ऑब्जेक्ट के आकार के समान होना चाहिए। तब पूल उन ऑब्जेक्ट्स में आवंटित होगा जो अभी मुक्त किए गए थे। बग का उपयोग करके आसन्न Namedpipe ऑब्जेक्ट्स को overflow करें, और इससे Namedpipe के तंत्र का उपयोग करके कर्नेल मेमोरी पर read/write अधिकार प्राप्त करें। सिस्टम प्रक्रिया का टोकन पढ़ें और फिर वर्तमान प्रक्रिया के टोकन में लिखें।
प्रभावित संस्करण (Affected range)
- Windows Server 2012 R2 (Server Core installation) build 6.3.9600.20919 से पहले
- Windows Server 2012 R2 build 6.3.9600.20919 से पहले
- Windows Server 2012 (Server Core installation) build 6.2.9200.24216 से पहले
- Windows Server 2012 build 6.2.9200.24216 से पहले
- Windows Server 2008 R2 for x64-based Systems Service Pack 1 (Server Core installation) build 6.1.7601.26466 से पहले
- Windows Server 2008 R2 for x64-based Systems Service Pack 1 build 6.1.7601.26466 से पहले
- Windows Server 2008 for x64-based Systems Service Pack 2 (Server Core installation) build 6.0.6003.22015 से पहले
- Windows Server 2008 for x64-based Systems Service Pack 2 build 6.0.6003.22015 से पहले
- Windows Server 2008 for 32-bit Systems Service Pack 2 (Server Core installation) build 6.0.6003.22015 से पहले
- Windows Server 2008 for 32-bit Systems Service Pack 2 build 6.0.6003.22015 से पहले
- Windows Server 2016 (Server Core installation) build 10.0.14393.5850 से पहले
- Windows Server 2016 build 10.0.14393.5850 से पहले
- Windows 10 Version 1607 for x64-based Systems build 10.0.14393.5850 से पहले
- Windows 10 Version 1607 for 32-bit Systems build 10.0.14393.5850 से पहले
- Windows 10 for x64-based Systems build 10.0.10240.19869 से पहले
- Windows 10 for 32-bit Systems build 10.0.10240.19869 से पहले
- Windows 10 Version 22H2 for 32-bit Systems build 10.0.19045.2846 से पहले
- Windows 10 Version 22H2 for ARM64-based Systems build 10.0.19045.2846 से पहले
- Windows 10 Version 22H2 for x64-based Systems build 10.0.19045.2846 से पहले
- Windows 11 Version 22H2 for x64-based Systems build 10.0.22621.1555 से पहले
- Windows 11 Version 22H2 for ARM64-based Systems build 10.0.22621.1555 से पहले
- Windows 10 Version 21H2 for x64-based Systems build 10.0.19044.2846 से पहले
- Windows 10 Version 21H2 for ARM64-based Systems build 10.0.19044.2846 से पहले
- Windows 10 Version 21H2 for 32-bit Systems build 10.0.19044.2846 से पहले
- Windows 11 version 21H2 for ARM64-based Systems build 10.0.22000.1817 से पहले
- Windows 11 version 21H2 for x64-based Systems build 10.0.22000.1817 से पहले
- Windows 10 Version 20H2 for ARM64-based Systems build 10.0.19042.2846 से पहले
- Windows 10 Version 20H2 for 32-bit Systems build 10.0.19042.2846 से पहले
- Windows 10 Version 20H2 for x64-based Systems build 10.0.19042.2846 से पहले
- Windows Server 2022 (Server Core installation) build 10.0.20348.1668 से पहले
- Windows Server 2022 build 10.0.20348.1668 से पहले
- Windows Server 2019 (Server Core installation) build 10.0.17763.4252 से पहले
- Windows Server 2019 build 10.0.17763.4252 से पहले
पैच (The patch)
- त्रुटि को दो पुराने फ़ंक्शनों को दो नए फ़ंक्शनों से बदलकर ठीक किया गया है। पुराने फ़ंक्शनों के नाम में
_old प्रत्यय जोड़ा गया है। इन नए फ़ंक्शनों ने किया है। दो नए फ़ंक्शनों में, अभी भी double fetch मौजूद है, लेकिन fetch किए गए मान को उपयोग करने से पहले जाँचा जाएगा। गणितीय संक्रियाओं को बदलने के लिए Rtl फ़ंक्शनों का उपयोग किया गया है, जो Integer overflow को रोकते हैं।
निष्कर्ष (Conclusion)
- बग का प्रभावित क्षेत्र बहुत व्यापक है, जो कई प्रणालियों को खतरे में डालता है। हालाँकि, शोषण पेलोड चलाते समय हीप स्प्रे के कारण विफलता की एक छोटी सी संभावना होती है, जिससे Windows क्रैश हो सकता है। साथ ही, cmd प्रक्रिया के अधिकार को System तक बढ़ाने के बाद, यदि इस प्रक्रिया से बाहर निकलते हैं, तो भी Windows क्रैश हो सकता है। ऐसा शोषण प्रक्रिया के दौरान Namedpipe ऑब्जेक्ट के भ्रष्ट (corrupt) होने के कारण होता है।
अनुलग्नक (Attachments)
- Minimal POC

- Exploit POC
