
CVE-2018-7249 के लिए एक PoC
Microsoft Windows Vista, Windows 7, Windows 8, और Windows 8.1 (KB3086255 से पहले) में शामिल secdrv.sys, और Macrovision SafeDisc में शामिल secdrv.sys में एक समस्या पाई गई। IOCTL 0xCA002813 के दो सावधानीपूर्वक समयबद्ध कॉल एक रेस कंडीशन का कारण बन सकते हैं जो use-after-free की ओर ले जाता है। शोषण होने पर, एक अनधिकृत हमलावर कर्नेल में मनमाना कोड चला सकता है।
यह कमजोरी Microsoft को रिपोर्ट की गई थी, और चूंकि यह अप-टू-डेट Windows मशीन (केवल KB3086255 से पहले के संस्करण) को प्रभावित नहीं करती है, वे कोई कार्रवाई नहीं करेंगे। Windows 7 x86 पर परीक्षण और शोषण सफलतापूर्वक किया गया।
इससे संबंधित भी है CVE-2018-7250।

यह दस्तावेज़ secdrv.sys ड्राइवर पर मेरे छोटे शोध का वर्णन करता है। ड्राइवर के सभी वर्णित व्यवहार रिवर्स इंजीनियर किए गए थे और गलत/असटीक हो सकते हैं।
IOCTL (0x0CA002813) के इनपुट बफर के ऑफसेट 0x4 में एक संख्या होती है जिसे मैं TYPE के रूप में संदर्भित करूंगा। इस IOCTL (0x0CA002813) का मुख्य हैंडलर फंक्शन, sub_11A88, तीन अलग-अलग प्रकार प्राप्त करता है: 0x96, 0x97 और 0x98।
IOCTL प्रकार 0x96 द्वारा एक नया chunk आवंटित करने और इसे आरंभ करने के बाद, लेकिन पूरी तरह से नहीं, यह chunk को usermode में कॉपी करता है। नव आवंटित chunk में 16 बिट आरंभ नहीं किए गए थे, और पिछले PagedPool आवंटनों से डेटा शामिल करते हैं। फिर ये अप्रारंभीकृत बिट्स .text:00011BE9 पर REP MOVSD निर्देश द्वारा usermode में कॉपी हो जाते हैं। PoC कोड यहाँ।
जब IOCTL प्रकार 0x97 को कॉल किया जाता है, तो यह अपने टैग द्वारा पहले प्रकार 0x96 के साथ आवंटित आवश्यक chunk को ढूंढता है। यदि आवंटन पहले से IOCTL प्रकार 0x97 द्वारा मुक्त कर दिया गया है, तो DeviceIoControl एक त्रुटि लौटाता है। यहाँ कमजोरी यह है कि प्रकार 0x97 द्वारा उपयोग किया गया आवंटन, इसके संचालन के दौरान मुक्त किया जा सकता है (क्योंकि कोई सिंक्रनाइज़ेशन तंत्र उपयोग नहीं किया जाता है) इस प्रकार यदि रेस जीती जाती है तो इसका उपयोग-after-free होता है। यदि कोई हमलावर IOCTL प्रकार 0x97 के संचालन के दौरान (प्रकार 0x98 का उपयोग करके) chunk को मुक्त करने और ठीक उसी मेमोरी स्थान पर उसके नियंत्रण वाला एक नया chunk आवंटित करने में सफल हो जाता है, तो वह एक अन्य संरचना के लिए एक पॉइंटर को ओवरराइड कर सकता है, जिसमें एक फंक्शन पॉइंटर होता है जिसका उपयोग अंततः ड्राइवर के निष्पादन प्रवाह को हाईजैक करने और रिंग 0 में मनमाना कोड निष्पादित करने के लिए किया जा सकता है। क्योंकि एन्क्रिप्शन रूटीन एक उपयोगकर्ता द्वारा प्रदान किए गए बफर पर किया जाता है, जो आकार में बहुत बड़ा हो सकता है, एन्क्रिप्शन को निष्पादित होने में लंबा समय लग सकता है, इस प्रकार IOCTL प्रकार 0x98 के लिए उपयोग में रहते हुए chunk को मुक्त करने का एक उत्तम समय विंडो प्रदान करता है। समय विंडो इतनी लंबी (1 सेकंड से अधिक!) हो सकती है कि पहले प्रयास पर ही रेस को विश्वसनीय रूप से जीता जा सकता है। उपयोग-after-free .text:00011B68 पर शुरू होता है, और वास्तविक कॉल, जिसे शेलकोड पर कूदने के लिए हाईजैक किया जाएगा, .text:00011B86 पर होता है।
इस कमजोरी का सफलतापूर्वक शोषण करने के लिए उठाए गए कदम निम्नलिखित हैं:
OS: Windows 7 Kernel Version 7600 MP (1 procs) Free x86 compatible Built by: 7600.16385.x86fre.win7_rtm.090713-1255 VM: 4GB RAM, 1 CPU Hardware: Windows 10 Pro 64 bit, Motherboard Gigabyte Z370 HD3, 16GB RAM, Intel i5-8400 2.80GHz (6 CPUs)