
CVE-2022-23093 FreeBSD स्टैक-आधारित ओवरफ़्लो
⚠️ डिफ़ॉल्ट रूप से उपयोग किया जाने वाला शेलकोड FreeBSD/x86-64 - execve - 28 bytes from Gitsnik है, इसे बदलें और शुरू करने के लिए अपना खुद का डालें ⚠️
ping उपयोगिता, जिसका उपयोग किसी होस्ट या गेटवे से ICMP ECHO_RESPONSE का अनुरोध करने के लिए किया जाता है, एक IPv4 लक्ष्य (या तो IPv4-host या IPv4-mcast-group) के साथ ICMP प्रोटोकॉल के अनिवार्य ECHO_REQUEST डेटाग्राम के माध्यम से आहूत की जाती है। ECHO_REQUEST डेटाग्राम में एक IP और ICMP हेडर होता है, उसके बाद एक "struct timeval" और पैकेट को भरने के लिए अलग-अलग संख्या में "pad" बाइट्स होते हैं।
फ्रीबीएसडी प्रोजेक्ट की सुरक्षा सलाह के अनुसार, ping उपयोगिता pr_pack() फ़ंक्शन के अंदर प्रतिक्रियाओं को संसाधित करने के लिए नेटवर्क से कच्चे IP पैकेट प्राप्त करती है। प्रतिक्रिया प्रसंस्करण में, ping IP हेडर, ICMP हेडर, और यदि मौजूद हो, तो एक "quoted packet" (जो ICMP त्रुटि का कारण बनने वाले पैकेट का प्रतिनिधित्व करता है) का पुनर्निर्माण करता है। उद्धृत पैकेट में एक IP हेडर और एक ICMP हेडर भी शामिल है।
pr_pack() फ़ंक्शन प्राप्त IP और ICMP हेडर को आगे की प्रक्रिया के लिए स्टैक बफ़र्स में कॉपी करता है। हालाँकि, यह प्रतिक्रिया या उद्धृत पैकेट में IP हेडर के बाद IP विकल्प हेडर की संभावना को ध्यान में रखने में विफल रहता है। IP विकल्पों की उपस्थिति में, pr_pack() गंतव्य बफ़र को 40 बाइट्स तक ओवरफ्लो कर देता है।
ping उपयोगिता यूज़रस्पेस में चलती है, और ping कमांड को आहूत करने पर /sbin/ping पर स्थित बाइनरी निष्पादित होती है। उपयोगिता का स्रोत कोड फ्रीबीएसडी स्रोत पर सार्वजनिक रूप से उपलब्ध है। कमजोर फ़ंक्शन, pr_pack(), ICMP पैकेट प्रतिक्रिया जानकारी को stdout पर एक स्ट्रिंग प्रारूप में प्रिंट करता है, जैसे "64 bytes from 1.3.3.7: icmp_seq=1 ttl=55 time=13.7 ms।"
✔️ ICMP पैकेट, अनुरोध और प्रतिक्रिया दोनों में, ऊपर दिए गए आरेख में दर्शाए अनुसार एक वैकल्पिक Options फ़ील्ड के साथ IP हेडर शामिल करता है। एक दुर्भावनापूर्ण हमले में, ये IP Options सक्षम होते हैं और गैर-शून्य बाइट्स से भरे होते हैं। ✔️
यदि ICMP पैकेट गंतव्य होस्ट के रास्ते में खराब या जानबूझकर छेड़छाड़ किया जाता है, और मूल इको अनुरोध में IP Options सक्षम हैं, तो pr_pack() फ़ंक्शन IP Options की उपस्थिति को समायोजित करने के लिए स्टैक पर पर्याप्त स्थान आवंटित करने में विफल रहता है, जिसके परिणामस्वरूप स्टैक ओवरफ्लो होता है।
🤝 इन त्रुटि मामलों में, गंतव्य होस्ट से प्रतिक्रिया में डेटा अनुभाग में एक "quoted packet" भी शामिल हो सकता है, जो उस विशिष्ट पैकेट की पहचान करता है जिसने ICMP त्रुटि उत्पन्न की। pr_pack() फ़ंक्शन स्टैक को ओवरफ्लो करता है जब उद्धृत पैकेट में ICMP हेडर शामिल होते हैं। 🤝