
كشف أنشطة إخفاء الملفات الخاصة بـ rootkit من خلال تحليل التحولات في أوقات تنفيذ دوال النواة.
يحتوي هذا المستودع على كود لجمع قياسات زمنية لوظائف النواة التي يتم التلاعب بها بواسطة برامج الروت كيت عند إخفاء الملفات، بالإضافة إلى طريقة كشف شبه خاضعة للإشراف تحلل التحولات في أوقات تنفيذ وظائف النواة. يعتمد هذا التنفيذ على برنامج الروت كيت مفتوح المصدر CARAXES، الذي يلف وظيفة filldir للتلاعب بنتائج تعداد الملفات، على سبيل المثال عند تنفيذ الأمر ls. يتم أخذ القياسات الزمنية من عدة وظائف في استدعاء النظام getdents (بما في ذلك filldir) باستخدام مجسات eBPF. للكشف، نطبق نموذج تعلم آلة بسيط يعتمد على الاختبارات الإحصائية. نُحيل إلى المنشور التالي للحصول على شروحات مفصلة لآليات جمع البيانات وكشف الشذوذ. إذا استخدمت أيًا من الموارد المتاحة في هذا المستودع، يرجى الاستشهاد بالمنشور التالي:
تشرح الخطوات التالية كيفية إعداد برنامج الروت كيت وكيفية جمع القياسات الزمنية من وظائف النواة. إذا كنت مهتمًا فقط بكشف الشذوذ واستخدام مجموعات البيانات العامة لدينا، يمكنك تخطي هذا القسم.
تم اختبار الروت كيت والتتبع على نواة لينكس 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 ويتطلب سيناريو تحميل النظام تثبيت 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 بالملف المقدم في هذا المستودع (يضمن ذلك أن يتم ربط filldir بدلاً من getdents)، ثم قم بتجميع الروت كيت.
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
إذا واجهت مشاكل في تثبيت الروت كيت أو ترغب في اختبار ما إذا كان يعمل كما هو متوقع، فراجع صفحة ReadMe على CARAXES.
بعد ذلك، عد إلى هذا المستودع وافتح ملف 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-basic بدلاً من ls أو محاكاة تحميل النظام) وتعيين أسماء لتشغيلات مختلفة (--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). سيقوم النص بتحميل جميع الملفات من المجلد المحدد، وتقسيمها إلى بيانات تدريب واختبار (ملخصة في المخرجات)، وحساب وطباعة مقاييس الكشف، ورسم مصفوفة ارتباك.
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 للاطلاع على الأوامر ذات المعلمات التي استخدمناها للتقييم في ورقتنا البحثية.
إذا استخدمت أيًا من الموارد المتاحة في هذا المستودع، يرجى الاستشهاد بالمنشور التالي: