देखें HWASan को समझना रिपोर्ट देखें!
हार्डवेयर से मदद पाने वाला AddressSanitizer (HWASan) एक मेमोरी की गड़बड़ी है इसी तरह का कोई अन्य टूल AddressSanitizer. एचडब्ल्यूएएसएन ASan की तुलना में, बहुत कम रैम का इस्तेमाल करता है. इसलिए, यह उसे सैनिटाइज़ करने में मदद मिलती है. HWASan सिर्फ़ Android 10 और उसके बाद के वर्शन पर उपलब्ध है. साथ ही, यह सिर्फ़ AArch64 हार्डवेयर पर काम करता है.
हालांकि, HWASan मुख्य तौर पर C/C++ कोड के लिए फ़ायदेमंद है, लेकिन यह Java कोड को डीबग करने में भी मदद करता है. C/C++ में होने वाले क्रैश का इस्तेमाल Java इंटरफ़ेस को लागू करने में होता है. यह मददगार है, क्योंकि यह मेमोरी को कैप्चर करता है गड़बड़ियां होने पर, आपको सीधे तौर पर ज़िम्मेदार कोड की ओर इशारा करना चाहिए.
ci.android.com से, पहले से बने HWASan इमेज को उन Pixel डिवाइसों पर फ़्लैश किया जा सकता है जिन पर यह सुविधा काम करती है (सेटअप के बारे में ज़्यादा जानकारी).
क्लासिक ASan की तुलना में, HWASan में ये सुविधाएं हैं:
- सीपीयू का ओवरहेड मिलता-जुलता है (~2x)
- मिलते-जुलते कोड साइज़ का ओवरहेड (40 – 50%)
- बहुत कम रैम ओवरहेड (10% – 35%)
HWASan, गड़बड़ी के उन सेट का पता लगाता है जो ASan के जैसे हैं:
- स्टैक और हेप बफ़र ओवरफ़्लो/अंडरफ़्लो
- मुफ़्त के बाद हीप का इस्तेमाल
- स्टैक का बाहरी दायरा इस्तेमाल करें
- डबल फ़्री/वाइल्ड फ़्री
इसके अलावा, HWASan, आइटम लौटाने के बाद स्टैक के इस्तेमाल का पता लगाता है.
HWASan (ASan की तरह) पर, इसका इस्तेमाल किया जा सकता है UBSan, दोनों को एक साथ टारगेट में चालू किया जा सकता है.
लागू करने से जुड़ी जानकारी और सीमाएं
HWASan मेमोरी टैगिंग का तरीका इस्तेमाल करना, जिसमें छोटी रैंडम टैग वैल्यू जुड़ी हो दोनों पॉइंटर और मेमोरी पतों की रेंज के साथ सेट किए जा सकते हैं. मेमोरी ऐक्सेस मान्य हो, इसके लिए पॉइंटर और मेमोरी टैग मैच होने चाहिए. HWASan, पॉइंटर टैग को पते के सबसे ऊपर वाले बिट में सेव करने के लिए, ARMv8 की सुविधा टॉप बाइट इग्नोर (टीबीआई) पर निर्भर करता है. इसे वर्चुअल पता टैग करना भी कहा जाता है.
यहाँ पर, यह डिज़ाइन का 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 कर्नेल, सिस्टम कॉल के आर्ग्युमेंट में टैग किए गए पॉइंटर स्वीकार करे. इसके लिए, अपस्ट्रीम पैचसेट में यह सुविधा लागू की गई थी:
- arm64 टैग किया गया पता ABI
- arm64: कर्नेल को पास किए गए, उपयोगकर्ता पॉइंटर से टैग हटाएं
- mm: brk()/mmap()/mremap() में वर्चुअल पता उपनाम बनाने से बचें
- arm64: kernel थ्रेड से कॉल किए गए access_ok() में, टैग किए गए पतों की पुष्टि करना
अगर कस्टम टूलचैन का इस्तेमाल करके बिल्ड किया जा रहा है, तो पक्का करें कि इसमें LLVM के 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
को भी
साफ़ किया गया हो. bionic/libc/Android.bp में, "libc_defaults"
के hwaddress: true
में मौजूद sanitize ब्लॉक में hwaddress: true
जोड़ें. इसके बाद, उस टारगेट में भी ऐसा ही करें जिस पर काम किया जा रहा है.
ध्यान दें कि libc को सैनिटाइज़ करने से, पूरे सिस्टम में हीप मेमोरी ऐलोकेशन को टैग करने में मदद मिलती है. साथ ही,
libc.so
में मेमोरी से जुड़ी कार्रवाइयों के लिए टैग की जांच. यह बाइनरी में भी बग पकड़ सकता है
अगर libc.so
में खराब मेमोरी ऐक्सेस है, तो उस HWASan को चालू नहीं किया गया था
(जैसे, pthread_mutex_unlock()
पर delete()
किया गया म्यूटेक्स).
अगर पूरे प्लैटफ़ॉर्म को HWASan का इस्तेमाल करके बनाया गया है, तो किसी भी बिल्ड फ़ाइल को बदलने की ज़रूरत नहीं है.
Flashstation
डेवलपमेंट के लिए, एओएसपी के 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
को जोड़ना ज़रूरी है.
ज़्यादा जानकारी के लिए,
ऐप्लिकेशन डेवलपर के लिए दस्तावेज़
देखें.