हार्डवेयर असिस्टेड अड्रेस सैनिटाइज़र

अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है

देखें HWASan को समझना रिपोर्ट देखें!

हार्डवेयर से सहायता पाने वाला AddressSanitizer (HWASan) एक मेमोरी की गड़बड़ी है इसी तरह का कोई अन्य टूल AddressSanitizer. एचडब्ल्यूएएसएन ASan की तुलना में, बहुत कम रैम का इस्तेमाल करता है. इसलिए, यह उसे सैनिटाइज़ करने में मदद मिलती है. HWASan सिर्फ़ Android 10 पर उपलब्ध है और बाद में उपलब्ध है. साथ ही, इसे सिर्फ़ AArch64 हार्डवेयर पर इस्तेमाल किया जा सकता है.

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

यहां से Pixel डिवाइसों के लिए, पहले से बनी HWASan इमेज को फ़्लैश किया जा सकता है ci.android.com (सेटअप के बारे में ज़्यादा जानकारी देने वाले निर्देश).

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

  • मिलता-जुलता सीपीयू ओवरहेड (~2x)
  • मिलता-जुलता कोड साइज़ ओवरहेड (40 – 50%)
  • बहुत कम रैम ओवरहेड (10% – 35%)

HWASan, गड़बड़ी के उन सेट का पता लगाता है जो ASan के जैसे हैं:

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

इसके अलावा, HWASan, आइटम लौटाने के बाद स्टैक के इस्तेमाल का पता लगाता है.

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

लागू करने से जुड़ी जानकारी और सीमाएं

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

यहाँ पर, यह डिज़ाइन का HWASan Clang दस्तावेज़ की साइट पर.

डिज़ाइन के हिसाब से, HWASan में ओवरफ़्लो या ASan की सीमित क्षमता वाले क्वॉरंटीन का पता लगाना को मुफ़्त में इस्तेमाल करने का पता लगाना. इस वजह से, HWASan गड़बड़ी का पता लगा सकता है इससे कोई फ़र्क़ नहीं पड़ता कि ओवरफ़्लो कितना बड़ा है या मेमोरी कितनी पहले थी डिलीवर नहीं किया गया. इससे HWASan को ASan से काफ़ी फ़ायदा मिलता है.

हालांकि, HWASan में संभावित टैग वैल्यू की सीमित संख्या (256) है, इसका मतलब है कि किसी भी बग के छूटने की संभावना 0.4% है की पुष्टि करने की ज़रूरत नहीं होती.

ज़रूरी शर्तें

हाल के वर्शन (4.14+) सामान्य Android kernel के लिए सहायता HWASan की इमेज, अब सभी के लिए उपलब्ध नहीं है. खास तौर पर, Android 10 की ब्रांच में HWASan की सुविधा नहीं है.

HWASan के लिए Userspace की सुविधा, Android 11 और उसके बाद के वर्शन पर उपलब्ध है.

अगर आप एक अलग कर्नेल के साथ काम कर रहे हैं, तो HWASan को टैग किए गए पॉइंटर को स्वीकार करने के लिए, Linux कर्नेल की ज़रूरत होती है सिस्टम कॉल के तर्क. यह सुविधा, इन अपस्ट्रीम पैचसेट में लागू की गई थी:

अगर कस्टम टूलचेन के साथ बिल्डिंग बनाई जा रही है, तो पक्का करें कि इसमें एलएलवीएम के लिए तय की गई सीमा तक की सारी जानकारी शामिल हो c336557f शामिल है.

HWASan का इस्तेमाल करना

HWASan का इस्तेमाल करके, पूरे प्लैटफ़ॉर्म को तैयार करने के लिए, इन निर्देशों का पालन करें:

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

सुविधा के लिए, आप किसी प्रॉडक्ट परिभाषा में SANITIZE_TARGET सेटिंग जोड़ सकते हैं, इसके समान aosp_coral_hvasan पर जाकर देखें.

AddressSanitizer की मदद से, उपयोगकर्ताओं के लिए बिल्ड की काफ़ी मुश्किलें खत्म हो गई हैं:

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

AddressSanitizer की कुछ पाबंदियां भी हटा दी गई हैं:

  • स्टैटिक एक्ज़ीक्यूटेबल फ़ाइल का इस्तेमाल किया जा सकता है.
  • libc को छोड़कर किसी भी टारगेट के सैनिटाइज़ेशन को छोड़ने में कोई बुराई नहीं है. ASan के अलावा, दुनिया भर में कोई ज़रूरत नहीं है कि अगर लाइब्रेरी साफ़ की गई है, तो वह लिंक करने के लिए कोई एक्ज़ीक्यूटेबल भी होना चाहिए.

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

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

अलग-अलग टारगेट हटाएं

HWASan को सामान्य (बिना सैनिटाइज़) बिल्ड में हर टारगेट के लिए चालू किया जा सकता है, बशर्ते libc.so भी साफ़ किया गया. "libc_defaults" के सैनिटाइज़ ब्लॉक में hwaddress: true जोड़ें बायोनिक/libc/Android.bp में उपलब्ध है. इसके बाद, टारगेट के लिए ऐसा ही करें.

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

अगर पूरे प्लैटफ़ॉर्म को HWASan का इस्तेमाल करके बनाया गया है, तो किसी भी बिल्ड फ़ाइल को बदलने की ज़रूरत नहीं है.

फ़्लैशस्टेशन है

डेवलपमेंट के लिए, एओएसपी के HWASan की सुविधा वाले बिल्ड को Pixel डिवाइस पर फ़्लैश करें जिसमें फ़्लैशस्टेशन का इस्तेमाल करके, अनलॉक बूटलोडर हो. _hvasan टारगेट चुनें, जैसे aosp_flame_hvasan-userdebug. ज़्यादा जानकारी के लिए, HWASan के लिए, NDK दस्तावेज़ देखें.

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

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

प्रतीक

सिंबलेशन देखें "HWASan रिपोर्ट को समझना" में.

ऐप्लिकेशन में HWASan

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

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