मेमोरी की गड़बड़ी को डीबग करना और उसे कम करना

Android में, मेमोरी से जुड़ी गड़बड़ियों को डीबग करने के लिए कई टूल उपलब्ध हैं. इन दोनों के अपने-अपने फ़ायदे और नुकसान हैं. इसलिए, नीचे दी गई जानकारी पढ़ें और तय करें कि आपके इस्तेमाल के उदाहरण के लिए कौनसा विकल्प सबसे सही है. इस दस्तावेज़ में, उपलब्ध टूल के बारे में खास जानकारी दी गई है. इससे आपको यह तय करने में मदद मिलेगी कि आपको किस टूल के बारे में ज़्यादा जानना है. हालांकि, इसमें कम शब्दों में जानकारी दी गई है. इसलिए, ज़्यादा जानकारी के लिए टूल से जुड़े दस्तावेज़ पढ़ें.

tl;dr

  • संभव होने पर, मेमोरी सेफ़ लैंग्वेज का इस्तेमाल करें, ताकि मेमोरी से जुड़ी गड़बड़ियां न हों
  • ROP/JOP हमलों को कम करने के लिए, हमेशा PAC/BTI का इस्तेमाल करें
  • प्रोडक्शन में, मेमोरी से जुड़ी कभी-कभी होने वाली गड़बड़ियों का पता लगाने के लिए, हमेशा GWP-ASan का इस्तेमाल करें
  • टेस्टिंग के दौरान मेमोरी की गड़बड़ियों का पता लगाने के लिए, HWASan का इस्तेमाल करें
  • एमटीई की सुविधा, चुनिंदा डिवाइसों पर उपलब्ध है.
  • टेस्टिंग के दौरान, ASan का इस्तेमाल सिर्फ़ आखिरी विकल्प के तौर पर करें

मेमोरी सेफ़ भाषाएँ

मेमोरी से जुड़ी गड़बड़ियों को पूरी तरह से रोकने और कम करने के लिए, मेमोरी सेफ़ लैंग्वेज का इस्तेमाल करना ज़रूरी है. इस पेज पर मौजूद अन्य टूल, मेमोरी की सुरक्षा से जुड़ी गड़बड़ियों वाले कोड को ज़्यादा सुरक्षित और भरोसेमंद बनाने में आपकी मदद कर सकते हैं. हालांकि, मेमोरी की सुरक्षा से जुड़ी गड़बड़ियों को ठीक करने वाली भाषा का इस्तेमाल करने से, इस तरह की सभी समस्याएं खत्म हो जाती हैं.

Android के लिए, मेमोरी सेफ़्टी की सुविधा के साथ काम करने वाली आधिकारिक तौर पर उपलब्ध भाषाएं Java और Kotlin हैं. ज़्यादातर Android ऐप्लिकेशन, इनमें से किसी एक भाषा में आसानी से बनाए जा सकते हैं.

हालांकि, ऐसे ऐप्लिकेशन डेवलपर भी हैं जो Rust में लिखे गए कोड को शिप करते हैं. अगर आप इस पेज को पढ़ रहे हैं, तो शायद आपके पास नेटिव कोड (पोर्टेबिलिटी, परफ़ॉर्मेंस या दोनों) की ज़रूरत होने की कोई वजह है. Android पर मेमोरी सेफ़ नेटिव कोड के लिए, Rust सबसे अच्छा विकल्प है. अगर आपने यह तरीका अपनाया है, तो ज़रूरी नहीं कि NDK टीम आपकी समस्याओं को हल करने में आपकी मदद कर पाए. हालांकि, हमें इनके बारे में जानने में दिलचस्पी है!

पीएसी/बीटीआई

पॉइंटर ऑथेंटिकेशन और ब्रांच टारगेट आइडेंटिफ़िकेशन, जिसे पीएसी/बीटीआई भी कहा जाता है, ऐसे शमन टूल हैं जिनका इस्तेमाल प्रोडक्शन में किया जा सकता है. ये अलग-अलग टेक्नोलॉजी हैं, लेकिन इन्हें एक ही कंपाइलर फ़्लैग से कंट्रोल किया जाता है. इसलिए, इनका इस्तेमाल हमेशा एक साथ किया जाता है.

ये सुविधाएं, उन डिवाइसों के साथ काम करती हैं जिन पर ये सुविधाएं काम नहीं करती हैं. ऐसा इसलिए, क्योंकि इस्तेमाल किए गए नए निर्देश, पुराने डिवाइसों पर काम नहीं करते हैं. इसके लिए, नए कर्नल और ओएस के नए वर्शन का होना भी ज़रूरी है. /proc/cpuinfo में paca और bti को देखने से पता चलता है कि आपके पास नया हार्डवेयर और नया कर्नल है या नहीं. Android 12 (एपीआई 31) में, यूज़रस्पेस से जुड़ी ज़रूरी सुविधाएं उपलब्ध हैं.

फ़ायदे:

  • इसे सभी बिल्ड में चालू किया जा सकता है. इससे पुराने डिवाइसों या कर्नल पर कोई समस्या नहीं आएगी. हालांकि, पक्का करें कि आपने उस डिवाइस/कर्नल/ओएस कॉम्बिनेशन पर इसकी जाँच कर ली हो जो इसे सपोर्ट करता है!

नुकसान:

  • यह सुविधा सिर्फ़ 64-बिट वाले ऐप्लिकेशन के लिए उपलब्ध है
  • यह सुविधा, उन डिवाइसों पर होने वाली गड़बड़ियों को ठीक नहीं करती जिन पर यह काम नहीं करती
  • कोड के साइज़ में 1% का ओवरहेड

GWP-Asan

GWP-ASan का इस्तेमाल, फ़ील्ड में मेमोरी से जुड़ी गड़बड़ियों का पता लगाने के लिए किया जा सकता है. हालांकि, सैंपलिंग रेट बहुत कम होने की वजह से, यह गड़बड़ियों को कम करने में ज़्यादा असरदार नहीं होता.

फ़ायदे:

  • सीपीयू या मेमोरी पर कोई खास असर नहीं पड़ता
  • इसे आसानी से डिप्लॉय किया जा सकता है: इसके लिए, नेटिव कोड को फिर से बनाने की ज़रूरत नहीं होती
  • 32-बिट ऐप्लिकेशन के साथ काम करता है

नुकसान:

  • सैंपलिंग रेट कम होने पर, गड़बड़ियों का पता लगाने के लिए ज़्यादा उपयोगकर्ताओं की ज़रूरत होती है
  • सिर्फ़ हीप मेमोरी से जुड़ी गड़बड़ियों का पता लगाता है, स्टैक मेमोरी से जुड़ी गड़बड़ियों का नहीं

HWASan

हार्डवेयर एड्रेस सैनिटाइज़र को HWASan भी कहा जाता है. यह टेस्टिंग के दौरान, मेमोरी की गड़बड़ियों का पता लगाने के लिए सबसे सही टूल है. यह सुविधा, ऑटोमेटेड टेस्टिंग के साथ इस्तेमाल करने पर सबसे ज़्यादा फ़ायदेमंद होती है. खास तौर पर, अगर फ़ज़ टेस्ट किए जा रहे हों. हालांकि, आपके ऐप्लिकेशन की परफ़ॉर्मेंस की ज़रूरतों के आधार पर, इसे डॉगफ़ूड सेटिंग में हाई-एंड फ़ोन पर भी इस्तेमाल किया जा सकता है.

फ़ायदे:

  • कोई फ़ॉल्स पॉज़िटिव नहीं
  • यह गड़बड़ियों की ऐसी अन्य क्लास का पता लगाता है जिनका पता ASan नहीं लगा सकता (स्टैक का इस्तेमाल, रिटर्न के बाद)
  • एमटीई की तुलना में फ़ॉल्स निगेटिव की दर कम है (256 में से 1 बनाम 16 में से 1)
  • ASan की तुलना में, मेमोरी का इस्तेमाल कम करता है. ASan, इसका सबसे करीबी विकल्प है

नुकसान:

  • सीपीयू (~100%), कोड साइज़ (~50%), और मेमोरी (10% - 35%) पर काफ़ी असर पड़ता है
  • एपीआई 34 और NDK r26 तक, HWASan के साथ काम करने वाली इमेज को फ़्लैश करना ज़रूरी है
  • यह सुविधा सिर्फ़ 64-बिट वाले ऐप्लिकेशन पर काम करती है

MTE

Memory Tagging Extension को MTE भी कहा जाता है. यह HWASan का कम लागत वाला विकल्प है. डीबग करने और टेस्टिंग की सुविधाओं के अलावा, इसका इस्तेमाल प्रोडक्शन में मेमोरी करप्शन का पता लगाने और उसे कम करने के लिए किया जा सकता है. अगर आपके पास एमटीई बिल्ड की जांच करने के लिए हार्डवेयर है, तो आपको इसे चालू करना चाहिए.

फ़ायदे:

  • इतना कम ओवरहेड कि कई ऐप्लिकेशन के प्रोडक्शन में इसे इस्तेमाल किया जा सके
  • कोई फ़ॉल्स पॉज़िटिव नहीं
  • ढेर से जुड़ी गड़बड़ियों का पता लगाने के लिए, कोड को फिर से बनाने की ज़रूरत नहीं होती. हालांकि, स्टैक से जुड़ी गड़बड़ियों का पता लगाने के लिए ऐसा करना पड़ता है

नुकसान:

  • साल 2024 में, व्यावसायिक तौर पर उपलब्ध किसी भी डिवाइस में MTE की सुविधा डिफ़ॉल्ट रूप से चालू नहीं होती. हालांकि, Arm के दस्तावेज़ में Pixel 8/Pixel 8 Pro पर टेस्टिंग के लिए MTE की सुविधा चालू करने का तरीका बताया गया है.
  • HWASan के 1/256 की तुलना में, 1/16 का फ़ॉल्स नेगेटिव रेट
  • यह सुविधा सिर्फ़ 64-बिट वाले ऐप्लिकेशन के लिए उपलब्ध है
  • एमटीई की सुविधा वाले और एमटीई की सुविधा के बिना काम करने वाले डिवाइसों को टारगेट करने के लिए, अलग-अलग लाइब्रेरी बनाने की ज़रूरत होती है

ASan

Address sanitizer को ASan के नाम से भी जाना जाता है. यह उपलब्ध टूल में से सबसे पुराना और सबसे ज़्यादा इस्तेमाल किया जाने वाला टूल है. यह टूल, टेस्टिंग के दौरान मेमोरी से जुड़ी गड़बड़ियों का पता लगाने में मददगार होता है. साथ ही, यह उन समस्याओं को डीबग करने में भी मदद करता है जो सिर्फ़ पुराने डिवाइसों पर होती हैं. इन डिवाइसों पर, कोई दूसरा टूल उपलब्ध नहीं होता. जब भी हो सके, HWASan का इस्तेमाल करें.

फ़ायदे:

  • ज़्यादातर देशों/इलाकों में उपलब्ध है. KitKat वर्शन वाले डिवाइसों पर भी काम कर सकता है
  • सही तरीके से इस्तेमाल करने पर, फ़ॉल्स पॉज़िटिव या नेगेटिव नहीं मिलते

नुकसान:

  • इसे सही तरीके से बनाना और पैकेज करना मुश्किल है
  • सभी विकल्पों में सबसे ज़्यादा ओवरहेड: ~100% सीपीयू, ~50% कोड साइज़, ~100% मेमोरी का इस्तेमाल
  • अब काम नहीं करता
  • इसमें ऐसी समस्याएं हैं जिन्हें ठीक नहीं किया जाएगा