
فازر معالج x86
: فازر معالجات x86
تقوم أداة sandsifter بتدقيق معالجات x86 بحثًا عن التعليمات المخفية وعيوب العتاد، عبر توليد كود آلة بشكل منهجي للتنقيب في مجموعة تعليمات المعالج، ورصد التنفيذ بحثًا عن الحالات الشاذة. كشفت sandsifter عن تعليمات معالج سرية من كل بائع رئيسي؛ وثغرات برمجية واسعة الانتشار في مفككات التجميع والمجمِّعات والمحاكيات؛ وعيوبًا في الهايبرفايزرات الخاصة بالمؤسسات؛ وعيوبًا في عتاد شرائح x86، بعضها حميد وبعضها حرج أمنيًا.
مع تعدد معالجات x86 الموجودة، تهدف الأداة إلى تمكين المستخدمين من فحص أنظمتهم الخاصة بحثًا عن التعليمات المخفية والعيوب.
لتشغيل تدقيق أساسي على معالجك:
sudo ./sifter.py --unk --dis --len --sync --tick -- -P1 -t

يتم فحص الكمبيوتر بشكل منهجي بحثًا عن التعليمات الشاذة. في النصف العلوي، يمكنك رؤية التعليمات التي تختبرها sandsifter حاليًا على المعالج. وفي النصف السفلي، تعرض sandsifter الحالات الشاذة التي تعثر عليها.
سيستغرق البحث من بضع ساعات إلى بضعة أيام، اعتمادًا على سرعة معالجك وتعقيده. وعند اكتماله، لخّص النتائج:
./summarize.py data/log

