
مثال على استخدام ثغرة "Spectre" المكتشفة (CVE-2017-5753 و CVE-2017-5715)
مثال على استخدام ثغرة "Spectre" المُكتشفة من 2 يناير 2018 (CVE-2017-5753 و CVE-2017-5715)
Spectre يكسر العزلة بين التطبيقات المختلفة. يسمح للمهاجم بخداع البرامج الخالية من الأخطاء والتي تتبع أفضل الممارسات لتسريب أسرارها. في الواقع، فحوصات الأمان الخاصة بأفضل الممارسات المذكورة تزيد من سطح الهجوم وقد تجعل التطبيقات أكثر عرضة لـ Spectre.
C، تستخدم المكتبات:
نضع النص "The Magic Words are Squeamish Ossifrage." في الذاكرة ثم نحاول قراءته باستخدام الثغرة. إذا كان النظام عرضة، سترى نفس النص في المخرجات، مقروءًا من الذاكرة.
في هذا الكود، إذا تم تنفيذ التعليمات المترجمة في victim_function() بترتيب برمجي صارم، فإن الدالة ستقرأ فقط من array1[0..15] لأن حجم array1 = 16. ومع ذلك، عند تنفيذها تخمينيًا، تصبح القراءات خارج النطاق ممكنة. تقوم الدالة readMemoryByte() بعدة استدعاءات تدريبية لـ victim_function() لجعل مُنبئ التفرع يتوقع قيمًا صالحة لـ x، ثم تستدعي بـ x خارج النطاق. يُخطئ التفرع الشرطي في التوقع، ويقرأ التنفيذ التخميني الناتج بايتًا سريًا باستخدام x خارج النطاق. ثم يقرأ الكود التخميني من array2[array1[x] * 512]، مما يُسرب قيمة array1[x] إلى حالة ذاكرة التخزين المؤقت. لإكمال الهجوم، يتم استخدام تقنية flush+probe بسيطة لتحديد أي خط ذاكرة تخزين مؤقت في array2 تم تحميله، مما يكشف محتويات الذاكرة. يتكرر الهجوم عدة مرات، لذا حتى إذا كان البايت الهدف غير مخبأ في البداية، فإن التكرار الأول سيجلبه إلى ذاكرة التخزين المؤقت.
الكود غير المحسّن يقرأ حوالي 10 كيلوبايت/ثانية على جهاز i7 Surface Pro 3.
gcc -std=c99 Source.c -o spectre.out
أو
make
أنشئ مشروعًا فارغًا جديدًا وأضف Source.c ثم انقر على Build.
.\spectre.out بدون معاملات.
.\spectre.out {address} {length} مع المعاملات: