टैग किए गए पॉइंटर

Android 11 और इसके बाद के वर्शन में, 64-बिट वाली प्रोसेस के लिए सभी हीप ऐलोकेशन में इन डिवाइस पर पॉइंटर के टॉप बाइट में सेट किया गया लागू करने के लिए तय किया गया टैग ARM टॉप-बाइट अनदेखा करें (TBI) के लिए कर्नेल समर्थन. डेटा में बदलाव करने वाला कोई भी ऐप्लिकेशन डील के स्थान के दौरान टैग की जांच होने पर टैग को खत्म कर दिया जाता है. यह ज़रूरी है हम इसे आने वाले समय के हार्डवेयर के लिए, ARM मेमोरी टैगिंग एक्सटेंशन (एमटीई) के साथ काम करते हैं.

टॉप-बाइट अनदेखा करना

ARM की टॉप-बाइट नज़रअंदाज़ करने की सुविधा सभी Armv8 AArch64 हार्डवेयर में 64-बिट कोड के लिए उपलब्ध है. इस सुविधा का मतलब है कि जब हार्डवेयर, पॉइंटर के टॉप बाइट को अनदेखा कर देता है मेमोरी ऐक्सेस करना.

TBI के लिए इस सुविधा के साथ काम करना ज़रूरी है कर्नेल का इस्तेमाल करता है, जो यूज़रस्पेस से पास किए गए टैग किए गए पॉइंटर को सही ढंग से हैंडल करता है. 4.14 (Pixel 4) और उसके बाद के वर्शन वाले Android Common Kernels में ज़रूरी TBI) पैच.

कर्नेल में TBI समर्थन वाले डिवाइस डायनैमिक रूप से यहां पहचाने जाते हैं प्रोसेस शुरू होने का समय चुनें और सबसे ऊपर, लागू करने पर निर्भर एक टैग डाला गया है सभी हीप ऐलोकेशन के लिए पॉइंटर की बाइट. इसके बाद, यह पक्का करें कि मेमोरी का पता लगाते समय टैग में काट-छांट न की गई हो.

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

ARM के मेमोरी टैगिंग एक्सटेंशन (एमटीई) से मेमोरी की सुरक्षा से जुड़ी समस्याएं हल करने में मदद मिलती है. एमटीई हर मेमोरी के 56वें से 59वें पते के बिट को टैग करके काम करता है स्टैक, हीप, और ग्लोबल में ऐलोकेशन. हार्डवेयर और निर्देशों का सेट यह जांच करता है कि हर मेमोरी ऐक्सेस के लिए सही टैग इस्तेमाल किया जा रहा है या नहीं.

ऐसे Android ऐप्लिकेशन जो ऐप्लिकेशन की सबसे ऊपरी बाइट में जानकारी को गलत तरीके से सेव करते हैं पॉइंटर एमटीई की सुविधा वाले डिवाइस को हैक करने की गारंटी है. टैग किए गए पॉइंटर की मदद से, सबसे ऊपर के गलत इस्तेमाल का पता लगाना और उन्हें अस्वीकार करना आसान हो जाता है MTE डिवाइसों के उपलब्ध होने से पहले, पॉइंटर की बाइट बाइट.

डेवलपर सहायता

अगर आपका ऐप्लिकेशन क्रैश हो जाता है और आपको इस लिंक पर जाने के लिए कहा जाता है, तो इसका यह मतलब हो सकता है इनमें से एक:

  1. ऐप्लिकेशन ने एक ऐसे पॉइंटर को हटाने की कोशिश की जिसे सिस्टम का हीप ऐलोकेटर है.
  2. आपके ऐप्लिकेशन में किसी चीज़ ने पॉइंटर के टॉप बाइट में बदलाव किया है. इसका टॉप बाइट पॉइंटर में बदलाव नहीं किया जा सकता. इसे ठीक करने के लिए, आपको अपने कोड को बदलना होगा समस्या.

टॉप बाइट पॉइंटर का गलत तरीके से इस्तेमाल किए जाने या उसमें बदलाव किए जाने के उदाहरण.

  • किसी खास तरह के पॉइंटर में, ऐप्लिकेशन का खास मेटाडेटा सेव होता है टॉप 16 पता बिट में दिखेगा.
  • निचले पता बिट को खोने के लिए, पॉइंटर को डबल और फिर वापस कास्ट किया जाता है.
  • लोकल वैरिएबल के पतों के बीच अंतर की गणना करने वाला कोड का इस्तेमाल किया जा सकता है.

कुछ ऐप्लिकेशन लाइब्रेरी पर निर्भर हो सकते हैं, जो पॉइंटर का टॉप बाइट सेट है. हम समझते हैं कि यह यह एक सामान्य समस्या है. इसलिए, targetSdkLevel < 30 का इस्तेमाल करने वाले ऐप्लिकेशन पॉइंटर टैगिंग डिफ़ॉल्ट रूप से चालू नहीं होगी. हम एस्केप भी करते हैं targetSdkLevel >= 30 के साथ बनाए गए ऐप्लिकेशन के लिए हैच को कम करने के लिए डिज़ाइन किया गया है.

एस्केप हैच का उपयोग निम्न को अपने AndroidManifest.xml फ़ाइल:

  <application android:allowNativeHeapPointerTagging="false">
  ...
  </application>

इससे पॉइंटर टैग करने की सुविधा बंद हो जाएगी है. यह कोड से जुड़ी समस्या है. यह एस्केप हैच भविष्य में गायब हो जाएगा नहीं है, क्योंकि इस तरह की समस्याएं Android के साथ काम नहीं करेंगी एमटीई.