
استغلال لثغرة برمجيات AMD SEV-SNP (CVE-2023-31355) التي تفك تشفير ذاكرة عشوائية للضيوف المتقاعدين عن طريق إتلاف بذرة مفتاح UMC عبر كتابة إدخال RMP غير مهيأ إلى العنوان صفر.
يحتوي هذا المستودع على استغلال لثغرة في البرنامج الثابت لـ SEV. يسمح الاستغلال بفك تشفير ذاكرة عشوائية لضيف SEV-SNP بعد إلغاء تفعيله.
تم اختباره على الإصدار 1.55.16 (الأحدث وقت كتابة هذا النص).
يحاول snp_reclaim_buffer دون قيد أو شرط كتابة تغييرات RMP مرة أخرى حتى عندما لا يكون العنوان مغطى بـ RMP. إذا لم يكن address مغطى بـ RMP، فإن عنوان إدخال RMP page_rmp_paddr لا تتم تهيئته بشكل صحيح أبدًا ويبقى على قيمته الأولية 0. ونتيجة لذلك، يحاول البرنامج الثابت كتابة التغييرات إلى إدخال RMP مرة أخرى إلى العنوان 0. هذا أمر سيئ لأن العنوان 0 مغطى بـ RMP ولا ينبغي الكتابة إليه دون مزيد من الفحوصات. إذا كان address خارج المنطقة المغطاة بـ RMP، فإن page_rmp_entry لا تتم تهيئته بشكل صحيح أبدًا ويحتوي على ذاكرة غير مهيأة من المكدس. هذه الذاكرة غير المهيأة ثابتة عمليًا.
يوجد تعليق يحذر من هذا النمط البرمجي تحديدًا، وهو أيضًا سبب عدم مفاجأتي إذا لم أكن أول من أبلغ عن هذا.
يتم استدعاء snp_reclaim_buffer مع عنوان صفحة الحالة الخاصة بالمخازن المؤقتة الدائرية لـ SEV عندما يطلب الهايبرفايزر الخروج من وضع المخزن المؤقت الدائري. هذا العنوان يُتحكم فيه من قبل المهاجم. توجد بعض الفحوصات لهذا العنوان، لكن الصفحات الافتراضية (أي الصفحات الواقعة خارج المنطقة المغطاة بـ RMP) مسموح بها صراحةً.
يمكننا استغلال عملية الكتابة إلى العنوان 0 بوضع صفحة سياق ضيف هناك. من الملائم أن الحقل الأول في صفحة سياق الضيف هو بذرة مفتاح UMC، وهي بنفس حجم إدخال RMP تمامًا (كلاهما بحجم 16 بايت). من خلال خداع البرنامج الثابت لكتابة التغييرات مرة أخرى إلى العنوان 0، يمكننا إفساد بذرة مفتاح UMC. إدخال RMP غير المهيأ الذي تتم كتابته هو نفسه دائمًا، لذا فإن بذرة مفتاح UMC التالفة ستكون دائمًا متطابقة تقريبًا أيضًا: عدد الصفحات الفرعية (9 بتات) في إدخال RMP لا تتم كتابته، لكن جميع الحقول الأخرى تتم كتابتها. من خلال إنشاء صفحات سياق ضيف جديدة مرارًا وتكرارًا، بحيث يكون لكل منها عدد صفحات فرعية أولي عشوائي مختلف في كل مرة، يمكننا في النهاية إنشاء عدة ضيوف بنفس بذرة مفتاح UMC.
لاستغلال الثغرة، يمكننا تنفيذ الخطوات التالية:
0 للضيف الضحية.0 للضيف المهاجم.SNP_DBG_ENCRYPT لفك تشفير ذاكرة الضيف الضحية باستخدام صفحة سياق الضيف المهاجم. سينجح ذلك لأن الضيف الضحية والضيف المهاجم يتشاركان بذرة مفتاح UMC.نظرًا لأننا لا نستطيع فك تشفير الذاكرة إلا بعد إلغاء تفعيل الضيف، فمن غير الممكن إنشاء تقارير مصادقة مزيفة حتى مع تمكننا من الوصول إلى أسرار الضيف. يمكننا فقط إنشاء تقارير مصادقة مزيفة إذا تم ترحيل الضيف إلى مضيف آخر قبل إلغاء تفعيله: في هذه الحالة، ستعمل الأسرار (أي VMPCKs) الخاصة بالضيف المُلغى تفعيله أيضًا على المثيل المُرحَّل الجديد.
لكن من الناحية العملية، تخزّن العديد من التطبيقات معلومات حساسة أخرى (مثل المفاتيح الخاصة ومفاتيح تشفير القرص) يمكن تسريبها باستخدام هذا الاستغلال.
يجب كتابة إدخال RMP مرة أخرى فقط إذا لم تكن الصفحة في الحالة الافتراضية.