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

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.

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

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

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

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

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

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

HWASan आसन के समान बग का पता लगाता है:

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

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

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

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

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

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

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

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

आवश्यकताएं

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

HWASan के लिए यूजरस्पेस सपोर्ट Android 11 से शुरू होकर उपलब्ध है।

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

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

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

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

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

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

AddressSanitizer से परिचित उपयोगकर्ताओं के लिए, बहुत सी बिल्ड जटिलता समाप्त हो गई है:

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

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

  • स्थिर निष्पादन योग्य समर्थित हैं।
  • 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 (उदा. pthread_mutex_unlock() on a delete() ed mutex) में है।

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

फ्लैशस्टेशन

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

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

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

प्रतीकीकरण

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

ऐप्स में HWASan

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

HWASan डिवाइस पर, ऐप्स को HWASan के साथ उनके कोड को SANITIZE_TARGET:=hwaddress in Make, या -fsanitize=hwaddress कंपाइलर फ़्लैग्स में बनाकर चेक किया जा सकता है। अधिक विवरण के लिए ऐप डेवलपर दस्तावेज़ देखें।

,

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

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

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

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

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

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

HWASan आसन के समान बग का पता लगाता है:

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

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

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

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

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

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

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

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

आवश्यकताएं

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

HWASan के लिए यूजरस्पेस सपोर्ट Android 11 से शुरू होकर उपलब्ध है।

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

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

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

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

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

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

AddressSanitizer से परिचित उपयोगकर्ताओं के लिए, बहुत सी बिल्ड जटिलता समाप्त हो गई है:

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

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

  • स्थिर निष्पादन योग्य समर्थित हैं।
  • 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 (उदा. pthread_mutex_unlock() on a delete() ed mutex) में है।

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

फ्लैशस्टेशन

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

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

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

प्रतीकीकरण

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

ऐप्स में HWASan

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

HWASan डिवाइस पर, ऐप्स को HWASan के साथ उनके कोड को SANITIZE_TARGET:=hwaddress in Make, या -fsanitize=hwaddress कंपाइलर फ़्लैग्स में बनाकर चेक किया जा सकता है। अधिक विवरण के लिए ऐप डेवलपर दस्तावेज़ देखें।