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 की सुविधा टॉप बाइट इग्नोर (टीबीआई) पर निर्भर करता है. इसे वर्चुअल पता टैग करना भी कहा जाता है.
Clang के दस्तावेज़ों की साइट पर, HWASan के डिज़ाइन के बारे में ज़्यादा पढ़ा जा सकता है.
डिज़ाइन के हिसाब से, HWASan में ASan के सीमित साइज़ वाले रेडज़ोन नहीं होते, ताकि ज़्यादा मेमोरी इस्तेमाल होने का पता लगाया जा सके. इसके अलावा, इसमें 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: kernel को पास किए गए यूज़र पॉइंटर को अनटैग करना
- mm: brk()/mmap()/mremap() में वर्चुअल पता उपनाम बनाने से बचें
- arm64: कर्नेल थ्रेड से ऐक्सेस किए गए 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 के बारे में जानने वाले उपयोगकर्ताओं के लिए, अब बिल्ड करने में ज़्यादा मुश्किल नहीं होती:
- make को दो बार चलाने की ज़रूरत नहीं है.
- इंक्रीमेंटल बिल्ड आसान तरीके से काम करता है.
- उपयोगकर्ता के डेटा को फ़्लैश करने की ज़रूरत नहीं है.
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
डेवलपमेंट के मकसद से, Flashstation का इस्तेमाल करके, Pixel डिवाइस पर AOSP का HWASan की सुविधा वाला बिल्ड फ़्लैश किया जा सकता है. इसके लिए, डिवाइस का बूटलोडर अनलॉक होना ज़रूरी है. _hwasan टारगेट चुनें, जैसे कि aosp_flame_hwasan-userdebug. ज़्यादा जानकारी के लिए, ऐप्लिकेशन डेवलपर के लिए, HWASan के NDK दस्तावेज़ देखें.
बेहतर स्टैक ट्रेस
HWASan, स्टैक को रिकॉर्ड करने के लिए, तेज़ और फ़्रेम-पॉइंटर पर आधारित अनविंडर का इस्तेमाल करता है
ट्रेस कर सकते हैं कि यह इवेंट,
कार्यक्रम. Android, AArch64 कोड में फ़्रेम पॉइंटर को डिफ़ॉल्ट रूप से चालू करता है, इसलिए यह सुविधा बेहतर तरीके से काम करती है. अगर आपको मैनेज किए जा रहे कोड के ज़रिए, प्रोसेस को फिर से शुरू करना है, तो प्रोसेस एनवायरमेंट में HWASAN_OPTIONS=fast_unwind_on_malloc=0
सेट करें. ध्यान दें कि खराब मेमोरी ऐक्सेस स्टैक
ट्रेस में "धीमी" का इस्तेमाल किया जाता है डिफ़ॉल्ट रूप से खोलें; इस सेटिंग से सिर्फ़
ऐलोकेशन और डीललोकेशन ट्रेस. लोड के आधार पर, यह विकल्प बहुत ज़्यादा
सीपीयू का इस्तेमाल कर सकता है.
सिंबलाइज़ेशन
सिंबलेशन देखें "HWASan रिपोर्ट को समझना" में.
ऐप्लिकेशन में HWASan
AddressSanitizer की तरह ही, HWASan भी Java कोड को नहीं देख सकता. हालांकि, यह JNI लाइब्रेरी में मौजूद गड़बड़ियों का पता लगा सकता है. Android 14 से पहले, HWASan डिवाइस पर HWASan ऐप्लिकेशन नहीं चलाए जा सकते थे.
HWASan डिवाइस पर, ऐप्लिकेशन की जांच
SANITIZE_TARGET:=hwaddress
के साथ कोड
बनाएं या कंपाइलर फ़्लैग में -fsanitize=hwaddress
.
HWASan के अलावा, Android 14 या इसके बाद के वर्शन वाले डिवाइस पर, wrap.sh फ़ाइल सेटिंग चालू होती है
LD_HWASAN=1
को जोड़ना ज़रूरी है.
ज़्यादा जानकारी के लिए,
ऐप्लिकेशन डेवलपर के लिए दस्तावेज़
देखें.