
استغلال لـ CVE-2024-21980 يستهدف برامج AMD SEV الثابتة لفك تشفير الذاكرة العشوائية للضيوف SEV-SNP المسرحين عبر تجاوز تطبيق المخزن المؤقت للأوامر.
يحتوي هذا المستودع على استغلال لثغرة في البرنامج الثابت لـ SEV. يسمح الاستغلال بفك تشفير ذاكرة عشوائية لضيف SEV-SNP بعد إلغاء تكليفه.
تم اختباره على الإصدار 1.55.16 (الأحدث وقت كتابة هذا التقرير).
يحتوي البرنامج الثابت لـ SEV على جدول يُسمى master_handler_table يحتوي على مؤشرات دالة لجميع الأوامر مع عدد قليل من الخصائص الإضافية ذات الصلة بالأوامر. اثنتان من تلك الخصائص الإضافية هما cmd_buf_type وsnp_cmd_buf_enforcement. يحدد cmd_buf_type ما إذا كان يجب نسخ المخزن المؤقت للأوامر من وإلى ذاكرة المضيف. يحدد snp_cmd_buf_enforcement ما إذا كانت عمليات النسخ هذه يجب أن تخضع لفحوصات تتحقق من أن الذاكرة الداعمة للمخزن المؤقت للأوامر في حالة FIRMWARE أو DEFAULT. يجب أن تكون جميع الأوامر التي يكون cmd_buf_type فيها إما CMD_BUF_OUTPUT_ONLY أو CMD_BUF_INPUT_AND_OUTPUT أو CMD_BUF_INPUT_AND_OUTPUT_ERROR قد تم تعيين snp_cmd_buf_enforcement لها على true. وإلا فإن إعادة كتابة مخرجات الأمر قد تسبب تلفًا في الذاكرة داخل المنطقة المغطاة بـ RMP. snp_cmd_buf_enforcement يكون true لجميع هذه الأوامر باستثناء واحد - SEV_MCMD_ID_ATTESTATION: هذا الأمر لديه cmd_buf_type مضبوطًا على CMD_BUF_INPUT_AND_OUTPUT_ERROR، ولكن أيضًا لديه snp_cmd_buf_enforcement مضبوطًا على false. ونتيجة لذلك، من الممكن تنفيذ SEV_MCMD_ID_ATTESTATION مع مخزن مؤقت للأوامر يشير إلى ذاكرة مغطاة بـ RMP، وتتلف هذه الذاكرة بمجرد كتابة المخرجات مرة أخرى.
لا أرى لماذا يحتاج SEV_MCMD_ID_ATTESTATION أن يكون استثناءً، يبدو لي معقولاً أن هذا قد يكون خطأ مطبعي/نسخ-لصق.
يكتب SEV_MCMD_ID_ATTESTATION فقط في حقل واحد length (4 بايت) في المخزن المؤقت للأوامر، وبالتالي فهذه هي البايتات الوحيدة التي يمكننا استخدامها لتلف الذاكرة. يكتب SEV_MCMD_ID_ATTESTATION نفس القيمة دائمًا - 0x000000d0. لحسن الحظ، لا توجد متطلبات محاذاة للمخزن المؤقت للأوامر، وبالتالي يمكننا إزاحة المخزن المؤقت للأوامر بشكل متكرر لتلف نطاق أكبر من الذاكرة المتجاورة. سنستخدم هذا لتلف أول 16 بايت من صفحة سياق الضيف بنمط ثابت. تحتوي أول 16 بايت على بذرة مفتاح UMC، وبالتالي بإجبارها على قيمة ثابتة، يمكننا إجبار مفتاح تشفير الضيف على قيمة ثابتة.
الاستغلال المقدم هنا يعتمد بشكل كبير على الاستغلال الذي قدمته لـ SWPSIRT-2684/CVE-2023-31355.
لاستغلال الثغرة، يمكننا تنفيذ الخطوات التالية:
SEV_MCMD_ID_ATTESTATION. احتفظ بهذا الضيف قيد التشغيل.0x2000 للضيف الضحية. أي عنوان آخر في المنطقة المغطاة بـ RMP سيفي بالغرض، على الرغم من أن عنوانًا ثابتًا مفيد لتصحيح الأخطاء.0x2000 للضيف المهاجم. يجب أن يكون هذا نفس العنوان المستخدم في الخطوة 1.SNP_DBG_ENCRYPT لفك تشفير ذاكرة الضيف الضحية باستخدام صفحة سياق الضيف المهاجم. سينجح ذلك لأن الضيف الضحية والضيف المهاجم يتشاركان بذرة مفتاح UMC.يجب أن يكون التأثير هنا على الأقل نفس تأثير SWPSIRT-2684. غير واضح لي في هذا الوقت ما إذا كان يمكن استخدام هذا الخلل لفك تشفير ذاكرة ضيف قيد التشغيل قبل إلغاء تكليفه.
يجب تعيين snp_cmd_buf_enforcement إلى true لـ SEV_MCMD_ID_ATTESTATION.
من المثير للاهتمام أن تصحيحات دعم مضيف Linux KVM لا تحتاج إلى تحديثات لأنها تدرج بالفعل SEV_CMD_ATTESTATION_REPORT في sev_cmd_buf_writable كأمر يتطلب أن يكون المخزن المؤقت للأوامر في حالة FIRMWARE. قد تكون هناك حاجة لتغييرات أو لا قد تكون لمشغلات الافتراضية الأخرى.