Memory Tagging Extension (MTE)
Last updated
Last updated
AWS हैकिंग सीखें और प्रैक्टिस करें:HackTricks प्रशिक्षण AWS रेड टीम एक्सपर्ट (ARTE) GCP हैकिंग सीखें और प्रैक्टिस करें: HackTricks प्रशिक्षण GCP रेड टीम एक्सपर्ट (GRTE)
मेमोरी टैगिंग एक्सटेंशन (MTE) यह सॉफ़्टवेयर स्थिरता और सुरक्षा को बढ़ाने के लिए डिज़ाइन किया गया है जो मेमोरी संबंधित त्रुटियों की पहचान और रोकथाम करता है, जैसे कि बफर ओवरफ्लो और यूज-अफ्टर-फ्री सुरक्षासंबंधी विकल्प। MTE, ARM आर्किटेक्चर का हिस्सा होने के नाते, प्रत्येक मेमोरी आवंटन के लिए एक छोटे टैग को संलग्न करने और उस मेमोरी को संदर्भित करने वाले प्रत्येक पॉइंटर के लिए एक संबंधित टैग प्रदान करने की एक युक्ति प्रदान करता है। यह दृष्टिकोण अवैध मेमोरी पहुंच की पहचान की अनुमति देता है, जो इस प्रकार की विकल्पों को किसी भी अर्बिट्रे कोड को निष्पादित करने के लिए उत्पादित करने के जोखिम को कम करता है।
MTE द्वारा मेमोरी को छोटे, निर्धारित आकार के ब्लॉक में विभाजित किया जाता है, जिसमें प्रत्येक ब्लॉक को एक टैग सौंपा जाता है, आम तौर पर कुछ बिट का आकार।
जब एक पॉइंटर उस मेमोरी को संदर्भित करने के लिए बनाया जाता है, तो उसे वही टैग मिलता है। यह टैग मेमोरी पॉइंटर के अनउपयोगित बिट्स में संग्रहीत होता है, प्रभावी रूप से पॉइंटर को उसके संबंधित मेमोरी ब्लॉक से जोड़ता है।
जब एक प्रोग्राम एक पॉइंटर के माध्यम से मेमोरी तक पहुंचता है, तो MTE हार्डवेयर यह जांचता है कि पॉइंटर का टैग मेमोरी ब्लॉक के टैग से मेल खाता है। यदि टैग मेल नहीं खाते हैं, तो यह एक अवैध मेमोरी पहुंच की सूचना देता है।
पॉइंटर के भीतर टैग 4 बिट में शीर्ष बाइट के अंदर संग्रहीत होते हैं:
इसलिए, इससे 16 विभिन्न टैग मान तक की अनुमति होती है।
प्रत्येक 16B फिजिकल मेमोरी के लिए एक संबंधित मेमोरी टैग होता है।
मेमोरी टैग एक विशेषित रैम क्षेत्र में संग्रहीत होते हैं (सामान्य उपयोग के लिए पहुंच नहीं होती)। प्रत्येक 16B मेमोरी टैग के लिए 4 बिट टैग तक रैम का 3%।
ARM इन निर्देशों को पेश करता है जो इन टैगों को विशेषित रैम मेमोरी में संचालित करने के लिए:
CPU निर्देश को क्रियान्वित करते समय टैग की जाँच करता है, अगर मिलान नहीं है, तो यह एक अपवाद उठाता है। यह सबसे धीमा और सबसे सुरक्षित है।
CPU टैग की जाँच असिंक्रोनस रूप से करता है, और जब एक मिलान खोजा जाता है तो यह एक अपवाद बिट सेट करता है एक सिस्टम रजिस्टर में। यह पिछले से तेज है लेकिन यह स्पष्ट नहीं कर सकता कि वास्तविक निर्देश किसके कारण मिलान को उत्पन्न करता है और यह तुरंत अपवाद उठाता नहीं है, हमलावर को अपना हमला पूरा करने के लिए कुछ समय देता है।
???
हार्डवेयर टैग-आधारित KASAN, MTE-आधारित KASAN या इन-कर्नेल MTE के रूप में कहा जाता है।
कर्नेल आवंटक (जैसे kmalloc
) इस मॉड्यूल को बुलाएगा जो उपयोग के लिए टैग तैयार करेगा (यादृच्छिक रूप से) और इसे कर्नेल स्पेस आवंटित करने और लौटाए गए पॉइंटर पर जोड़ने के लिए तैग तैयार करेगा।
ध्यान दें कि यह केवल पर्याप्त स्मृति ग्रेन्यूल (प्रत्येक 16B) को चिह्नित करेगा जितना अनुरोधित आकार था। इसलिए यदि अनुरोधित आकार 35 था और 60B का एक स्लैब दिया गया था, तो यह पहले 16*3 = 48B को इस टैग के साथ चिह्नित करेगा और शेष को एक ऐसे कहलाते हैं अमान्य टैग (0xE) के साथ चिह्नित करेगा।
टैग 0xF है सभी पॉइंटर का मिलान। इस पॉइंटर के साथ किसी भी टैग का उपयोग करने की अनुमति देता है इसकी स्मृति (कोई मिलान नहीं)। यदि इस टैग का उपयोग हो रहा है तो यह हमला डिटेक्ट करने से रोक सकता है।
इसलिए केवल 14 मूल्य हैं जो टैग उत्पन्न करने के लिए उपयोग किए जा सकते हैं क्योंकि 0xE और 0xF आरक्षित हैं, जिससे टैग को फिर से उपयोग करने की संभावना 1/17 -> लगभग 7% है।
यदि कर्नेल अमान्य टैग ग्रेन्यूल तक पहुंचता है, तो मिलान को डिटेक्ट किया जाएगा। यदि यह किसी अन्य स्मृति स्थान तक पहुंचता है, यदि स्मृति में एक विभिन्न टैग (या अमान्य टैग) है तो मिलान को डिटेक्ट किया जाएगा। यदि हमलावर को भाग्यशाली है और स्मृति में एक ही टैग का उपयोग हो रहा है, तो यह डिटेक्ट नहीं होगा। अवसर लगभग 7% हैं।
एक और बग उस स्मृति के अंतिम ग्रेन्यूल में होता है जो आवंटित स्मृति का है। यदि एप्लिकेशन ने 35B का अनुरोध किया था, तो 32 से 48 तक का ग्रेन्यूल दिया गया था। इसलिए, 36 से 47 तक के बाइट्स एक ही टैग का उपयोग कर रहे हैं लेकिन उन्हें अनुरोध नहीं किया गया था। यदि हमलावर इन अतिरिक्त बाइट्स तक पहुंचता है, तो यह डिटेक्ट नहीं होगा।
जब kfree()
क्रियान्वित होता है, तो स्मृति को अमान्य स्मृति टैग के साथ फिर से टैग किया जाता है, इसलिए एक उपयोग-के-बाद-मुक्ति में, जब स्मृति को फिर से उपयोग किया जाता है, तो मिलान डिटेक्ट किया जाता है।
हालांकि, एक उपयोग-के-बाद-मुक्ति में, यदि वही चंक पुनः उपयोग किया जाता है जो पहले से है और उसी टैग के साथ, तो एक हमलावर इस उपयोग का उपयोग कर सकेगा और यह डिटेक्ट नहीं होगा (लगभग 7% की संभावना)।
इसके अतिरिक्त, केवल slab
और page_alloc
टैग की स्मृति का उपयोग करते हैं लेकिन भविष्य में इसका उपयोग vmalloc
, stack
और globals
में भी किया जाएगा (वीडियो के समय ये अभी भी दुरुपयोग किए जा सकते हैं)।
जब एक मिलान डिटेक्ट किया जाता है, तो कर्नेल पैनिक करेगा ताकि आगे की शोषण और उपयोग के पुनः प्रयासों से बचा जा सके (MTE में कोई गलत सकारात्मक नहीं है)।