X86 المعالج تجميعها في الهواء الطلق

نحن لا نثق في البرنامج لفترة طويلة ، وبالتالي نقوم بإجراء تدقيقه ، وإجراء هندسة عكسية ، وتشغيله في وضع خطوة بخطوة ، وتشغيله في وضع الحماية. ماذا عن المعالج الذي يعمل عليه برنامجنا؟ - نحن نثق عميقًا وبكل إخلاص في هذه القطعة الصغيرة من السيليكون. ومع ذلك ، فإن الأجهزة الحديثة لديها نفس المشاكل مثل البرامج: الوظائف السرية غير الموثقة ، والأخطاء ، والثغرات ، والبرامج الضارة ، وأحصنة طروادة ، والجذور الخفية ، والخلفيات.



ISA (بنية مجموعة التعليمات) x86 هي واحدة من أطول "معماريات مجموعة التعليمات" في التاريخ. بدءًا من تصميم 8086 الذي تم تطويره في عام 1976 ، تخضع ISA لتغييرات وتحديثات مستمرة ؛ مع الحفاظ على التوافق مع الإصدارات السابقة ودعم المواصفات الأصلية. على مدى 40 عامًا من النمو ، نمت بنية ISA ولا تزال تنمو مع العديد من الأوضاع الجديدة ومجموعات من التعليمات ، كل منها يضيف طبقة جديدة إلى التصميم السابق ، الذي تم تحميله بالفعل. نظرًا لسياسة التوافق التام مع الإصدارات السابقة ، تحتوي معالجات x86 الحديثة على تعليمات وأوضاع تم نسيانها بالكامل بالفعل. ونتيجة لذلك ، لدينا بنية معالج ، وهي متاهة معقدة من التقنيات الجديدة والعتيقة. مثل هذه البيئة المعقدة للغاية - تسبب العديد من المشاكل مع الأمن السيبراني للمعالج. لذلك ، لا يمكن أن تدعي معالجات x86 أنها جذر موثوق به للبنية التحتية السيبرانية الهامة.


هل ما زلت تثق في المعالج الخاص بك؟


أمان البرامج ونظام التشغيل - يعتمد على أمان الأجهزة التي يتم نشرها عليها. كقاعدة ، لا يأخذ مطورو البرامج في الاعتبار حقيقة أن الأجهزة التي يتم نشر برامجهم عليها يمكن أن تكون غير موثوقة وخبيثة. عندما تتصرف الأجهزة عن طريق الخطأ (سواء عن قصد أم لا) ، تصبح آليات أمان البرامج عديمة القيمة تمامًا. لسنوات عديدة ، تم تقديم نماذج مختلفة من المعالجات الآمنة: Intel SGX ، AMD Pacifica ، إلخ. ومع ذلك ، فإن الانتظام الذي تحسد عليه والذي يتم من خلاله نشر المعلومات حول الأعطال الحرجة (من الآونة الأخيرة ، على سبيل المثال Meltdown و Specter) والكشف عن وظائف "التصحيح" غير الموثقة - يؤدي إلى فكرة أن ثقتنا المخلصة في المعالجات لا أساس لها.


تعد معالجات x86 الحديثة متداخلة ومعقدة للغاية من أحدث التقنيات العتيقة. 8086 كان لديها 29 ألف ترانزستور ، بنتيوم 3 مليون ، برودويل 3.2 مليار ، كانونلوك أكثر من 10 مليار.



مع وجود العديد من الترانزستورات ، ليس من المستغرب أن تكون معالجات x86 الحديثة مليئة بالتعليمات غير الموثقة ونقاط الضعف في الأجهزة. من بين غير الموثقين ، التي تم اكتشافها عن طريق الصدفة تقريبًا ، التعليمات: ICEBP (0xF1) ، LOADALL (0x0F07) ، apicall (0x0FFFF0) [1] ، والتي تسمح بإلغاء قفل المعالج للوصول غير المصرح به إلى مناطق الذاكرة المحمية.


بالنسبة للعديد من نقاط الضعف في الأجهزة من المعالجات (انظر الشكلين أدناه) ، فهي تسمح للمهاجم السيبراني بتصعيد الامتيازات [3] ، واستخراج مفاتيح التشفير [4] ، وإنشاء تعليمات جديدة للمجمع [2] ، وتغيير وظائف تعليمات المجمّع الموجودة بالفعل [2] ، قم بتثبيت الخطافات بناء على تعليمات المجمِّع [2] ، وتحكم في "المحاكاة الافتراضية المسرَّعة للأجهزة" [7] ، والتدخل في "حسابات التشفير الذري" [7] ، وأخيرًا ، الأشياء الحلوة ، أدخل "وضع الله": إيف نفسك الأجهزة الشرعي إنتل ME مستتر (الذي يتيح لك الحصول على وصول بعيد تحول حتى تشغيل الكمبيوتر). [8] وكل هذا - دون ترك أي آثار رقمية.




