HWAddressDezenfektan

Donanım destekli AddressSanitizer (HWASan), AddressSanitizer'a benzer bir bellek hatası algılama aracıdır. HWASan, ASan'a kıyasla çok daha az RAM kullanır ve bu da onu tüm sistem temizliği için uygun hale getirir. HWASan yalnızca Android 10 ve üzeri sürümlerde ve yalnızca AArch64 donanımında kullanılabilir.

Öncelikle C/C++ kodu için yararlı olsa da, HWASan, Java arabirimlerini uygulamak için kullanılan C/C++'da çökmelere neden olan Java kodunda hata ayıklamaya da yardımcı olabilir. Yararlıdır, çünkü meydana geldiklerinde bellek hatalarını yakalar ve sizi doğrudan sorumlu koda yönlendirir.

Önceden oluşturulmuş HWASan görüntülerini ci.android.com'dan desteklenen Pixel cihazlarına flaş edebilirsiniz ( ayrıntılı kurulum talimatları ).

Klasik ASan ile karşılaştırıldığında, HWASan'ın özellikleri:

  • Benzer CPU yükü (~2x)
  • Benzer kod boyutu ek yükü (%40 – %50)
  • Çok daha küçük RAM ek yükü (%10 - %35)

HWASan, ASan ile aynı hata grubunu algılar:

  • Yığın ve yığın arabellek taşması/yetersizliği
  • Serbest kaldıktan sonra yığın kullanımı
  • Kapsam dışında yığın kullanımı
  • Çift serbest/vahşi ücretsiz

Ek olarak, HWASan dönüşten sonra yığın kullanımını algılar.

Uygulama ayrıntıları ve sınırlamaları

HWASan, küçük bir rastgele etiket değerinin hem işaretçiler hem de bellek adres aralıkları ile ilişkilendirildiği bellek etiketleme yaklaşımına dayanmaktadır. Bir 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 üst bayt yok saymaya (TBI) güvenir.

HWASan'ın tasarımı hakkında daha fazla bilgiyi Clang dokümantasyon sitesinde okuyabilirsiniz.

Tasarım gereği, HWASan, taşmaları algılamak için ASan'ın sınırlı boyutlu kırmızı bölgelerine veya ücretsiz kullanımdan sonra kullanımı algılamak için 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 ne kadar süre önce serbest bırakıldığına bakılmaksızın bir hatayı algılayabilir. Bu, HWASan'a Asan'a göre büyük bir avantaj sağlar.

Ancak, HWASan'ın sınırlı sayıda olası etiket değeri vardır (256); bu, programın bir yürütmesi sırasında herhangi bir hatayı kaçırma olasılığının %0.4 olduğu anlamına gelir.

Gereksinimler

HWASan, Linux çekirdeğinin sistem çağrısı argümanlarında etiketlenmiş işaretçileri kabul etmesini gerektirir. Bunun için destek, aşağıdaki yukarı akış yama setlerinde uygulandı:

Bu yamalar, ortak Android çekirdeğinde android-4.14 ve daha yüksek dallarda destek olarak bulunur, ancak Android -4.14-q gibi Android 10'a özgü dallarda bulunmaz.

HWASan için kullanıcı alanı desteği, Android 11'den itibaren mevcuttur.

Özel bir araç zinciriyle oluşturuyorsanız, bunun LLVM commit c336557f'ye kadar her şeyi içerdiğinden emin olun.

HWASan'ı kullanma

HWASan kullanarak tüm platformu 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, aosp_coral_hwasan'a benzer bir ürün tanımına SANITIZE_TARGET ayarını ekleyebilirsiniz.

ASan'dan farklı olarak, HWASan ile iki kez inşa etmeye gerek yoktur. Artımlı derlemeler yalnızca çalışır, özel bir yanıp sönme talimatı veya silme gereksinimi yoktur, statik yürütülebilir dosyalar desteklenir ve libc dışındaki herhangi bir kitaplığın temizlenmesini atlamak sorun değildir. Ayrıca bir kitaplık sterilize edilmişse, ona bağlanan herhangi bir yürütülebilir dosyanın da sterilize edilmesi gerekliliği yoktur.

Bir modülün sanitizasyonunu atlamak için LOCAL_NOSANITIZE := hwaddress veya sanitize: { hwaddress: false } .

Bireysel modüller, libc de HWASan-ified olduğu uyarısıyla HWASan ile sterilize edilebilir. Bu, ilgili Android.bp modül tanımına sanitize: { hwaddress: true } eklenerek yapılabilir. Android platformunun tamamı, bir _hwasan -suffixed yapı ( libc dahil) kullanıldığında HWASan ile oluşturulmuştur ve bu nedenle HWASan yapıları için libc manuel olarak sterilize edilmesi gerekli değildir.

Daha iyi yığın izleri

HWASan, programdaki her bellek ayırma ve ayırma olayı için bir yığın izlemesi kaydetmek için 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, bu nedenle pratikte bu harika çalışır. Yönetilen kod aracılığıyla gevşemeniz gerekiyorsa, işlem ortamında HWASAN_OPTIONS=fast_unwind_on_malloc=0 olarak ayarlayın. Kötü bellek erişimi yığın izlerinin varsayılan olarak "yavaş" sarıcıyı kullandığını unutmayın; bu ayar yalnızca ayırma ve ayırma izlerini etkiler. Bu seçenek, yüke bağlı olarak çok CPU yoğun olabilir.

sembolizasyon

ASan belgelerinde Sembolleştirmeye bakın.

Uygulamalarda HWASan

AddressSanitizer'a benzer şekilde, HWASan Java kodunu göremez, ancak JNI kitaplıklarındaki hataları algılayabilir. ASan'dan farklı olarak, HWASan uygulamalarının HWASan olmayan bir cihazda çalıştırılması desteklenmez.

Bir HWASan cihazında uygulamalar, Make'da SANITIZE_TARGET:=hwaddress veya derleyici bayraklarında -fsanitize=hwaddress ile kodlarını oluşturarak HWASan ile kontrol edilebilir. Daha fazla ayrıntı için uygulama geliştirici belgelerine bakın.