عادةً ما يتم العثور على عدة ملايين من التعليمات غير الموثّقة على معالجك، لكنها تقع عمومًا في عدد صغير من المجموعات المختلفة. بعد توزيع الحالات الشاذة في مجموعات، تحاول أداة التلخيص إسناد كل تعليمة إلى فئة من فئات المشكلات:
اضغط 'Q' للخروج والحصول على ملخص نصي لعملية فحص النظام:
قد يصعب أحيانًا على الأدوات تصنيف نتائج الفحص تلقائيًا، وقد تتطلب تحليلًا يدويًا. للمساعدة في تحليل نتائجك، لا تتردد في إرسال ملف ./data/log إلى [email protected]. لا يتضمن هذا السجل أي معلومات شخصية سوى الشركة المصنّعة للمعالج وطرازه ومراجعته (من /proc/cpuinfo).
كشف الفحص باستخدام sandsifter عن ميزات معالج غير موثّقة عبر عشرات الفئات من رموز opcode، وعيوبًا في الهايبرفايزرات الخاصة بالمؤسسات، وثغرات في كل أداة رئيسية تقريبًا لفك التجميع والمحاكاة، وعيوب عتاد حرجة تفتح ثغرات أمنية في المعالج نفسه.
يمكن العثور على تفاصيل النتائج في الورقة التقنية الخاصة بالمشروع.
(TODO: تعداد تفصيلي للنتائج هنا)
تتطلب sandsifter أولاً تثبيت مفكك التجميع Capstone: http://www.capstone-engine.org/. يمكن عادةً تثبيت Capstone باستخدام:
sudo apt-get install libcapstone3 libcapstone-dev
sudo pip install capstone
يمكن بناء sandsifter باستخدام:
make
ثم يتم تشغيلها باستخدام
sudo ./sifter.py --unk --dis --len --sync --tick -- -P1 -t
تُمرَّر الخيارات إلى sifter باستخدام --flag، وإلى injector باستخدام -- -f.
مثال:
sudo ./sifter.py --unk --dis --len --sync --tick -- -P1 -t
خيارات Sifter:
--len
البحث عن اختلافات الطول بين جميع التعليمات (تعليمات نُفِّذت
بشكل مختلف عما توقعه مفكك التجميع، أو لم تكن موجودة عندما
توقعها مفكك التجميع
--dis
البحث عن اختلافات الطول بين التعليمات الصالحة (تعليمات
نُفِّذت بشكل مختلف عما توقعه مفكك التجميع)
--unk
البحث عن التعليمات غير المعروفة (تعليمات لا يعرفها مفكك
التجميع لكنها تُنفَّذ بنجاح)
--ill
عكس --unk؛ البحث عن عمليات فك تجميع غير صالحة (تعليمات لا
تُنفَّذ بنجاح لكن مفكك التجميع يعترف بها)
--tick
كتابة التعليمات الحالية إلى القرص بشكل دوري
--save
حفظ تقدم البحث عند الخروج
--resume
استئناف البحث من آخر حالة محفوظة
--sync
كتابة نتائج البحث إلى القرص فور العثور عليها
--low-mem
عدم تخزين النتائج في الذاكرة
خيارات Injector:
-b
الوضع: القوة العمياء
-r
الوضع: فازينج عشوائي
-t
الوضع: فازينج نَفقي
-d
الوضع: فازينج موجَّه خارجيًا
-R
وضع الإخراج الخام
-T
وضع الإخراج النصي
-x
كتابة تقدم دوري إلى stderr
-0
السماح بالإلغاء المرجعي لـ null (يتطلب صلاحيات sudo)
-D
السماح بالبادئات المكررة
-N
بدون دعم بت NX
-s seed
في البحث العشوائي، قيمة البذرة (seed)
-B brute_depth
في البحث بالقوة العمياء، أقصى عمق للبحث
-P max_prefix
الحد الأقصى لعدد البادئات التي سيتم البحث فيها
-i instruction
التعليمة التي يبدأ عندها البحث (شاملة)
-e instruction
التعليمة التي ينتهي عندها البحث (غير شاملة)
-c core
النواة التي سيتم تنفيذ البحث عليها
-X blacklist
وضع التعليمات المحددة في القائمة السوداء
-j jobs
عدد المهام المتزامنة التي سيتم تشغيلها
-l range_bytes
عدد بايتات التعليمات الأساسية في كل نطاق فرعي
m: الوضع - تغيير وضع البحث (القوة العمياء أو العشوائي أو النفقي) لأداة sifter
q: خروج - الخروج من أداة sifter
p: إيقاف مؤقت - إيقاف البحث مؤقتًا أو استئنافه
يدعم الفحص أربع خوارزميات بحث مختلفة، يمكن ضبطها من سطر الأوامر أو التنقل بينها عبر مفاتيح الاختصار.
sudo
للحصول على أفضل النتائج، يجب تشغيل الأداة كمستخدم جذر (root). هذا ضروري لكي تتمكن العملية من تعيين صفحة في الذاكرة عند العنوان 0، وهو ما يتطلب صلاحيات الجذر. تمنع هذه الصفحة العديد من التعليمات من التسبب في خطأ تجزئة (seg-fault) عند الوصول إلى الذاكرة، مما يسمح بتحليل أكثر دقة للأخطاء.
البادئات
القيد الرئيسي لعمق البحث في التعليمات هو عدد بايتات البادئة التي سيتم استكشافها، حيث يزيد كل بايت بادئة إضافي من مساحة البحث بعامل يبلغ حوالي 10. حدد عدد بايتات البادئة باستخدام الخيار -P.
الألوان
واجهة أداة sifter مصممة لطرفية تدعم 256 لونًا. وعلى الرغم من أن التفاصيل تختلف اختلافًا كبيرًا حسب طرفيتك، يمكن تحقيق ذلك تقريبًا باستخدام:
export TERM='xterm-256color'
الواجهة الرسومية
تفترض الواجهة أن حجم الطرفية لا يقل عن حجم معين؛ إذا لم تكن الواجهة تُعرض بشكل صحيح، فجرّب تكبير حجم الطرفية؛ ويمكن تحقيق ذلك غالبًا عن طريق تصغير حجم خط الطرفية.
في بعض الحالات، قد يكون من المرغوب أو الضروري تشغيل الأداة بدون الواجهة الرسومية. يمكن القيام بذلك عن طريق تشغيل injector مباشرة:
sudo ./injector -P1 -t -0
لفلترة نتائج استدعاء مباشر لـ injector، يمكن استخدام grep. على سبيل المثال،
sudo ./injector -P1 -r -0 | grep '\.r' | grep -v sigill
يبحث عن التعليمات التي اختلف فيها المعالج ومفكك التجميع حول طول التعليمات (grep '.r')، لكن التعليمات نُفِّذت بنجاح (grep -v sigill).
الفازينج الموجَّه
في كثير من الحالات، من المفيد توجيه الفازر إلى هدف محدد. على سبيل المثال، إذا كنت تشتبه في وجود ثغرات في محاكٍ ما حول بادئات 'lock' المتكررة (0xf0)، يمكنك توجيه الفازر للبحث في هذه المنطقة من فضاء التعليمات باستخدام الخيارين -i و -e:
sudo ./sifter.py --unk --dis --len --sync --tick -- -t -i f0f0 -e f0f1 -D -P15
الأنظمة القديمة
لفحص الأنظمة الأقدم بكثير (معالجات فئة i586، الأنظمة منخفضة الذاكرة)، مرّر الخيار --low-mem إلى sifter والخيار -N إلى injector:
sudo ./sifter.py --unk --dis --len --sync --tick --low-mem -- -P1 -t -N
sandsifter هي جهد بحثي من كريستوفر دوماس (@xoreaxeaxeax).
إذا لاحظت اكتمال عمليات الفحص بسرعة كبيرة (على سبيل المثال، اكتمال الفحص في ثوانٍ)، فعادةً ما يكون السبب هو أن هذه الخيارات مطلوبة للمعالج الذي تفحصه.
32 مقابل 64 بت
افتراضيًا، تُبنى sandsifter لاستهداف عدد البتات (bitness) في نظام التشغيل المضيف. ومع ذلك، تختلف سلوكيات بعض التعليمات عند تشغيلها في عملية 32 بت مقارنةً بتشغيلها في عملية 64 بت. لاستكشاف هذه السيناريوهات، قد يكون من المفيد أحيانًا تشغيل sandsifter بنسخة 32 بت على نظام 64 بت.
لبناء نسخة 32 بت من sandsifter على نظام 64 بت، يجب تثبيت Capstone بنسخة 32 بت؛ يمكن العثور على إرشادات ذلك على http://www.capstone-engine.org/.
ثم يجب بناء sandsifter لمعمارية 32 بت:
make CFLAGS=-m32
وبهذا، يمكن استكشاف فضاء التعليمات الخاص بـ 32 بت على نظام 64 بت.