
مختبر التشويش لمعالج 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 عن ميزات معالج غير موثقة عبر عشرات فئات رموز العمليات، وثغرات في برامج الإدارة الافتراضية للمؤسسات، وأخطاء في كل أداة تفكيك ومحاكاة رئيسية تقريبًا، وأخطاء عتادية حرجة تفتح ثغرات أمنية في المعالج نفسه.
يمكن العثور على تفاصيل النتائج في الورقة البيضاء للمشروع.
(TODO: detailed results enumeration here)
يتطلب 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
يتم تمرير العلامات إلى المنخل باستخدام --flag، وإلى الحاقن باستخدام -- -f.
مثال:
sudo ./sifter.py --unk --dis --len --sync --tick -- -P1 -t
علامات المنخل:
--len
البحث عن اختلافات الطول في جميع التعليمات (تعليمات تم تنفيذها بشكل مختلف عما توقعه مفكك التجميع، أو لم تكن موجودة عندما توقعها مفكك التجميع)
--dis
البحث عن اختلافات الطول في التعليمات الصالحة (تعليمات تم تنفيذها بشكل مختلف عما توقعه مفكك التجميع)
--unk
البحث عن تعليمات غير معروفة (تعليمات لا يعرفها مفكك التجميع ولكنها تُنفذ بنجاح)
--ill
العكس من --unk، البحث عن تفكيكات غير صالحة (تعليمات لا تُنفذ بنجاح ولكن مفكك التجميع يعترف بها)
--tick
كتابة التعليمات الحالية إلى القرص بشكل دوري
--save
حفظ تقدم البحث عند الخروج
--resume
استئناف البحث من آخر حالة محفوظة
--sync
كتابة نتائج البحث إلى القرص فور العثور عليها
--low-mem
عدم تخزين النتائج في الذاكرة
علامات الحاقن:
-b
الوضع: القوة العمياء
-r
الوضع: التزويد العشوائي
-t
الوضع: التزويد النفقي
-d
الوضع: التزويد الموجه خارجيًا
-R
وضع الإخراج الخام
-T
وضع الإخراج النصي
-x
كتابة التقدم الدوري إلى stderr
-0
السماح بإلغاء الإشارة الفارغة (يتطلب sudo)
-D
السماح بالبادئات المكررة
-N
لا دعم لبت NX
-s seed
في البحث العشوائي، قيمة البذرة
-B brute_depth
في البحث بالقوة العمياء، أقصى عمق للبحث
-P max_prefix
الحد الأقصى لعدد البادئات للبحث
-i instruction
التعليمة التي يبدأ عندها البحث (شاملة)
-e instruction
التعليمة التي ينتهي عندها البحث (غير شاملة)
-c core
النواة التي يتم إجراء البحث عليها
-X blacklist
إدراج التعليمة المحددة في القائمة السوداء
-j jobs
عدد الوظائف المتزامنة للتشغيل
-l range_bytes
عدد بايتات التعليمات الأساسية في كل نطاق فرعي
m: الوضع - تغيير وضع البحث (القوة العمياء، العشوائي، أو النفقي) للمنخل
q: خروج - الخروج من المنخل
p: إيقاف مؤقت - إيقاف البحث أو استئنافه مؤقتًا
يدعم المسح أربع خوارزميات بحث مختلفة، يمكن ضبطها من سطر الأوامر، أو التنقل بينها عبر مفاتيح الاختصار.
sudo
للحصول على أفضل النتائج، يجب تشغيل الأداة كمستخدم جذر. هذا ضروري حتى تتمكن العملية من تعيين صفحة في الذاكرة على العنوان 0، الأمر الذي يتطلب صلاحيات الجذر. تمنع هذه الصفحة العديد من التعليمات من التسبب في خطأ تجزئة على الوصول إلى الذاكرة، مما يسمح بتحليل أخطاء أكثر دقة.
البادئات
القيود الرئيسية لعمق بحث التعليمات هو عدد بايتات البادئة لاستكشافها، حيث يزيد كل بايت بادئة إضافي من مساحة البحث بعامل حوالي 10. حدد بايتات البادئة باستخدام العلم -P.
الألوان
واجهة المنخل مصممة لطرفية 256 لونًا. بينما تختلف التفاصيل بشكل كبير حسب الطرفية الخاصة بك، يمكن تحقيق ذلك تقريبًا باستخدام:
export TERM='xterm-256color'
واجهة المستخدم الرسومية
تفترض الواجهة أن الطرفية بحجم معين على الأقل؛ إذا كانت الواجهة لا تعرض بشكل صحيح، حاول زيادة حجم الطرفية؛ يمكن تحقيق ذلك غالبًا عن طريق تقليل حجم خط الطرفية.
في بعض الحالات، قد يكون من المرغوب فيه أو الضروري تشغيل الأداة دون الواجهة الرسومية. يمكن القيام بذلك عن طريق تشغيل الحاقن مباشرة:
sudo ./injector -P1 -t -0
لتصفية نتائج استدعاء الحاقن المباشر، يمكن استخدام 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 إلى المنخل والعلم -N إلى الحاقن:
sudo ./sifter.py --unk --dis --len --sync --tick --low-mem -- -P1 -t -N
sandsifter هو جهد بحثي من Christopher Domas (@xoreaxeaxeax).
إذا لاحظت أن عمليات المسح الخاصة بك تكتمل بسرعة كبيرة (على سبيل المثال، يكتمل المسح في ثوانٍ)، فعادةً لأن هذه العلامات مطلوبة للمعالج الذي تفحصه.
32 مقابل 64 بت
افتراضيًا، يتم بناء sandsifter لاستهداف بتية نظام التشغيل المضيف. ومع ذلك، فإن بعض التعليمات لها سلوكيات مختلفة عند تشغيلها في عملية 32 بت مقارنة بعملية 64 بت. لاستكشاف هذه السيناريوهات، من المفيد أحيانًا تشغيل sandsifter 32 بت على نظام 64 بت.
لبناء sandsifter 32 بت على نظام 64 بت، يجب تثبيت Capstone كـ 32 بت؛ يمكن العثور على تعليمات ذلك على http://www.capstone-engine.org/.
ثم يجب بناء sandsifter لهندسة 32 بت:
make CFLAGS=-m32
وبهذا، يمكن استكشاف مساحة تعليمات 32 بت على نظام 64 بت.