
AMD SEV-SNP फ़र्मवेयर भेद्यता (CVE-2023-31355) के लिए एक्सप्लॉइट जो पते शून्य पर एक अप्रारंभीकृत RMP प्रविष्टि लिखकर UMC कुंजी बीज को दूषित करके सेवामुक्त मेहमानों की मनमानी मेमोरी को डिक्रिप्ट करता है।
इस रिपॉज़िटरी में SEV फ़र्मवेयर की एक भेद्यता के लिए शोषण (exploit) मौजूद है। यह शोषण SEV-SNP गेस्ट को डीकमीशन किए जाने के बाद उसकी मनमानी मेमोरी को डिक्रिप्ट करने की अनुमति देता है।
परीक्षण संस्करण 1.55.16 (लेखन के समय नवीनतम) पर किया गया है।
snp_reclaim_buffer बिना शर्त RMP परिवर्तनों को वापस लिखने का प्रयास करता है, भले ही पता RMP द्वारा कवर न किया गया हो। यदि address RMP द्वारा कवर नहीं है, तो RMP एंट्री के लिए पता page_rmp_paddr कभी ठीक से आरंभ (initialize) नहीं होता और अपने प्रारंभिक मान 0 पर ही रहता है। परिणामस्वरूप फ़र्मवेयर RMP एंट्री में हुए परिवर्तनों को पते 0 पर वापस लिखने का प्रयास करता है। यह खराब है क्योंकि पता 0 RMP द्वारा कवर किया जाता है और अतिरिक्त जाँचों के बिना उस पर लिखना नहीं चाहिए। यदि address RMP-आच्छादित क्षेत्र के बाहर है, तो page_rmp_entry कभी ठीक से आरंभ नहीं होता और उसमें स्टैक से कचरा मेमोरी होती है। यह कचरा मेमोरी व्यवहार में स्थिर रहती है।
वास्तव में इसी कोड पैटर्न के बारे में चेतावनी देने वाली एक टिप्पणी है, और इसीलिए मुझे आश्चर्य नहीं होगा अगर इसकी रिपोर्ट करने वाला मैं पहला व्यक्ति नहीं हूँ।
snp_reclaim_buffer को SEV रिंग बफ़र के स्टेटस पेज के पते के साथ कॉल किया जाता है, जब हाइपरवाइज़र रिंग बफ़र मोड से बाहर निकलने का अनुरोध करता है। यह पता हमलावर-नियंत्रित होता है। इस पते के लिए कुछ जाँचें हैं, लेकिन डिफ़ॉल्ट पेज (यानी RMP-आच्छादित क्षेत्र के बाहर के पेज) स्पष्ट रूप से अनुमत हैं।
हम पते 0 पर एक गेस्ट कॉन्टेक्स्ट पेज रखकर इस लेखन का शोषण कर सकते हैं। सुविधाजनक रूप से, गेस्ट कॉन्टेक्स्ट पेज का पहला फ़ील्ड UMC key seed होता है, जिसका आकार RMP एंट्री के समान ही होता है (दोनों 16 बाइट्स के होते हैं)। फ़र्मवेयर को पते 0 पर परिवर्तन वापस लिखने के लिए धोखा देकर हम UMC key seed को दूषित कर सकते हैं। जो अनारंभित RMP एंट्री लिखी जाती है वह हमेशा समान होती है, इसलिए दूषित UMC key seed भी हमेशा लगभग समान होगा: RMP एंट्री में सबपेज काउंट (9 बिट्स) नहीं लिखा जाता, लेकिन अन्य सभी फ़ील्ड लिखे जाते हैं। बार-बार नए गेस्ट कॉन्टेक्स्ट पेज बनाकर—जिनमें हर बार अलग यादृच्छिक प्रारंभिक सबपेज काउंट होता है—हम अंततः समान UMC key seed वाले कई गेस्ट बना सकते हैं।
भेद्यता का शोषण करने के लिए हम निम्नलिखित चरणों का पालन कर सकते हैं:
0 पर एक गेस्ट कॉन्टेक्स्ट पेज बनाएँ।0 पर एक गेस्ट कॉन्टेक्स्ट पेज बनाएँ।SNP_DBG_ENCRYPT कमांड का उपयोग करें। यह सफल होगा क्योंकि पीड़ित गेस्ट और हमलावर गेस्ट एक ही UMC key seed साझा करते हैं।इस तथ्य के कारण कि हम गेस्ट के डीकमीशन के बाद ही मेमोरी डिक्रिप्ट कर सकते हैं, नकली अटेस्टेशन रिपोर्ट बनाना संभव नहीं है, भले ही हमारे पास गेस्ट के रहस्यों तक पहुँच हो। हम नकली अटेस्टेशन रिपोर्ट तभी बना सकते हैं जब गेस्ट को डीकमीशन किए जाने से पहले किसी अन्य होस्ट पर माइग्रेट किया गया हो: इस स्थिति में डीकमीशन किए गए गेस्ट के रहस्य (यानी VMPCKs) नई माइग्रेटेड इंस्टेंस पर भी काम करेंगे।
व्यवहार में, हालाँकि, कई एप्लिकेशन अन्य संवेदनशील जानकारी (यानी निजी कुंजियाँ, डिस्क एन्क्रिप्शन कुंजियाँ) संग्रहीत करते हैं जिन्हें इस शोषण का उपयोग करके लीक किया जा सकता है।
RMP एंट्री को केवल तभी वापस लिखा जाना चाहिए जब पेज डिफ़ॉल्ट स्थिति में न हो।