
Metasploit पुल अनुरोध के लिए
यह समस्या #8571 को हल कर सकता है, जो Phoenix Talon मॉड्यूल का अनुरोध करता है।
लक्ष्य मशीन पर, accept() समय पर कर्नेल द्वारा mc_list की एक अतिरिक्त प्रति रखने के कारण डबल-फ्री ट्रिगर होता है।
4.10.15 और उससे नीचे के कर्नेल चलाने वाली मशीन जोखिम में है यदि वह निम्नलिखित रूटीन चला रही है:
sockfd = socket(AF_INET, xx, IPPROTO_TCP);
setsockopt(sockfd, SOL_IP, MCAST_JOIN_GROUP, xxxx, xxxx);
bind(sockfd, xxxx, xxxx);
listen(sockfd, xxxx);
newsockfd = accept(sockfd, xxxx, xxxx);
close(newsockfd); // trigger release calls, handoff to RCU
sleep(5); // wait for rcu to free()
close(sockfd); // second free()
पैरेंट सॉकेट, sockfd, बनाया जाता है। इसे विकल्प MCAST_JOIN_GROUP के साथ मल्टीकास्ट समूह में जोड़ा जाता है। स्थानीय इंटरफ़ेस पर मल्टीकास्ट समूह में सॉकेट जोड़ने पर, कर्नेल मेमोरी आवंटित करता है। इस बिंदु पर, mc_list पैरेंट सॉकेट में मौजूद है।
bind() के साथ सॉकेट को एक पता निर्दिष्ट करने के बाद, कनेक्शन के लिए listen() और accept() किया जाता है। accept() एक नया सॉकेट, newsockfd, बनाता है, जिसमें पैरेंट के सभी आवश्यक फ़ील्ड कॉपी किए जाते हैं, जिसमें mc_list पॉइंटर का मान भी शामिल है। इस बिंदु पर, मेमोरी के एक ही ब्लॉक की ओर इशारा करने वाले कई पॉइंटर होते हैं, इसलिए डबल फ्री।
जब कनेक्शन स्थापित होता है, तो कर्नेल एक चाइल्ड सॉकेट बनाता है जो पैरेंट सॉकेट के mc_list ऑब्जेक्ट को इनहेरिट करता है। यह इनहेरिटेंस दोष फ़ाइल net/ipv4/inet_connection_sock.c की पंक्ति 648 में inet_csk_clone_lock में है। इस अनपेक्षित इनहेरिटेंस के लिए एक-पंक्ति सुधार देखने के लिए पैच देखें।
अगला, चाइल्ड सॉकेट को बंद करें। जैसा कि ऊपर बताया गया है, यह mc_list ऑब्जेक्ट को रिलीज़ नहीं करता है। यह मेमोरी जारी करने के लिए RCU (रिमोट-कॉपी-अपडेट) संरचना से गुज़रता है। RCU हैंडऑफ़ को kfree() कॉल करने के लिए पर्याप्त समय देने के लिए कुछ सेकंड के लिए sleep() करें। अंत में, पैरेंट सॉकेट को बंद करें, जो दूसरी फ्री को ट्रिगर करेगा।
सरल DoS. आवश्यक सर्वर रूटीन (ऊपर बताया गया) चलाने वाली ज्ञात लक्ष्य मशीन पर दूरस्थ रूप से डबल-फ्री ट्रिगर करें। इससे कर्नेल पैनिक होता है।