HWASan çökmelerinin nasıl okunacağı hakkında bilgi için HWASan raporlarını anlama konusuna bakın!
Donanım destekli AdresSanitizer (HWASan), AdresSanitizer'a benzer bir bellek hatası tespit aracıdır. HWASan, ASan'a kıyasla çok daha az RAM kullanır, bu da onu tüm sistem temizliği için uygun kılar. HWASan yalnızca Android 10 ve üzeri sürümlerde ve yalnızca AArch64 donanımında mevcuttur.
HWASan öncelikle C/C++ kodu için yararlı olmasına rağmen, Java arayüzlerini uygulamak için kullanılan C/C++'da çökmelere neden olan Java kodunda hata ayıklamaya da yardımcı olabilir. Bellek hatalarını meydana geldiğinde yakalayıp sizi doğrudan sorumlu koda yönlendirdiğinden faydalıdır.
Klasik ASan ile karşılaştırıldığında HWASan aşağıdaki özelliklere sahiptir:
- Benzer CPU yükü (~2x)
- Benzer kod boyutu yükü (%40 – 50)
- Çok daha küçük RAM yükü (%10 – %35)
HWASan, ASan ile aynı hataları tespit ediyor:
- Yığın ve yığın arabellek taşması/eksikliği
- Bedavadan sonra yığın kullanımı
- Kapsam dışında yığın kullanımı
- Çift özgür/vahşi özgür
Ek olarak HWASan, dönüşten sonra yığın kullanımını algılar.
HWASan (ASan ile aynı) UBSan ile uyumludur, her ikisi de aynı anda bir hedef üzerinde etkinleştirilebilir.
Uygulama ayrıntıları ve sınırlamalar
HWASan, küçük bir rastgele etiket değerinin hem işaretçilerle hem de bellek adres aralıklarıyla ilişkilendirildiği bellek etiketleme yaklaşımını temel alır. Bellek erişiminin geçerli olması için işaretçi ve bellek etiketlerinin eşleşmesi gerekir. HWASan, işaretçi etiketini adresin en yüksek bitlerinde depolamak için sanal adres etiketleme olarak da adlandırılan ARMv8 özelliği olan üst bayt yoksayma (TBI) özelliğini kullanır.
HWASan'ın tasarımı hakkında daha fazla bilgiyi Clang dokümantasyon sitesinde okuyabilirsiniz.
Tasarım gereği HWASan, ASan'ın taşmaları tespit etmeye yönelik sınırlı boyutlu kırmızı bölgelerine veya ücretsiz kullanımdan sonra kullanımı tespit etmeye yönelik ASan'ın sınırlı kapasiteli karantinasına sahip değildir. Bu nedenle HWASan, taşma ne kadar büyük olursa olsun veya belleğin tahsisi ne kadar zaman önce olursa olsun bir hatayı tespit edebilir. Bu HWASan'a ASan'a göre büyük bir avantaj sağlıyor.
Bununla birlikte, HWASan'ın sınırlı sayıda olası etiket değeri (256) vardır; bu, programın bir yürütülmesi sırasında herhangi bir hatayı kaçırma olasılığının %0,4 olduğu anlamına gelir.
Gereksinimler
Ortak Android çekirdeğinin son sürümleri (4.14+), kullanıma hazır HWASan'ı destekler. Android 10'a özgü dalların HWASan desteği yoktur.
HWASan için kullanıcı alanı desteği Android 11'den itibaren mevcuttur.
Farklı bir çekirdekle çalışıyorsanız HWASan, Linux çekirdeğinin sistem çağrısı argümanlarında etiketli işaretçileri kabul etmesini gerektirir. Bunun için destek aşağıdaki yukarı akış yama setlerinde uygulandı:
- arm64 etiketli adres ABI
- arm64: çekirdeğe iletilen kullanıcı işaretçilerinin etiketini kaldırın
- mm: brk()/mmap()/mremap() içinde sanal adres takma adları oluşturmaktan kaçının
- arm64: Çekirdek iş parçacıklarından çağrılan erişim_ok()'taki etiketli adresleri doğrulayın
Özel bir araç zinciriyle derleme yapıyorsanız, bunun LLVM commit c336557f'ye kadar her şeyi içerdiğinden emin olun.
HWASan'ı kullanma
HWASan'ı kullanarak platformun tamamını oluşturmak için aşağıdaki komutları kullanın:
lunch aosp_walleye-userdebug # (or any other product)
export SANITIZE_TARGET=hwaddress
m -j
Kolaylık sağlamak için SANITIZE_TARGET ayarını aosp_coral_hwasan'a benzer şekilde bir ürün tanımına ekleyebilirsiniz.
AdresSanitizer'a aşina olan kullanıcılar için birçok yapı karmaşıklığı ortadan kalktı:
- İki kez make komutunu çalıştırmanıza gerek yok.
- Artımlı yapılar kutudan çıktığı gibi çalışır.
- Kullanıcı verilerini flaş etmeye gerek yok.
Bazı AdresSanitizer kısıtlamaları da kaldırıldı:
- Statik yürütülebilir dosyalar desteklenir.
- Libc dışındaki herhangi bir hedefin arındırılmasını atlamakta sorun yoktur. ASan'dan farklı olarak, eğer bir kütüphane temizlenmişse, onu bağlayan herhangi bir yürütülebilir dosyanın da temizlenmiş olması zorunluluğu yoktur.
HWASan ile aynı (veya daha yüksek) yapı numarasına sahip normal görüntüler arasında geçiş serbestçe yapılabilir. Cihazın silinmesine gerek yoktur.
Bir modülün temizlenmesini atlamak için
LOCAL_NOSANITIZE := hwaddress (Android.mk) kullanın veya
sanitize: { hwaddress: false } (Android.bp).
Bireysel hedeflerin sterilize edilmesi
HWASan,
libc.so da temizlendiği sürece, normal (temizlenmemiş) bir yapıda hedef başına etkinleştirilebilir. bionic/libc/Android.bp'deki
"libc_defaults" içindeki sanitize bloğuna
hwaddress: true ekleyin. Daha sonra üzerinde çalıştığınız hedefte de aynısını yapın.
libc'nin temizlenmesinin, sistem genelinde yığın bellek tahsislerinin etiketlenmesine ve ayrıca
libc.so içindeki bellek işlemlerine ilişkin etiketlerin kontrol edilmesine olanak sağladığını unutmayın. Bu, hatalı bellek erişiminin
libc.so olması durumunda HWASan'ın etkinleştirilmediği ikili dosyalarda bile hataları yakalayabilir (örneğin,
delete() ed mutex'te
pthread_mutex_unlock() ).
Platformun tamamı HWASan kullanılarak oluşturulmuşsa herhangi bir derleme dosyasını değiştirmenize gerek yoktur.
Flash istasyonu
Geliştirme amacıyla, HWASan özellikli bir AOSP yapısını, Flashstation'ı kullanarak önyükleyici kilidi açılmış bir Pixel cihaza aktarabilirsiniz. _hwasan hedefini seçin, örneğin aosp_flame_hwasan-userdebug. Daha fazla ayrıntı için uygulama geliştiricilerine yönelik HWASan'a yönelik NDK belgelerine bakın.
Daha iyi yığın izleri
HWASan, programdaki her bellek tahsisi ve serbest bırakma olayı için bir yığın izlemesi kaydetmek üzere hızlı, çerçeve işaretçisi tabanlı bir çözücü kullanır. Android, varsayılan olarak AArch64 kodunda çerçeve işaretçilerini etkinleştirir, dolayısıyla bu pratikte harika çalışır. Yönetilen kodu çözmeniz gerekiyorsa işlem ortamında
HWASAN_OPTIONS=fast_unwind_on_malloc=0 ayarını yapın. Kötü bellek erişimi yığın izlemelerinin varsayılan olarak "yavaş" çözücüyü kullandığını unutmayın; bu ayar yalnızca tahsis ve serbest bırakma izlerini etkiler. Bu seçenek, yüke bağlı olarak CPU'yu çok yoğun kullanabilir.
Sembolizasyon
"HWASan raporlarını anlama" bölümündeki Sembolizasyona bakın.
Uygulamalarda HWASan
AdresSanitizer'a benzer şekilde HWASan, Java kodunu göremez ancak JNI kitaplıklarındaki hataları tespit edebilir. Android 14'e kadar HWASan uygulamalarını HWASan olmayan bir cihazda çalıştırmak desteklenmiyordu .
Bir HWASan cihazında uygulamalar, kodları Make'de
SANITIZE_TARGET:=hwaddress veya derleyici bayraklarında
-fsanitize=hwaddress ile oluşturularak HWASan ile kontrol edilebilir. HWASan olmayan bir cihazda (Android 14 veya daha yenisini çalıştıran),
LD_HWASAN=1 Wrap.sh dosya ayarının eklenmesi gerekir. Daha fazla ayrıntı için uygulama geliştirici belgelerine bakın.