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