Memory Tagging Extension (MTE)

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके:

मूल जानकारी

मेमोरी टैगिंग एक्सटेंशन (MTE) को मेमोरी संबंधित त्रुटियों की पहचान और रोकथाम करके सॉफ्टवेयर की विश्वसनीयता और सुरक्षा को बढ़ाने के लिए डिज़ाइन किया गया है, जैसे कि बफर ओवरफ्लो और यूज-अफ्टर-फ्री सुरक्षा खामियों। MTE, ARM आर्किटेक्चर का हिस्सा होते हुए, प्रत्येक मेमोरी आवंटन के लिए एक छोटे टैग को जोड़ने और उस मेमोरी को संदर्भित करने वाले प्रत्येक पॉइंटर को एक संबंधित टैग देने की एक तंत्र प्रदान करता है। यह दृष्टिकोण अवैध मेमोरी पहुंच की पहचान करने की अनुमति देता है, जिससे इस प्रकार की खामियों का उपयोग करके विचारशील कोड को निष्पादित करने का जोखिम कम होता है।

मेमोरी टैगिंग एक्सटेंशन कैसे काम करता है

MTE द्वारा मेमोरी को छोटे, निर्धारित आकार के ब्लॉक में विभाजित किया जाता है, जिसमें प्रत्येक ब्लॉक को एक टैग सौंपा जाता है, जो सामान्यत: कुछ बिट का आकार होता है।

जब एक पॉइंटर उस मेमोरी को संदर्भित करने के लिए बनाया जाता है, तो उसे वही टैग मिलता है। यह टैग मेमोरी पॉइंटर के अवाप्त बिट्स में संग्रहीत होता है, जिससे पॉइंटर को उसके संबंधित मेमोरी ब्लॉक से जोड़ दिया जाता है।

जब एक प्रोग्राम पॉइंटर के माध्यम से मेमोरी तक पहुंचता है, तो MTE हार्डवेयर यह जांचता है कि पॉइंटर का टैग मेमोरी ब्लॉक के टैग से मेल खाता है या नहीं। अगर टैग मेल नहीं खाते हैं, तो यह एक अवैध मेमोरी पहुंच की संकेत देता है।

MTE पॉइंटर टैग

पॉइंटर के भीतर टैग 4 बिट्स में शीर्ष बाइट में संग्रहीत होते हैं:

इसलिए, इससे 16 विभिन्न टैग मान संभव होते हैं।

MTE मेमोरी टैग

प्रत्येक 16B फिजिकल मेमोरी के लिए एक संबंधित मेमोरी टैग होता है।

मेमोरी टैग एक विशेष आरएएम क्षेत्र में संग्रहीत होते हैं (सामान्य उपयोग के लिए अक्षम)। प्रति 16B मेमोरी टैग के लिए 4 बिट्स टैग तकनीक तक 3% तक की आरएम का उपयोग करते हैं।

ARM इन निर्देशों को पेश करता है जो इन टैगों को विशेष आरएएम मेमोरी में संचालित करने के लिए:

STG [<Xn/SP>], #<simm>    Store Allocation (memory) Tag
LDG <Xt>, [<Xn/SP>]       Load Allocatoin (memory) Tag
IRG <Xd/SP>, <Xn/SP>      Insert Random [pointer] Tag
...

जाँचने के मोड

सिंक

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 में कोई गलत सकारात्मक नहीं है)।

संदर्भ

Last updated