
CVE-2023-6931 kernel panic PoC
CVE-2023-6931 के लिए कर्नेल पैनिक PoC
CVE-2023-6931 perf_event में एक कमजोरी है जो read_size में एक पूर्णांक अतिप्रवाह के कारण हीप बफर अतिप्रवाह की ओर ले जाती है।
perf_events लिनक्स कर्नेल द्वारा प्रदान किया गया एक प्रदर्शन निगरानी और विश्लेषण ढांचा है। यह ढांचा हार्डवेयर और सॉफ्टवेयर दोनों घटकों द्वारा उत्पन्न विभिन्न प्रदर्शन-संबंधित डेटा की ट्रैकिंग को सक्षम करता है।
perf_event_open सिस्टम कॉल
एक इंटरफ़ेस जो उपयोगकर्ता-स्थान को कर्नेल में प्रदर्शन घटनाओं को कॉन्फ़िगर और नियंत्रित करने की अनुमति देता है।
इसका उपयोग घटनाओं से डेटा बनाने, समूहित करने, नियंत्रित करने या पढ़ने के लिए किया जाता है।/proc/sys/kernel/perf_event_paranoid का मान 1 या उससे कम होना चाहिए।ulimit -n कमांड का उपयोग करके जाँचा और संशोधित किया जा सकता है।CONFIG_PERF_EVENTS सेट होना चाहिए।यह कमजोरी समूह के read_size में पूर्णांक अतिप्रवाह के कारण उत्पन्न होती है। फ़ंक्शन perf_event_validate_size read_size पर सत्यापन करता है। हालांकि, read_size को सत्यापित करने का तरीका केवल वर्तमान घटना के read_size की जाँच करता है।
मुख्य बिंदु यह है कि प्रत्येक सत्यापन के दौरान, केवल वर्तमान घटना को मान्य किया जाता है, जबकि पिछली घटनाओं को नहीं। यदि समूह नेता के लिए PERF_FORMAT_GROUP सेट है, तो केवल एक वर्तमान घटना जोड़ने से समूह नेता का read_size बढ़ सकता है।
यह अंततः perf_read_group में एक समस्या का कारण बनता है। event->read_size की गणना समूह नेता के read_format पर आधारित होती है, जिसे nr_siblings से गुणा किया जाता है। चूँकि read_size चर एक 2-बाइट u16 है, इसका अधिकतम मान 0xffff हो सकता है।
इसका शोषण करने के लिए, हमलावर पहले सभी संभावित read_format विकल्पों के साथ एक समूह नेता घटना बनाता है। इसके बाद, कई सिबलिंग घटनाएँ बनाई जाती हैं। ये सिबलिंग केवल read_Format में PERF_FORMAT_TOTAL_TIME_RUNNING सेट करती हैं ताकि perf_event_validate_size में कोई सत्यापन समस्या न हो। परिणामस्वरूप, nr_siblings मान अत्यधिक बड़ा हो जाता है, लेकिन चूँकि प्रत्येक सिबलिंग घटना व्यक्तिगत रूप से सत्यापन पास करती है, इस चरण में कोई समस्या नहीं होती है।
जब इस स्थिति में perf_read_group कॉल किया जाता है, तो समूह नेता का read_size बढ़ता रहता है क्योंकि PERF_FORMAT_GROUP सेट है। अंततः, यह पूर्णांक अतिप्रवाह की ओर ले जाता है, और kzalloc एक बहुत छोटा बफर आवंटित करता है। हालांकि, चूँकि घटनाओं की वास्तविक संख्या बहुत बड़ी है, एक हीप बफर अतिप्रवाह होता है, जिससे कर्नेल पैनिक होता है।