المعالجات الحديثة هي برامج أكثر من الأجهزة


بالمعنى الدقيق للكلمة ، لا يمكن حتى أن تسمى المعالجات الحديثة "الأجهزة" بالمعنى الكامل للكلمة. لأنه يتم توفير وظائفهم الأكثر أهمية (بما في ذلك ISA) عن طريق وميض الرمز الصغير. في البداية ، كان الرمز الصغير مسؤولًا بشكل رئيسي عن التحكم في فك تشفير وتنفيذ تعليمات المجمع المعقدة: عمليات الفاصلة العائمة ، بدائل MMX ، معالجات الخطوط ببادئة REP ، إلخ. ومع ذلك ، بمرور الوقت ، يتم تعيين المزيد والمزيد من المسؤولية إلى الرمز الصغير لعمليات المعالجة داخل المعالج. على سبيل المثال ، يتم تنفيذ الإضافات الحديثة لمعالجات Intel ، مثل AVX (Advanced Vector Extensions) و VT-d (الظاهرية للأجهزة) على الرمز الصغير.


بالإضافة إلى ذلك ، فإن الرمز الصغير مسؤول اليوم ، من بين أمور أخرى ، عن الحفاظ على حالة المعالج ، وإدارة ذاكرة التخزين المؤقت ، وكذلك إدارة توفير الطاقة. لتوفير الطاقة ، يحتوي الرمز الصغير على آلية مقاطعة تعالج حالات الطاقة: C-state (درجة النوم الموفر للطاقة: من الحالة النشطة إلى النوم العميق) و P-state (مجموعات مختلفة من الجهد والتردد). لذا ، على سبيل المثال ، فإن الرمز الصغير مسؤول عن إعادة ضبط ذاكرة التخزين المؤقت L2 عند دخول الحالة C4 ، وكذلك عند الخروج منها.


لماذا يستخدم مصنعو المعالجات الرمز الصغير؟


يستخدم مصنعو معالجات x86 الرمز الصغير لتحليل تعليمات التجميع المعقدة (التي يمكن أن يصل طولها إلى 15 بايت) في سلسلة من التعليمات الدقيقة البسيطة ، من أجل تبسيط بنية الأجهزة وتسهيل التشخيص. في الواقع ، الرمز الصغير هو مترجم بين بنية CISC الخارجية (المرئية للمستخدم) والبنية RISC الداخلية (الأجهزة).


إذا تم الكشف عن أخطاء في بنية CISC (بشكل أساسي في ISA) ، يقوم المصنعون بنشر تحديث الرمز الصغير الذي يمكن تنزيله إلى المعالج من خلال BIOS / UEFI للوحة الأم أو من خلال نظام التشغيل (أثناء عملية التمهيد). بفضل نظام التحديث هذا القائم على الرموز الدقيقة ، يوفر مصنعو المعالجات أنفسهم المرونة وتقليل التكلفة - مع إصلاح الأخطاء في أجهزتهم. إن الخطأ المثير مع fdiv ، الذي أوقع بشدة معالجات Intel Pentium في عام 1994 ، جعل حقيقة أن خطأ الأجهزة عالية التقنية المعرضة تمامًا مثل البرامج يجعل الأمر أكثر وضوحًا. وقد أعطت هذه الحادثة المصنعين المزيد من الاهتمام بهندسة المعالجات القائمة على الرموز الدقيقة. لذلك ، بدأت Intel و AMD في بناء معالجاتهما باستخدام تقنية الرمز الصغير. Intel - بدءًا من Pentium Pro (P6) ، الذي صدر في عام 1995. AMD - بدءًا من K7 ، الذي تم إصداره في عام 1999.


يصبح كل شيء سريًا واضحًا


