
CVE-2020-16899 - Microsoft Windows TCP/IP भेद्यता पहचान तर्क और नियम
13 अक्टूबर को, Microsoft ने घोषणा की विंडोज IPv6 स्टैक में एक गंभीर भेद्यता, जो एक हमलावर को दुर्भावनापूर्ण रूप से तैयार किए गए पैकेट भेजने की अनुमति देती है, जिसके परिणामस्वरूप विंडोज 10 और विंडोज सर्वर 2019 के सबसे हाल के संस्करणों पर तत्काल BSOD (ब्लू स्क्रीन ऑफ डेथ) होता है। जबकि यह भेद्यता किसी हमलावर को कोड निष्पादन प्रदान करती प्रतीत नहीं होती है, इसका उपयोग कमजोर विंडोज संस्करणों पर बड़े पैमाने पर डिनायल-ऑफ-सर्विस हमले करने के लिए किया जा सकता है। इस भेद्यता के अधिक प्रभावशाली RCE संस्करण के लिए पहचान तर्क CVE-2020-16898: "Bad Neighbor" पर पाया जा सकता है।
यह दस्तावेज़ McAfee Advanced Threat Research द्वारा तैयार किया गया है। इसका उद्देश्य नेटवर्क प्रशासकों और सुरक्षा कर्मियों को इस भेद्यता को और अधिक समझने तथा शोषण से बचाव के लिए बहुमूल्य जानकारी प्रदान करना है। यहां उत्पन्न सिग्नेचर को उत्पादन में उपयोग करने से पहले स्टेजिंग वातावरण में पूरी तरह से विचार और परीक्षण किया जाना चाहिए, और लक्षित तैनाती के लिए विशिष्ट ट्यूनिंग से लाभ हो सकता है।
यहां दी गई जानकारी बिना सूचना के बदली जा सकती है, और "जैसी है" प्रदान की जाती है, जिसमें सभी दोष शामिल हैं, बिना किसी गारंटी या वारंटी के कि जानकारी किसी विशिष्ट स्थिति या परिस्थिति के लिए सटीक या लागू है, और आपके अपने जोखिम पर उपयोग के लिए है। इसके अतिरिक्त, हम किसी भी सिग्नेचर के लिए किसी भी प्रदर्शन या प्रभावकारिता बेंचमार्क की गारंटी नहीं दे सकते हैं।
यह भेद्यता एक आउट-ऑफ-बाउंड रीड का परिणाम है जो तब हो सकती है जब विंडोज IPv6 स्टैक ICMPv6 राउटर एडवर्टाइजमेंट (प्रकार = 134) पैकेट संसाधित करता है जिसमें एक या अधिक DNSSL विकल्प रिकॉर्ड (विकल्प प्रकार = 31) होते हैं। DNSSL रिकॉर्ड का उद्देश्य DNS नाम सफिक्स की खोज सूची प्रदान करना है, जो इसके अंतिम फ़ील्ड में निहित होती है। चूंकि यह खोज सूची कई शून्य-समाप्त DNS नामों को बैक-टू-बैक रख सकती है, फ़ील्ड (और इस प्रकार पूरा रिकॉर्ड) आकार में व्यापक रूप से भिन्न हो सकता है। इसे समायोजित करने के लिए, DNSSL विकल्प रिकॉर्ड में अपना स्वयं का लंबाई फ़ील्ड होता है। हालांकि, चूंकि लंबाई 8-बाइट वृद्धि में गिना जाता है, खोज सूची में कम से कम एक डोमेन नाम में रिकॉर्ड के 8-बाइट संरेखण को संरक्षित करने के लिए अतिरिक्त शून्य-पैडिंग हो सकती है। इन शून्यों के प्रसंस्करण में ही भेद्यता पाई जा सकती है।
खोज सूची में प्रत्येक डोमेन नाम के लिए, विंडोज IPv6 स्टैक एक 256-बाइट बफर आवंटित करता है। चूंकि RFC 1035 डोमेन नामों को 255 बाइट्स तक सीमित करता है, यह आम तौर पर एक डोमेन नाम और उसके शून्य टर्मिनेटर को रखने के लिए पर्याप्त होगा। हालांकि, प्रत्येक डोमेन नाम के अंत में अनुगामी शून्यों को उपभोग करने के लिए जिम्मेदार कोड की ऊपरी सीमा विकल्प में शेष बाइट्स के बराबर होती है, जो 256 बाइट्स से अधिक हो सकती है। परिणाम यह है कि शून्य-उपभोग करने वाला कोड बफर के लिए आवंटित की तुलना में अधिक बाइट्स का गलत तरीके से उपभोग कर सकता है, जिसके परिणामस्वरूप आउट-ऑफ-बाउंड रीड होता है। ऐसे मामले में जहां बफर मेमोरी पेज के अंत में आता है, यह OOB रीड BSOD का कारण बन सकता है।
इस भेद्यता के लिए Suricata सिग्नेचर cve-2020-16899.rules में स्थित है और इसमें निम्नलिखित तर्क शामिल है:
alert icmp any any -> any any (msg:"Potential CVE-2020-16899 Exploit"; lua:cve-2020-16899.lua; sid:202016899; rev:1;)
संबंधित Lua स्क्रिप्ट cve-2020-16899.lua में पाई जा सकती है। इसमें ICMPv6 परत को ठीक से पार्स करने और CVE-2020-16899 के संभावित शोषण की पहचान करने के लिए आवश्यक तर्क शामिल है, इस प्रकार:
एक बार जब हम ICMPv6 परत की शुरुआत का पता लगा लेते हैं, तो हम परत के पहले बाइट का परीक्षण करते हैं ताकि यह सुनिश्चित हो सके कि यह राउटर एडवर्टाइजमेंट ICMPv6 पैकेट है - यदि ऐसा नहीं है, तो हम बाहर निकल जाते हैं।
चूंकि Suricata प्रिमिटिव को ICMPv6 विकल्पों को पार्स करने के लिए अपडेट नहीं किया गया है, हम केवल ICMPv6 परत के 17वें बाइट पर कूद जाते हैं, क्योंकि वहां से विकल्प शुरू होने चाहिए, यदि मौजूद हों (पहले 16 बाइट स्थिर-लंबाई वाले फ़ील्ड हैं, प्रति RFC 4443)। वहां से, हम पैकेट में बाइट्स समाप्त होने तक हर विकल्प पर लूप करते हैं। प्रत्येक विकल्प के लिए, हम पहले बाइट का निरीक्षण करके शुरू करते हैं, जो विकल्प प्रकार फ़ील्ड से मेल खाता है। जबकि हम उन सभी विकल्पों को अनदेखा करते हैं जो DNSSL नहीं हैं, विकल्प प्रकार = 31 (DNSSL) के लिए, हम जांचते हैं कि लंबाई (विकल्प में दूसरा बाइट) 35 से अधिक या उसके बराबर है या नहीं, जो भेद्यता को ट्रिगर करने के लिए आवश्यक न्यूनतम लंबाई है: