एचडब्ल्यूएड्रेस सैनिटाइजर

HWASan क्रैश को पढ़ने के तरीके के बारे में जानकारी के लिए HWASan रिपोर्ट को समझना देखें!

हार्डवेयर-असिस्टेड एड्रेस सेनिटाइज़र (HWASan) एड्रेस सेनिटाइज़र के समान एक मेमोरी एरर डिटेक्शन टूल है। ASan की तुलना में HWASan बहुत कम RAM का उपयोग करता है, जो इसे संपूर्ण सिस्टम सैनिटाइजेशन के लिए उपयुक्त बनाता है। HWASan केवल Android 10 और उच्चतर पर और केवल AArch64 हार्डवेयर पर उपलब्ध है।

हालांकि मुख्य रूप से C/C++ कोड के लिए उपयोगी, HWASan जावा कोड को डीबग करने में भी मदद कर सकता है जो जावा इंटरफेस को लागू करने के लिए उपयोग किए जाने वाले C/C++ में क्रैश का कारण बनता है। यह उपयोगी है क्योंकि यह स्मृति त्रुटियों को पकड़ता है जब वे होते हैं, और आपको सीधे जिम्मेदार कोड पर इंगित करते हैं।

आप ci.android.com ( विस्तृत सेटअप निर्देश ) से समर्थित पिक्सेल उपकरणों पर पूर्वनिर्मित HWASan छवियों को फ्लैश कर सकते हैं।

क्लासिक ASan की तुलना में, HWASan में है:

  • समान सीपीयू ओवरहेड (~2x)
  • समान कोड आकार ओवरहेड (40 - 50%)
  • बहुत छोटी रैम ओवरहेड (10% - 35%)

HWASan, ASan की तरह ही बग के सेट का पता लगाता है:

  • स्टैक और हीप बफ़र ओवरफ़्लो/अंडरफ़्लो
  • मुफ़्त के बाद ढेर का उपयोग करें
  • दायरे के बाहर स्टैक का उपयोग
  • डबल फ्री/वाइल्ड फ्री

इसके अतिरिक्त, HWASan वापसी के बाद स्टैक उपयोग का पता लगाता है।

HWASan (ASan के समान) UBSan के साथ संगत है, दोनों को एक ही समय में एक लक्ष्य पर सक्षम किया जा सकता है।

कार्यान्वयन विवरण और सीमाएँ

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

आप क्लैंग दस्तावेज़ीकरण साइट पर HWASan के डिज़ाइन के बारे में अधिक पढ़ सकते हैं।

डिज़ाइन के अनुसार, HWASan के पास ओवरफ्लो का पता लगाने के लिए ASan के सीमित आकार के रेडज़ोन या मुफ़्त के बाद उपयोग का पता लगाने के लिए ASan की सीमित क्षमता वाला संगरोध नहीं है। इस कारण से, HWASan बग का पता लगा सकता है, चाहे ओवरफ़्लो कितना भी बड़ा हो या मेमोरी कितने समय पहले हटा दी गई हो। इससे HWASan को ASan की तुलना में बड़ा लाभ मिलता है।

हालाँकि, HWASan में संभावित टैग मानों की सीमित संख्या (256) है, जिसका अर्थ है कि प्रोग्राम के एक निष्पादन के दौरान किसी भी बग के गायब होने की 0.4% संभावना है।

आवश्यकताएं

सामान्य एंड्रॉइड कर्नेल के हाल के संस्करण (4.14+) HWASan को आउट-ऑफ़-द-बॉक्स समर्थन करते हैं। Android 10 की विशिष्ट शाखाओं में HWASan के लिए समर्थन नहीं है।

HWASan के लिए यूजरस्पेस समर्थन एंड्रॉइड 11 से उपलब्ध है।

यदि आप किसी भिन्न कर्नेल के साथ काम कर रहे हैं, तो HWASan को सिस्टम कॉल तर्कों में टैग किए गए पॉइंटर्स को स्वीकार करने के लिए लिनक्स कर्नेल की आवश्यकता होती है। इसके लिए समर्थन निम्नलिखित अपस्ट्रीम पैचसेट में लागू किया गया था:

यदि आप एक कस्टम टूलचेन के साथ निर्माण कर रहे हैं, तो सुनिश्चित करें कि इसमें एलएलवीएम कमिट c336557f तक सब कुछ शामिल है।

HWASan का उपयोग करना

HWASan का उपयोग करके संपूर्ण प्लेटफ़ॉर्म बनाने के लिए निम्नलिखित कमांड का उपयोग करें:

lunch aosp_walleye-userdebug # (or any other product)
export SANITIZE_TARGET=hwaddress
m -j

सुविधा के लिए, आप aosp_coral_hwasan के समान उत्पाद परिभाषा में SANITIZE_TARGET सेटिंग जोड़ सकते हैं।

एड्रेससेनिटाइज़र से परिचित उपयोगकर्ताओं के लिए, निर्माण की बहुत सारी जटिलताएँ दूर हो गई हैं:

  • मेक को दो बार चलाने की आवश्यकता नहीं है।
  • वृद्धिशील बिल्ड लीक से हटकर काम करते हैं।
  • उपयोगकर्ता डेटा फ़्लैश करने की कोई आवश्यकता नहीं है.

कुछ एड्रेस सेनिटाइज़र प्रतिबंध भी समाप्त हो गए हैं:

  • स्थैतिक निष्पादनयोग्य समर्थित हैं.
  • libc के अलावा किसी अन्य लक्ष्य का स्वच्छताकरण छोड़ना ठीक है। एएसएन के विपरीत, इसकी कोई आवश्यकता नहीं है कि यदि लाइब्रेरी को साफ किया जाता है, तो इसे लिंक करने वाला कोई भी निष्पादन योग्य भी होना चाहिए।

समान (या उच्चतर) बिल्ड नंबर पर HWASan और नियमित छवियों के बीच स्विच करना स्वतंत्र रूप से किया जा सकता है। डिवाइस को पोंछना आवश्यक नहीं है.

किसी मॉड्यूल के सैनिटाइजेशन को छोड़ने के लिए, LOCAL_NOSANITIZE := hwaddress (Android.mk) या sanitize: { hwaddress: false } (Android.bp) का उपयोग करें।

व्यक्तिगत लक्ष्यों को सेनिटाइज़ करना

HWASan को नियमित (अस्वच्छ) निर्माण में प्रति-लक्ष्य सक्षम किया जा सकता है, जब तक कि libc.so भी स्वच्छ कर दिया जाता है। बायोनिक/libc/Android.bp में "libc_defaults" में सैनिटाइज़ ब्लॉक में hwaddress: true जोड़ें। फिर जिस लक्ष्य पर आप काम कर रहे हैं, वैसा ही करें।

ध्यान दें कि libc को सैनिटाइज़ करने से पूरे सिस्टम में ढेर मेमोरी आवंटन की टैगिंग सक्षम हो जाती है, साथ ही libc.so के अंदर मेमोरी संचालन के लिए टैग की जाँच भी हो जाती है। यह उन बायनेरिज़ में भी बग पकड़ सकता है जिन पर HWASan सक्षम नहीं था यदि खराब मेमोरी एक्सेस libc.so में है (उदाहरण के लिए delete() ) एड म्यूटेक्स पर pthread_mutex_unlock() ())।

यदि संपूर्ण प्लेटफ़ॉर्म HWASan का उपयोग करके बनाया गया है तो किसी भी बिल्ड फ़ाइल को बदलना आवश्यक नहीं है।

फ्लैशस्टेशन

विकास उद्देश्यों के लिए, आप फ़्लैशस्टेशन का उपयोग करके अनलॉक किए गए बूटलोडर के साथ एक पिक्सेल डिवाइस पर AOSP के HWASan-सक्षम बिल्ड को फ्लैश कर सकते हैं। _ह्वासन लक्ष्य का चयन करें, उदाहरण के लिए एओएसपी_फ्लेम_ह्वासन-यूजरडीबग। अधिक विवरण के लिए ऐप डेवलपर्स के लिए HWASan के लिए NDK दस्तावेज़ देखें।

बेहतर स्टैक ट्रेस

HWASan प्रोग्राम में प्रत्येक मेमोरी आवंटन और डीलोकेशन इवेंट के लिए स्टैक ट्रेस रिकॉर्ड करने के लिए एक तेज़, फ़्रेम-पॉइंटर-आधारित अनवाइंडर का उपयोग करता है। एंड्रॉइड डिफ़ॉल्ट रूप से AArch64 कोड में फ़्रेम पॉइंटर्स को सक्षम करता है, इसलिए यह व्यवहार में बहुत अच्छा काम करता है। यदि आपको प्रबंधित कोड से आराम पाने की आवश्यकता है, तो प्रक्रिया वातावरण में HWASAN_OPTIONS=fast_unwind_on_malloc=0 सेट करें। ध्यान दें कि खराब मेमोरी एक्सेस स्टैक ट्रेस डिफ़ॉल्ट रूप से "धीमी" अनवाइंडर का उपयोग करते हैं; यह सेटिंग केवल आवंटन और डीलोकेशन ट्रेस को प्रभावित करती है। लोड के आधार पर यह विकल्प बहुत सीपीयू-गहन हो सकता है।

प्रतीकीकरण

"HWASan रिपोर्ट को समझना" में प्रतीकीकरण देखें।

ऐप्स में HWASan

एड्रेससैनिटाइज़र के समान, HWASan जावा कोड में नहीं देख सकता है, लेकिन यह जेएनआई पुस्तकालयों में बग का पता लगा सकता है। Android 14 तक, गैर-HWASan डिवाइस पर HWASan ऐप्स चलाना समर्थित नहीं था।

HWASan डिवाइस पर, ऐप्स को मेक में SANITIZE_TARGET:=hwaddress , या कंपाइलर फ़्लैग में -fsanitize=hwaddress के साथ अपना कोड बनाकर HWASan के साथ चेक किया जा सकता है। गैर-HWASan डिवाइस (एंड्रॉइड 14 या नए पर चलने वाले) पर, एक Rap.sh फ़ाइल सेटिंग LD_HWASAN=1 जोड़नी होगी। अधिक विवरण के लिए ऐप डेवलपर दस्तावेज़ देखें।