HWAddressDezenfektan

Donanım destekli AddressSanitizer (Hwasan) 'e benzer bir bellek hatası algılama aracı AddressSanitizer . HWASan, ASan'a kıyasla çok daha az RAM kullanır, 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ı olmasına rağmen, 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.

Sen desteklenen Piksel cihazlarına önceden oluşturulmuş Hwasan görüntüleri yanıp sönebilir ci.android.com ( 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 dayanan bellek etiketleme küçük bir rastgele etiket değeri işaretçiler ve bellek adresleri aralıkları ile her iki ilişkili yaklaşım. Bir bellek erişiminin geçerli olması için işaretçi ve bellek etiketlerinin eşleşmesi gerekir. Hwasan adresin en yüksek bit işaretçi etiketi saklamak için de sanal adres etiket denir ARMv8 özelliği üst byte görmezden (TBI), dayanır.

Sen hakkında daha fazla bilgi edinebilirsiniz Hwasan tasarımı Clang dokümantasyon sitesinde.

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.

Bununla birlikte, HWASan'ın sınırlı sayıda olası etiket değeri vardır (256), bu da 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 backports olarak mevcuttur ortak Android çekirdek içinde robot-4.14 ve bu şekilde değil, Android 10 dallarda yüksek dalları robot-4.14-q .

Hwasan için userspace desteği, Android 11 ile kullanılabilen bir başlangıç olduğunu.

Özel bir araç zinciri ile bina varsa, emin LLVM için her şeyden içerdiğini yapmak işlemek c336557f .

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

Rahatlığı için, benzer bir ürün tanımı için SANITIZE_TARGET ayarı ekleyebilir aosp_coral_hwasan .

ASan'dan farklı olarak, HWASan ile iki kez inşa etmeye gerek yoktur. Artan sadece işi oluşturur, hiçbir özel, statik yürütülebilir desteklenmektedir talimatları yanıp sönen veya gereksinimi silme, ve bu daha hiçbir kütüphane diğerinin sanitization atlamak için tamam libc . 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, kullanımı hassas temizlemesi atlamak için LOCAL_NOSANITIZE := hwaddress veya sanitize: { hwaddress: false } .

Bireysel modüller taşıdığı bilinciyle, Hwasan ile sterilize edilebilir libc ayrıca Hwasan-ified edilir. Bu ekleyerek yapılabilir sanitize: { hwaddress: true } ilgili için Android.bp modülü tanımı. Bir kullanırken bütün olarak Android platformu Hwasan ile inşa edilmiştir _hwasan (dahil -suffixed yapı libc ) ve örneğin manuel sterilize olarak libc için gerekli değildir Hwasan oluşturur.

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 üzerinden dinlenmek gerekiyorsa, set HWASAN_OPTIONS=fast_unwind_on_malloc=0 süreç ortamında. 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

Bkz Simgeleme Asan belgelerinde.

Uygulamalarda HWASan

AddressSanitizer'a benzer şekilde, HWASan Java kodunu göremez, ancak JNI kitaplıklarındaki hataları algılayabilir. Olmayan bir Hwasan cihazı desteklenmiyor üzerine Asan aksine, Hwasan çalışan uygulamalar.

Bir Hwasan cihazında, uygulamalar ile kodlarını kurarak Hwasan ile kontrol edilebilir SANITIZE_TARGET:=hwaddress Make veya içinde -fsanitize=hwaddress derleyici bayrakları. Bkz uygulama geliştirici belgeleri daha fazla ayrıntı için.