SockFuzzer: إطار عمل للتنقيب في نواة XNU
حالة المشروع
SockFuzzer، الذي صُمم في الأصل كأداة تنقيب موجهة للشبكات في نواة XNU (المستخدمة في macOS و iOS)، تطوّر ليصبح إطار عمل شاملًا للتنقيب في النواة. ورغم احتفاظه باسمه الأصلي تكريمًا لجذوره، يغطي SockFuzzer الآن مجموعة واسعة من الأنظمة الفرعية للنواة، بما في ذلك BSD و Mach والذاكرة الافتراضية والمزيد. يطبّق المشروع نهجًا فريدًا يحوّل نواة XNU إلى مكتبة يمكن "إقلاعها" وتنقيبها في مساحة المستخدم، مما يتيح اكتشاف الثغرات واستنساخها بكفاءة عبر أنظمة فرعية متعددة.
أهداف المشروع
- اختبار نواة XNU بشكل شامل في بيئة محكومة
- اكتشاف واستنساخ الثغرات عبر أنظمة XNU الفرعية المختلفة
- توفير إطار عمل للتنقيب المستمر وتحسين أمان XNU
- إظهار قيمة تطبيق تقنيات التنقيب المتقدمة في أبحاث النواة
- تمكين الاختبار الفعّال للتفاعلات والأنظمة الفرعية المعقدة للنواة
نظرة عامة على البنية
يستخدم SockFuzzer تصميمًا يعتمد على المضيف/"ضيف XNU"، حيث تُترجم نواة XNU كمكتبة وتُشغَّل داخل بيئة مخصصة في مساحة المستخدم. تتكون هذه البنية من عدة مكونات رئيسية:
- بيئة المضيف
- مكتبة ضيف XNU
- مُجدول مخصص (مبني على Concurrence)
- محرك التنقيب (Centipede من مشروع fuzztest التابع لـ Google)
- مشغّل الاختبار والقالب (Harness)
بيئة المضيف
توفر بيئة المضيف الأساس لتشغيل مكتبة ضيف XNU وإدارة عملية التنقيب. وتشمل:
- تطبيقات مخصصة لخدمات النواة الأساسية
- واجهة Hypercall للتواصل بين المضيف وضيف XNU
- مشغّل اختبار وقالب لتنفيذ اختبارات التنقيب
مكتبة ضيف XNU
تُترجم نواة XNU كمكتبة (libxnu) مع تعديلات طفيفة لتشغيلها في مساحة المستخدم. تشمل الجوانب الرئيسية:
- إضافة بادئات للرموز وإدارتها لتجنب التعارض مع رموز المضيف
- كشف انتقائي للدوال الداخلية لـ XNU عبر سكربت إصدارات
- دعم أنظمة فرعية متعددة: BSD و Mach والذاكرة الافتراضية والخيوط والعمليات وغيرها
- طبقة pmap فارغة لدعم الذاكرة الافتراضية (مع خطط لدعم pmap الخاص بـ ARM مستقبلًا)
المُجدول المخصص
استنادًا إلى مشروع Concurrence المحسّن، يدعم المُجدول المخصص الآن إمكانات خيوط كاملة:
- Executor: يوفر إنشاء الخيوط وحذفها وتبديل السياق
- FuzzedScheduler: يدير حالات الخيوط وقرارات الجدولة
- التكامل مع مكتبة ضيف XNU لدعم تعدد الخيوط بشكل صحيح
مشغّل الاختبار والقالب
يدير مشغّل الاختبار والقالب تنفيذ اختبارات التنقيب ويوفر:
- تهيئة بيئة ضيف XNU
- تنفيذ مدخلات التنقيب عبر أنظمة فرعية مختلفة
- اكتشاف الأعطال والإبلاغ عنها
الميزات الرئيسية
- تغطية شاملة لنواة XNU: اختبار أنظمة فرعية متعددة بما في ذلك BSD و Mach والذاكرة الافتراضية والخيوط والعمليات
- تنفيذ XNU في مساحة المستخدم: تشغيل مكونات نواة XNU في بيئة مساحة مستخدم محكومة
- دعم كامل لتعدد الخيوط: الاستفادة من Concurrence المحسّن لإمكانات تعدد خيوط صحيحة
- دعم الذاكرة الافتراضية: استخدام طبقة pmap فارغة مع خطط لدعم pmap الخاص بـ ARM
- تنقيب MIG: دعم لتنقيب واجهات مولّد واجهات Mach (MIG)
- واجهة Hypercall: تسهيل التواصل بين المضيف ومكونات ضيف XNU
الميزات المدعومة
- BSD
- Mach
- الذاكرة الافتراضية (مع طبقة pmap فارغة)
- الخيوط والعمليات
- الشبكات
- رسائل Mach
- واجهات MIG
سير العمل
- تُترجم نواة XNU كمكتبة مع التعديلات اللازمة
- تهيئ بيئة المضيف مكتبة ضيف XNU والمُجدول المخصص
- يولّد Centipede مدخلات منظمة باستخدام تعريفات protobuf
- ينفذ قالب الاختبار المدخلات، مستدعيًا استدعاءات النظام ورسائل Mach وواجهات النواة الأخرى
- يدير المُجدول المخصص تنفيذ الخيوط داخل ضيف XNU
- يراقب ASAN مشكلات تلف الذاكرة
- تُجمع وتحلَّل الأعطال ومعلومات التغطية
القيود والعمل المستقبلي
- دعم IOKit: لا يدعم التطبيق الحالي الأنظمة الفرعية لـ IOKit
- التنقيب عن الملفات الثنائية فقط: يعتمد النهج حاليًا على الكود المصدري الذي لا يتضمن جميع الوحدات
يشمل العمل المستقبلي:
- تنفيذ دعم IOKit
- دمج دعم pmap الخاص بـ ARM للذاكرة الافتراضية
- تكييف التقنيات لسيناريوهات التنقيب عن الملفات الثنائية فقط
- مواصلة توسيع التغطية والدعم للأنظمة الفرعية لـ XNU
قيود الإصدار العام
من أجل الحفاظ على هذا المستودع منظمًا وجيد البنية، سيحتاج المستخدمون إلى إضافة عدة تبعيات بأنفسهم إلى مجلد third_party، مثل xnu و bootstrap_cmds وبعض المكتبات الأخرى.