Donanım Destekli Adres Temizleyici

Bkz. HWASan'ı anlama raporlarını inceleyin!

Donanım destekli AddressSanitizer (HWASan) bir bellek hatasıdır algılama aracını kullanarak Adres Temizleyici. HWASan ASan'a kıyasla çok daha az RAM kullanır ve bu nedenle bir çözüm olabilir. HWASan, yalnızca Android 10'da kullanılabilir yalnızca AArch64 donanımında kullanılabilir.

Özellikle C/C++ kodu için yararlı olsa da HWASan, soruna neden olan Java kodunda hata ayıklamaya da Java arayüzlerini uygulamak için kullanılan C/C++'ta kilitlenmeler. Faydalı, anıyı yakalıyor göstererek sizi doğrudan sorumlu koda yönlendirmenizi sağlar.

Önceden oluşturulmuş HWASan resimlerini desteklenen Pixel cihazlara ci.android.com (ayrıntılı kurulum talimatları).

Klasik ASan'a kıyasla HWASan:

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

HWASan, ASan ile aynı hata grubunu tespit eder:

  • Yığın ve yığın arabellek taşması/alt akışı
  • Boş olduğunda yığın kullanımı
  • Kapsam dışında yığın kullanımı
  • Çift serbest/wild serbest

HWASan, iadeden sonra yığın kullanımını da tespit eder.

HWASan (ASan ile aynı) UBSan, her ikisi de aynı anda bir hedef üzerinde etkinleştirilebilir.

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

HWASan, bellek küçük bir rastgele etiket değerinin ilişkilendirildiği etiketleme yaklaşımı kullanarak hem işaretçilerle hem de bellek adresi aralıklarıyla kullanabilirsiniz. Anılar için erişim geçerliyse işaretçi ve bellek etiketlerinin eşleşmesi gerekir. HWASan, ARMv8 özelliği üst bayt yoksayma (TBI) sistemine dayanmaktadır. sanal adres etiketlemesi yüksek bit eşlemleri için kullanabilirsiniz.

Web sitemiz g.co/newsinitiative/labs üzerinden tasarım bulabilirsiniz.

HWASan, tasarımı gereği ASan'ın taşmaları veya ASan'ın sınırlı kapasiteli karantinasını ücretsiz olduğunu görüyorsunuz. Bu nedenle, HWASan ne kadar büyük olursa olsun veya hafızada ne kadar zaman önce anlaşmaya vardık. Bu da HWASan'a, ASan'a göre büyük bir avantaj sağlıyor.

Ancak, HWASan'ın kullanabileceği olası etiket değeri sayısı sınırlıdır (256), Bu da herhangi bir hatanın gözden kaçma olasılığının% 0,4 olduğu anlamına gelir. yürütülmesinden emin olabilirsiniz.

Gereksinimler

yaygın Android çekirdeği desteği Kullanıma hazır HWASan. Android 10'a özgü dallarda 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ı bağımsız değişkenleridir. Bunun desteği aşağıdaki yukarı akış yama kümelerinde uygulandı:

Özel bir araç zinciri ile derliyorsanız LLVM kaydetme işlemine kadar her şeyi içerdiğinden emin olun. c336557f.

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ğlaması açısından, SANITIZE_TARGET ayarını bir ürün tanımına ekleyebilirsiniz. şunlara benzer: aosp_coral_hwasan hakkında daha fazla bilgi edinin.

AddressSanitizer'ı bilen kullanıcılar için derleme karmaşıklığının büyük bir kısmı ortadan kalktı:

  • Yapma işlemini iki kez çalıştırmaya gerek yoktur.
  • Artımlı derlemeler kullanıma hazır şekilde sunulur.
  • Kullanıcı verilerini güncellemeye gerek yoktur.

Bazı AddressSanitizer kısıtlamaları kaldırıldı:

  • Statik yürütülebilir dosyalar desteklenir.
  • libc dışındaki hedeflerin arındırılması atlanabilir. ASan'ın aksine bir kitaplığın arındırılmış olması durumunda, bu kitaplığın bağlantısını veren yürütülebilir öğelerin de kullanılması şart değildir.

Aynı (veya daha yüksek) derleme numarasındaki HWASan ile normal görüntüler arasında özgürce yapılır. Cihazın silinmesi gerekmez.

Bir modülün temizlenmesi işlemini atlamak için şunu kullanın: LOCAL_NOSANITIZE := hwaddress (Android.mk) veya sanitize: { hwaddress: false } (Android.bp).

Ayrı hedefleri temizleyin

HWASan, normal (düzenlenmemiş) bir derlemede hedef başına etkinleştirilebilir (libc.so aynı zamanda olduğu sürece) arındırılmış bir hale geldi. "libc_defaults" içindeki arındırma blokuna hwaddress: true ekleyin bionic/libc/Android.bp biçimindedir. Ardından, aynı işlemi üzerinde çalıştığınız hedefte yapın.

libc'nin temizlenmesi, hem sistem genelinde hem de yığın bellek ayırmalarının libc.so içindeki bellek işlemleri için etiketlerin kontrol ediliyor. Bu işlem, ikili programlarda bile hataları yakalayabilir libc.so içinde kötü bellek erişimi varsa HWASan'ın etkinleştirilmediğini (ör. pthread_mutex_unlock(), delete() etkinleştirilmiş bir karşılıklı dışlamada gösteriliyor).

Tüm platform HWASan kullanılarak oluşturulmuşsa derleme dosyalarını değiştirmeniz gerekmez.

Flash İstasyonu

Geliştirme amacıyla, HWASan etkin AOSP derlemesini Pixel cihaza yükleyebilirsiniz. Flashstation kullanarak kilidi açılmış bootloader'ı deneyin. _hwasan hedefini seçin, ör. aosp_flame_hwasan-userdebug. Bkz. HWASan için NDK belgeleri inceleyebilirsiniz.

Daha iyi yığın izlemeler

HWASan, yığın kaydetmek için hızlı, kare işaretçisine dayalı bir açıcı kullanır her bellek ayırma ve dağıtım etkinliği için çok önemli. Android, AArch64 kodunda kare işaretçilerini varsayılan olarak etkinleştirir. Bu nedenle pratikte bu yöntem işe yarar. Ancak yalnızca hafta içinde yönetilen kod, HWASAN_OPTIONS=fast_unwind_on_malloc=0 olarak ayarla daha yüksek bir etkiye sahiptir. Hatalı bellek erişimi yığınının izler, “yavaş” varsayılan olarak gevşeyip dinlenmeyi sağlar. bu ayar yalnızca daha kolay şekilde belirleyebilirsiniz. Bu seçenek, Yüke bağlı olarak CPU'yu yoğun kullanır.

Sembol

Sembollere bakın. "HWASan raporlarını anlama" bölümüne bakın.

Uygulamalarda HWASan

AddressSanitizer'a benzer şekilde, HWASan Java kodunu göremez ancak JNI kitaplıklarındaki hataları tespit edebilir. Android 14'e kadar HWASan çalıştıran HWASan olmayan cihazdaki uygulamalar desteklenmiyordu.

HWASan cihazında uygulamalar, SANITIZE_TARGET:=hwaddress içeren kod Derleyici işaretlerinde Make veya -fsanitize=hwaddress. HWASan olmayan bir cihazda (Android 14 veya daha yeni bir sürüm çalıştıran) Wrap.sh dosya ayarı LD_HWASAN=1 eklenmesi gerekiyor. Bkz. uygulama geliştirici dokümanları inceleyebilirsiniz.