HWASan ক্র্যাশগুলি কীভাবে পড়তে হয় সে সম্পর্কে তথ্যের জন্য HWASan প্রতিবেদনগুলি বোঝা দেখুন!
হার্ডওয়্যার-সহায়ক অ্যাড্রেস স্যানিটাইজার (HWASan) হল অ্যাড্রেস স্যানিটাইজারের মতো একটি মেমরি ত্রুটি সনাক্তকরণ সরঞ্জাম। HWASan ASan এর তুলনায় অনেক কম RAM ব্যবহার করে, যা এটিকে পুরো সিস্টেম স্যানিটাইজেশনের জন্য উপযুক্ত করে তোলে। HWASan শুধুমাত্র Android 10 এবং উচ্চতর সংস্করণে এবং শুধুমাত্র AArch64 হার্ডওয়্যারে উপলব্ধ।
যদিও C/C++ কোডের জন্য প্রাথমিকভাবে উপযোগী, HWASan জাভা কোড ডিবাগ করতেও সাহায্য করতে পারে যা জাভা ইন্টারফেস প্রয়োগ করতে ব্যবহৃত C/C++ এ ক্র্যাশ ঘটায়। এটি সহায়ক কারণ এটি মেমরি ত্রুটিগুলি ধরা পড়ে যখন সেগুলি ঘটে, আপনাকে সরাসরি দায়ী কোডের দিকে নির্দেশ করে৷
আপনি ci.android.com ( বিস্তারিত সেটআপ নির্দেশাবলী ) থেকে সমর্থিত পিক্সেল ডিভাইসগুলিতে পূর্বনির্মাণ করা HWASan ছবিগুলি ফ্ল্যাশ করতে পারেন।
ক্লাসিক ASan-এর তুলনায় HWASan-এর আছে:
- অনুরূপ CPU ওভারহেড (~2x)
- একই কোড সাইজ ওভারহেড (40 - 50%)
- অনেক ছোট RAM ওভারহেড (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-এর জন্য সিস্টেম কল আর্গুমেন্টে ট্যাগ করা পয়েন্টার গ্রহণ করতে Linux কার্নেলের প্রয়োজন হয়। এর জন্য সমর্থন নিম্নলিখিত আপস্ট্রিম প্যাচসেটগুলিতে প্রয়োগ করা হয়েছে:
- arm64 ট্যাগ করা ঠিকানা ABI
- arm64: আনট্যাগ ব্যবহারকারী পয়েন্টার কার্নেলে পাস করা হয়েছে
- 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
সুবিধার জন্য, আপনি aosp_coral_hwasan এর অনুরূপ পণ্যের সংজ্ঞাতে SANITIZE_TARGET সেটিং যোগ করতে পারেন।
অ্যাড্রেস স্যানিটাইজারের সাথে পরিচিত ব্যবহারকারীদের জন্য, অনেক বিল্ড জটিলতা চলে গেছে:
- দুইবার রান করার দরকার নেই।
- বাক্সের বাইরে ক্রমবর্ধমান বিল্ড কাজ.
- ব্যবহারকারীর ডেটা ফ্ল্যাশ করার দরকার নেই।
কিছু অ্যাড্রেস স্যানিটাইজার সীমাবদ্ধতাও চলে গেছে:
- স্ট্যাটিক এক্সিকিউটেবল সমর্থিত।
- libc ছাড়া অন্য কোনো টার্গেটের স্যানিটাইজেশন এড়িয়ে যাওয়া ঠিক আছে। ASan এর বিপরীতে এমন কোনও প্রয়োজন নেই যে যদি একটি লাইব্রেরি স্যানিটাইজ করা হয়, তবে এটিকে লিঙ্ক করে এমন কোনও এক্সিকিউটেবলও হতে হবে।
একই (বা উচ্চতর) বিল্ড নম্বরে HWASan এবং নিয়মিত চিত্রগুলির মধ্যে স্যুইচ করা অবাধে করা যেতে পারে। ডিভাইস মোছার প্রয়োজন নেই।
একটি মডিউলের স্যানিটাইজেশন এড়ানোর জন্য, LOCAL_NOSANITIZE := hwaddress
(Android.mk) বা sanitize: { hwaddress: false }
(Android.bp)।
পৃথক লক্ষ্য স্যানিটাইজ করুন
HWASan একটি নিয়মিত (আনস্যানিটাইজড) বিল্ডে লক্ষ্য প্রতি সক্রিয় করা যেতে পারে, যতক্ষণ না libc.so
ও স্যানিটাইজ করা হয়। hwaddress: true
bionic/libc/Android.bp-এ "libc_defaults"
-এ স্যানিটাইজ ব্লকে সত্য। তারপর আপনি যে টার্গেট নিয়ে কাজ করছেন সেখানেও একই কাজ করুন।
মনে রাখবেন যে libc স্যানিটাইজ করা হিপ মেমরি বরাদ্দকরণের ট্যাগিং সক্ষম করে সিস্টেম-ব্যাপী, সেইসাথে libc.so
ভিতরে মেমরি অপারেশনের জন্য ট্যাগগুলি পরীক্ষা করা। এটি এমন বাইনারিগুলিতেও বাগ ধরতে পারে যেগুলিতে যদি খারাপ মেমরি অ্যাক্সেস libc.so
(যেমন pthread_mutex_unlock()
একটি delete()
ed mutex-এ থাকে তবে HWASan সক্রিয় করা হয়নি৷
পুরো প্ল্যাটফর্মটি HWASan ব্যবহার করে নির্মিত হলে কোনো বিল্ড ফাইল পরিবর্তন করার প্রয়োজন নেই।
ফ্ল্যাশস্টেশন
উন্নয়নের উদ্দেশ্যে, আপনি ফ্ল্যাশস্টেশন ব্যবহার করে আনলক করা বুটলোডার সহ একটি পিক্সেল ডিভাইসে AOSP-এর HWASan-সক্ষম বিল্ড ফ্ল্যাশ করতে পারেন। _hwasan লক্ষ্য নির্বাচন করুন, যেমন aosp_flame_hwasan-userdebug। আরও বিস্তারিত জানার জন্য অ্যাপ ডেভেলপারদের জন্য HWASan-এর NDK ডকুমেন্টেশন দেখুন।
ভাল স্ট্যাক ট্রেস
HWASan প্রোগ্রামে প্রতিটি মেমরি বরাদ্দ এবং ডিললোকেশন ইভেন্টের জন্য একটি স্ট্যাক ট্রেস রেকর্ড করতে একটি দ্রুত, ফ্রেম-পয়েন্টার-ভিত্তিক আনউইন্ডার ব্যবহার করে। অ্যান্ড্রয়েড ডিফল্টরূপে AArch64 কোডে ফ্রেম পয়েন্টার সক্ষম করে, তাই এটি অনুশীলনে দুর্দান্ত কাজ করে। ম্যানেজড কোডের মাধ্যমে আপনার যদি আনওয়াইন্ড করার প্রয়োজন হয়, প্রক্রিয়া পরিবেশে HWASAN_OPTIONS=fast_unwind_on_malloc=0
সেট করুন। নোট করুন যে খারাপ মেমরি অ্যাক্সেস স্ট্যাক ট্রেস ডিফল্টরূপে "ধীর" আনওয়াইন্ডার ব্যবহার করে; এই সেটিং শুধুমাত্র বরাদ্দ এবং ডিলোকেশন ট্রেসকে প্রভাবিত করে। লোডের উপর নির্ভর করে এই বিকল্পটি খুব CPU-নিবিড় হতে পারে।
প্রতীকীকরণ
"HWASan রিপোর্ট বোঝার জন্য" প্রতীকীকরণ দেখুন।
অ্যাপে HWASan
অ্যাড্রেস স্যানিটাইজারের মতো, HWASan জাভা কোড দেখতে পারে না, তবে এটি JNI লাইব্রেরিতে বাগ সনাক্ত করতে পারে। অ্যান্ড্রয়েড 14 পর্যন্ত, HWASan নয় এমন ডিভাইসে HWASan অ্যাপ চালানো সমর্থিত ছিল না ।
একটি HWASan ডিভাইসে, অ্যাপগুলিকে SANITIZE_TARGET:=hwaddress
in Make, অথবা -fsanitize=hwaddress
কম্পাইলার ফ্ল্যাগ দিয়ে তাদের কোড তৈরি করে HWASan দিয়ে চেক করা যেতে পারে। একটি নন-HWASan ডিভাইসে (Android 14 বা তার পরবর্তী সংস্করণে চলমান), একটি wrap.sh ফাইল সেটিং LD_HWASAN=1
যোগ করতে হবে। আরও বিস্তারিত জানার জন্য অ্যাপ ডেভেলপার ডকুমেন্টেশন দেখুন।