
लिनक्स कर्नेल में OOB रीड और राइट भेद्यता का एक विवरण और LPE PoC
लिनक्स कर्नेल में OOB रीड और राइट भेद्यता का एक राइट-अप और लोकल प्रिविलेज एस्केलेशन प्रूफ-ऑफ-कॉन्सेप्ट।
आप इस भेद्यता का राइट-अप मेरे ब्लॉग पर पा सकते हैं और nf_tables का मेरा परिचय यहाँ भी देख सकते हैं।
इस रिपॉजिटरी में दिया गया exploit भेद्य कर्नेल संस्करणों पर बिना किसी बदलाव के सफलतापूर्वक चलने की उम्मीद नहीं की जानी चाहिए। कर्नेल बिल्डों के बीच कई offsets अलग-अलग होंगे और निश्चित रूप से ROP gadgets भी भिन्न होंगे।
कभी-कभी कर्नेल बिल्डों के बीच अंतर के कारण भेद्यता का शोषण करने का तरीका भी बदलना पड़ सकता है। इसका एक उदाहरण David Bouman (@pqlqpql) द्वारा लिखित इस भेद्यता का एक और राइट-अप है, जिसे आप यहाँ पा सकते हैं, जहाँ उन्होंने UDP packets का उपयोग करके भेद्यता का शोषण किया है - जब UDP पैकेट हैंडल किया जा रहा हो तब stack को target करते हुए - जो stack layout में महत्वपूर्ण अंतर के कारण मेरे कर्नेल बिल्ड पर नहीं किया जा सकता था। इसके बजाय मैंने एक ऐसी विधि का उपयोग किया जो TCP ACK पैकेट हैंडल किए जाने पर stack को target करती है।
यदि आप इसे अपनी ओर से परीक्षण करना चाहते हैं, तो मैं आपको अपना राइट-अप पढ़ने तथा offsets का पता लगाने, किन hooks का उपयोग करना है, आदि का मार्ग अपनाने की सलाह दूँगा।
जिस सटीक कर्नेल संस्करण से मैंने वह कर्नेल बनाया था जिसे मैंने राइट-अप में target किया था, वह 5.12.0, commit 9f4ad9e425a1d3b6a34617b8ea226d56a119a717 था।
Exploit बनाने के लिए आपको libmnl और libnftnl लाइब्रेरियों के साथ-साथ POSIX thread (pthread) लाइब्रेरी की आवश्यकता है।
इसे बनाना तब उतना ही सरल है
gcc -lmnl -lnftnl -lpthread exploit.c -o exploit
यह भेद्यता nft_validate_register_store से उत्पन्न होती है, जिसे version 5.12 में commit 345023b0db315648ccc3c1a36aee88304a8b4d91 में पेश किया गया था और version 5.17 में commit 6e1acfa387b9ff82cfc7db8cc3b6959221a95851 में पैच किया गया है।
यह Proof-of-Concept और भेद्यता का राइट-अप केवल शैक्षिक उद्देश्यों के लिए हैं। इस कोड का किसी भी रूप में उपयोग किए जाने के लिए मैं कानूनी रूप से जिम्मेदार नहीं हूँ।