على الرغم من حقيقة أن مصنعي المعالجات يحاولون الحفاظ على بنية الرموز الدقيقة وآلية تحديثها بسرية تامة ، فإن العدو ليس نائمًا. أجزاء من المعلومات المجزأة (بشكل رئيسي من براءات الاختراع ، مثل AMD RISC86 [5]) والانعكاس المدروس لتحديثات BIOS الرسمية (كما كان الحال مع K8 [6]) ، تلقي الضوء تدريجيًا على سر الرمز الصغير (انظر ، على سبيل المثال ، في الشكل أدناه " آلية تحديث المعالج المصغر AMD ”). وبفضل التطور المستمر للأدوات العكسية (البرامج والأجهزة على حد سواء) [2] ، وتقنيات التشويش الواعدة [1] وظهور أدوات مفتوحة المصدر مثل Microparse [9] و Sandsifter [10] - يمكن للمهاجم السيبراني أن يتعلم كل شيء عن الرمز الصغير الضروري الاضطرار إلى كتابة برامج ضارة على الرمز الصغير.



لذا ، على سبيل المثال ، في [2] كـ "Hello world!" (الخطوة الأولى في تروجنة الرمز الصغير) تم تطوير "ربط صغير" (برنامج الرمز الصغير الذي يعترض تعليمات المجمع) ، والذي يحسب عدد المرات التي وصل فيها المعالج إلى الأمر div. هذا الميكروفون هو حقنة في معالج قسم تعليمات المجمّع.



يقدم المرجع نفسه [2] كتابًا ميكرويًا أكثر تقدمًا ، يجلس بهدوء في تعليمات المجمّع لـ div ebx ، دون إعطاء وجوده ، ولا يتم تنشيطه إلا عند استيفاء شروط محددة عند الإشارة إلى div ebx: يحتوي سجل ebx على القيمة B ، والسجل يحتوي eax على القيمة A. عند تنشيطه ، يزيد هذا الميكروفون الصغير من قيمة سجل eip (مؤشر التعليمات الحالي) بمقدار واحد. ونتيجة لذلك ، يستمر تنفيذ البرنامج (الذي كان لديه الشجاعة للإشارة إلى تعليمات div ebx) مع إزاحة: ليس من البايت الأول للأمر الذي يلي div ebx ، ولكن من البايت الثاني. إذا تم تحديد قيم أخرى في سجلات eax و ebx ، فسيعمل ebx div كالمعتاد. ما هي القيمة العملية في ذلك؟ على سبيل المثال ، لتنشيط سلسلة مخفية من تعليمات المجمِّع بهدوء عند استخدام تقنيات التعتيم مع "تعليمات متداخلة" [11].



يوضح هذان المثالان كيف يمكن استخدام تعليمات المجمّع الشرعية لإخفاء رمز طروادة التعسفي فيها.


في نفس الوقت ، يمكن للمهاجم السيبراني تنشيط حمولته الخبيثة - بما في ذلك عن بعد. على سبيل المثال ، عندما يتم استيفاء الشرط اللازم للتنشيط على صفحة ويب يسيطر عليها مهاجم. هذا ممكن بفضل مترجمين Just-in-Time (JIT) و Ahead-of-Time (AOT) المدمجين في متصفحات الويب الحديثة. تسمح لك هذه المترجمات بإصدار دفق محدد مسبقًا من تعليمات المجمّع لرمز الجهاز - حتى إذا كتبت البرنامج حصريًا في جافا سكريبت عالي المستوى (انظر القائمة الأخيرة أعلاه).


قائمة المراجع
  1. كريستوفر دوماس . كسر x86 ISA // DEFCON 25.07.2017.
  2. فيليب كوبي . الهندسة العكسية لـ x86 المعالج الصغير // وقائع الندوة الأمنية الـ 26 لـ USENIX. 2017. ص. 1163-1180.
  3. ماثيو هيكس . المواصفات: آلية وقت تشغيل خفيفة الوزن لحماية البرامج من أخطاء المعالج الحرجة للأمان // وقائع المؤتمر الدولي الثامن والعشرين حول الدعم المعماري للغات البرمجة وأنظمة التشغيل (ASPLOS). 2015. ص. 517-529.
  4. عدي شامير . هجمات الأخطاء // وقائع المؤتمر السنوي الثامن والعشرين حول التشفير: التقدم في علم التشفير. 2008. ص. 221-240.
  5. جون فافور . مجموعة تعليمات RISC86 // US Patent 6336178. 2002.
  6. أوبتيرون مكشوف: الهندسة العكسية تحديثات AMD K8 Microcode . 2004.
  7. Saming Chen . تحليل الأمان لبرمجة المعالج x86 .2014.
  8. كاتالين سيمبانو . تستخدم البرامج الضارة ميزة Intel CPU الغامضة لسرقة البيانات وتجنب جدران الحماية . 2017.
  9. دامن تشن . Microparse: محلل Microcode لمعالجات AMD و Intel و VIA // GitHub. 2014.
  10. Sandsifter: معالج المعالج x86 // GitHib. 2017.
  11. Karev V.M. كيفية كتابة برنامج تجميع مع تعليمات متداخلة (تقنية أخرى للتعتيم على كود البايت) // Habrahabr. 2018. URL: (تاريخ الدخول: 25 أكتوبر 2018).

Source: https://habr.com/ru/post/ar427757/


All Articles