
कर्नेल फ़ंक्शन निष्पादन समय में परिवर्तनों के विश्लेषण के माध्यम से रूटकिट फ़ाइल छुपाने की गतिविधियों का पता लगाना।
इस रिपॉजिटरी में उन कर्नेल फ़ंक्शनों के समय मापन को एकत्र करने का कोड शामिल है, जिन्हें रूटकिट फ़ाइलें छिपाते समय हेरफेर करते हैं, साथ ही एक अर्ध-पर्यवेक्षित पहचान विधि भी शामिल है जो कर्नेल फ़ंक्शन निष्पादन समय में बदलावों का विश्लेषण करती है। यह कार्यान्वयन ओपन-सोर्स रूटकिट CARAXES पर निर्भर करता है, जो फ़ाइल गणनाओं के परिणामों में हेरफेर करने के लिए filldir फ़ंक्शन को लपेटता है, उदाहरण के लिए, ls कमांड निष्पादित करते समय। eBPF प्रोब्स का उपयोग करके getdents सिस्टम कॉल के कई फ़ंक्शनों (filldir सहित) से समय मापन लिया जाता है। पहचान के लिए हम सांख्यिकीय परीक्षण पर आधारित एक सरल मशीन लर्निंग मॉडल लागू करते हैं। डेटा संग्रह और विसंगति पहचान तंत्रों की विस्तृत व्याख्या के लिए हम निम्नलिखित प्रकाशन का संदर्भ देते हैं। यदि आप इस रिपॉजिटरी में दिए गए किसी भी संसाधन का उपयोग करते हैं, तो कृपया निम्नलिखित प्रकाशन को उद्धृत करें:
निम्नलिखित चरण रूटकिट को स्थापित करते हैं तथा समझाते हैं कि कर्नेल फ़ंक्शनों से समय मापन कैसे एकत्र किया जाए। यदि आप केवल विसंगतियों की पहचान में रुचि रखते हैं और हमारे सार्वजनिक डेटा सेट का उपयोग करना चाहते हैं, तो आप इस अनुभाग को छोड़ सकते हैं।
रूटकिट और प्रोबिंग का परीक्षण Linux कर्नेल 5.15-6.11 और Python 3.10 पर किया गया है। टूल्स चलाने के लिए, इस रिपॉजिटरी को डाउनलोड करें और रूटकिट तथा प्रोबिंग तंत्र को चलाने के लिए आवश्यक निम्नलिखित निर्भरताएँ स्थापित करें।
ubuntu@ubuntu:~$ git clone https://github.com/ait-aecid/rootkit-detection-ebpf-time-trace.git
ubuntu@ubuntu:~$ cd rootkit-detection-ebpf-time-trace
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ sudo apt update
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ sudo apt install python3-bpfcc make gcc flex bison python3-pip linux-headers-$(uname -r)
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ pip install -r requirements.txt
कुछ परिदृश्यों के लिए अतिरिक्त संसाधनों की आवश्यकता होती है। विशेष रूप से, ls-basic परिदृश्य के लिए ls-basic स्क्रिप्ट को संकलित करना आवश्यक है और system load परिदृश्य के लिए stress-ng स्थापित करना आवश्यक है। यदि आप इन परिदृश्यों का उपयोग नहीं करना चाहते हैं, तो आप निम्नलिखित निर्भरताओं को छोड़ सकते हैं।
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ gcc -o ls-basic ls-basic.c
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ sudo apt install stress-ng
निम्नलिखित कमांड अनिवार्य हैं, क्योंकि रूटकिट डिफ़ॉल्ट रूप से getdents सिस्टम कॉल में हेरफेर करता है, हालाँकि, प्रोबिंग के लिए वर्तमान में केवल filldir में हेरफेर समर्थित है। रूटकिट डाउनलोड करें, hooks.h को इस रिपॉजिटरी में प्रदान की गई फ़ाइल से बदलें (यह सुनिश्चित करता है कि getdents के बजाय filldir को हुक किया गया है), और रूटकिट को संकलित करें।
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ cd ..
ubuntu@ubuntu:~$ git clone https://github.com/ait-aecid/caraxes.git
ubuntu@ubuntu:~$ cd caraxes/
ubuntu@ubuntu:~/caraxes$ cp ../rootkit-detection-ebpf-time-trace/hooks.h .
ubuntu@ubuntu:~/caraxes$ sudo make
यदि आपको रूटकिट स्थापित करने में समस्या आती है या यह परीक्षण करना चाहते हैं कि यह अपेक्षा के अनुसार काम करता है या नहीं, तो CARAXES GitHub पेज पर ReadMe देखें।
उसके बाद, इस रिपॉजिटरी पर लौटें और linux.py खोलकर वेरिएबल KERNEL_OBJECT_PATH को संपादित करें ताकि वह उस caraxes फ़ोल्डर की ओर इंगित करे जिसे आपने अभी क्लोन किया है; डिफ़ॉल्ट पथ "/home/ubuntu/caraxes/" है।
ubuntu@ubuntu:~/caraxes$ cd ../rootkit-detection-ebpf-time-trace
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ vim linux.py
अब आप प्रोबिंग तंत्र चलाने के लिए तैयार हैं, जो स्वचालित रूप से कर्नेल में प्रोब्स इंजेक्ट करेगा, रूटकिट शुरू करेगा, समय मापन डेटा को एक फ़ाइल में संग्रहीत करेगा, और रूटकिट को रोक देगा। सिस्टम कॉल को ट्रिगर करने के लिए, स्क्रिप्ट इस प्रकार छिपाई जाने वाली फ़ाइलों के साथ एक निर्देशिका बनाती है और प्रोब्स को पोल करते हुए ls को 100 बार निष्पादित करती है (इसे -i फ्लैग के साथ संशोधित किया जा सकता है)। स्क्रिप्ट रूटकिट के साथ (--rootkit फ्लैग), रूटकिट के बिना (--normal फ्लैग), या दोनों के साथ मापन एकत्र करने की अनुमति देती है, और कई परिदृश्यों का समर्थन करती है। निम्नलिखित कमांड के साथ डिफ़ॉल्ट परिदृश्य चलाएँ:
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ sudo python3 probing.py --normal --rootkit
compiling eBPF probes...
probes compiled!
attached bpf probes:
iterate_dir-enter
iterate_dir-return
dcache_readdir-enter
dcache_readdir-return
filldir64-enter
filldir64-return
verify_dirent_name-enter
verify_dirent_name-return
touch_atime-enter
touch_atime-return
Running experiment with ls for 100 times.
Iteration 0...
detection_PID: 70133
Iteration 1...
detection_PID: 70134
...
Iteration 99...
detection_PID: 70338
polled 40 times!
done with the "rootkit version"
Experiment finished, saving output.
Saved data to events/events_2025-01-17T09:59:52.183801_rootkit.json.gz
412K events/events_2025-01-17T09:59:52.183801_rootkit.json.gz
मापन events निर्देशिका में संग्रहीत किए जाते हैं। अन्य मापदंडों के बारे में जानने के लिए python3 probing.py -h के साथ सहायता पृष्ठ देखें, जो अन्य परिदृश्यों में डेटा संग्रह स्थापित करने की अनुमति देते हैं (उदाहरण के लिए, ls के बजाय ls-basic का उपयोग करना या सिस्टम लोड का अनुकरण करना) और विभिन्न रनों को नाम निर्दिष्ट करते हैं (--description)। कुछ पैरामीटरीकृत कमांडों के लिए repeat_seq.sh देखें; वास्तव में, हमने अपने सार्वजनिक डेटा सेट एकत्र करने के लिए इस स्क्रिप्ट का उपयोग किया है। ध्यान दें कि हम getdents सिस्टम कॉल से केवल कुछ उपलब्ध कर्नेल फ़ंक्शनों पर विचार करते हैं। यह निर्दिष्ट करने के लिए कि प्रोबिंग तंत्र को किन फ़ंक्शनों पर प्रोब्स संलग्न करने चाहिए, probing.py खोलें और फ़ाइल की शुरुआत में probe_points सूची में फ़ंक्शन नाम जोड़ें या हटाएँ।
विसंगति पहचान एल्गोरिदम चलाने के लिए केवल python निर्भरताओं को स्थापित करना आवश्यक है। यदि आपने पिछले चरण में पहले से ऐसा नहीं किया है, तो pip के साथ आवश्यकताओं को स्थापित करने के लिए निम्नलिखित कमांड चलाएँ।
ubuntu@ubuntu:~$ git clone https://github.com/ait-aecid/rootkit-detection-ebpf-time-trace.git
ubuntu@ubuntu:~$ cd rootkit-detection-ebpf-time-trace
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ pip install -r requirements.txt
फिर, Zenodo पर हमारे द्वारा प्रदान किया गया डेटा सेट डाउनलोड करें और निकालें। यदि आपने पिछले चरण में अपना स्वयं का डेटा उत्पन्न किया है और उसका उपयोग करना चाहते हैं, तो इस चरण को छोड़ दें।
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ wget https://zenodo.org/records/14679675/files/events.zip
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ unzip events.zip
अब आप विसंगति पहचान को निम्नानुसार चलाने के लिए तैयार हैं। मापन डेटा वाली निर्देशिका (-d), प्रशिक्षण के लिए उपयोग किए जाने वाले सामान्य डेटा का अंश (-t), संचालन का तरीका (-m) और समूहीकरण फ़ंक्शन (-g) निर्दिष्ट करें। स्क्रिप्ट निर्दिष्ट निर्देशिका से सभी फ़ाइलों को लोड करेगी, उन्हें प्रशिक्षण और परीक्षण डेटा में विभाजित करेगी (आउटपुट में सारांशित), पहचान मेट्रिक्स की गणना और मुद्रण करेगी, और एक confusion matrix (भ्रम मैट्रिक्स) प्लॉट करेगी।
ubuntu@ubuntu:~/rootkit-detection-ebpf-time-trace$ python3 evaluate.py -d events -t 0.333 -m offline -g fun
100%|█████████████████████████████████████████████| 1250/1250 [02:47<00:00, 7.45it/s]
Processed all files from events
Normal batches: 750
Normal batches for training: 250
default: 50
file_count: 50
system_load: 50
ls_basic: 50
filename_length: 50
Normal batches for testing: 500
default: 100
file_count: 100
system_load: 100
ls_basic: 100
filename_length: 100
Anomalous batches: 500
default: 100
file_count: 100
system_load: 100
ls_basic: 100
filename_length: 100
Results (Run 1)
Threshold=3.5111917342151415e-16
Time=0.0027740001678466797
TP=499
FP=9
TN=491
FN=1
TPR=R=0.998
FPR=0.018
TNR=0.982
P=0.9822834645669292
F1=0.9900793650793651
ACC=0.99
MCC=0.9801254640896192
Confusion Matrix (Run 1)
Predicted
default file_count system_load ls_basic filename_length
Pos Neg Pos Neg Pos Neg Pos Neg Pos Neg
100 0 100 0 100 0 100 0 100 0 Pos - Actual default
3 97 100 0 99 1 100 0 2 98 Neg - Actual default
100 0 100 0 100 0 100 0 100 0 Pos - Actual file_count
100 0 0 100 100 0 100 0 100 0 Neg - Actual file_count
100 0 100 0 100 0 100 0 100 0 Pos - Actual system_load
100 0 100 0 4 96 100 0 100 0 Neg - Actual system_load
100 0 100 0 100 0 99 1 100 0 Pos - Actual ls_basic
100 0 100 0 100 0 2 98 100 0 Neg - Actual ls_basic
99 1 100 0 100 0 100 0 100 0 Pos - Actual filename_length
3 97 100 0 99 1 100 0 0 100 Neg - Actual filename_length
इस स्क्रिप्ट के उपलब्ध मापदंडों के बारे में अधिक जानने के लिए python3 evaluate.py -h का उपयोग करके मैनुअल देखें। साथ ही, हमारे पेपर में मूल्यांकन के लिए उपयोग किए गए पैरामीटरीकृत कमांडों को देखने के लिए demo.sh पर एक नज़र डालें।
यदि आप इस रिपॉजिटरी में दिए गए किसी भी संसाधन का उपयोग करते हैं, तो कृपया निम्नलिखित प्रकाशन को उद्धृत करें: