Donanım destekli AddressSanitizer

HWASan kilitlenmelerini nasıl okuyacağınız hakkında bilgi edinmek için HWASan raporlarını anlama başlıklı makaleyi inceleyin.

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 kullandığı için tüm sistem temizliği için uygundur. HWASan yalnızca Android 10 ve sonraki sürümlerde ve yalnızca AArch64 donanımında kullanılabilir.

HWASan, öncelikli olarak C/C++ kodu için yararlı olsa da Java arayüzlerini uygulamak için kullanılan C/C++'da çökmelere neden olan Java kodunda hata ayıklamaya da yardımcı olabilir. Hafıza hatalarını oluştuğu anda yakalayıp sizi doğrudan sorumlu koda yönlendirdiği için faydalıdır.

HWASan, klasik ASan'a kıyasla:

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

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

  • Yığın ve bellek yığını arabellek taşması/taşma altı
  • Ücretsiz kullanımdan sonra yığın kullanımı
  • Yığın kullanımının kapsamı dışında
  • İki katı ücretsiz/vahşi ücretsiz

Ayrıca, HWASan, dönüşten sonra yığın kullanımını da algılar.

HWASan (ASan ile aynı) UBSan ile uyumludur ve her ikisi de aynı anda bir hedefte etkinleştirilebilir.

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

HWASan, hem işaretçilerle hem de bellek adresi aralıklarıyla küçük bir rastgele etiket değerinin ilişkilendirildiği bellek etiketleme yaklaşımına dayanı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 en üst baytı yoksayma (TBI) özelliğini kullanır.

Clang dokümanları sitesinde HWASan'ın tasarımı hakkında daha fazla bilgi edinebilirsiniz.

Tasarım gereği HWASan, taşmaları tespit etmek için ASan'ın sınırlı boyutlu kırmızı bölgelerine veya boşaltıldıktan sonra kullanımı tespit etmek için ASan'ın sınırlı kapasiteli karantina alanına sahip değildir. Bu nedenle, HWASan, taşmanın boyutu veya belleğin ne kadar süre önce serbest bırakıldığı fark etmeksizin bir hatayı tespit edebilir. Bu durum, HWASan'a ASan karşısında büyük bir avantaj sağlar.

Ancak HWASan'ın sınırlı sayıda olası etiket değeri (256) vardır.Bu da programın bir kez çalıştırılması sırasında herhangi bir hatanın kaçırılma olasılığının% 0,4 olduğu anlamına gelir.

Şartlar

Ortak Android çekirdeğinin son sürümleri (4.14 ve üzeri), HWASan'ı kutudan çıktığı haliyle destekler. Android 10'a özel dallarda HWASan desteği yoktur.

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

Farklı bir çekirdekle çalışıyorsanız HWASan, Linux çekirdeğinin sistem çağrısı bağımsız değişkenlerinde etiketlenmiş işaretçileri kabul etmesini gerektirir. Bu özellik için destek, aşağıdaki yukarı akış yama kümelerinde uygulanmıştır:

Özel bir araç zinciriyle geliştirme yapıyorsanız bu zincirin, LLVM c336557f taahhüdüne 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ğlaması için SANITIZE_TARGET ayarını bir ürün tanımına ekleyebilirsiniz. Örneğin: aosp_coral_hwasan.

AddressSanitizer'ı bilen kullanıcılar için derleme karmaşıklığı büyük ölçüde ortadan kalktı:

  • make komutunu iki kez çalıştırmanıza gerek yoktur.
  • Artımlı derlemeler kullanıma hazırdır.
  • Kullanıcı verilerini yüklemenize gerek yoktur.

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

  • Statik yürütülebilir dosyalar desteklenir.
  • libc dışındaki hedeflerin temizlenmesi atlanabilir. ASan'ın aksine, bir kitaplık temizlenirse onu bağlayan tüm yürütülebilir dosyaların da temizlenmesi gerekmez.

Aynı (veya daha yüksek) derleme numarasında HWASan ile normal görüntüler arasında geçiş serbestçe yapılabilir. Cihazın silinmesi gerekmez.

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

Tek tek hedefleri temizleme

HWASan, libc.so de temizlendiği sürece normal (temizlenmemiş) bir derlemede hedef başına etkinleştirilebilir. bionic/libc/Android.bp dosyasındaki "libc_defaults" bölümünde yer alan temizleme bloğuna hwaddress: true ekleyin. Ardından, üzerinde çalıştığınız hedefte de aynı işlemi yapın.

libc'nin temizlenmesinin, yığın bellek ayırmalarının sistem genelinde etiketlenmesini ve libc.so içindeki bellek işlemleri için etiketlerin kontrol edilmesini sağladığını unutmayın. Bu, kötü bellek erişimi libc.so içindeyse (ör. pthread_mutex_unlock() (delete()ed mutex üzerinde).

Platformun tamamı HWASan kullanılarak oluşturulmuşsa derleme dosyalarında herhangi bir değişiklik yapılması gerekmez.

Daha iyi yığın izleri

HWASan, programdaki her bellek ayırma ve bellekten çıkarma etkinliği için yığın izi kaydetmek üzere hızlı, çerçeve işaretçisine dayalı bir geri sarıcı kullanır. Android, AArch64 kodunda varsayılan olarak çerçeve işaretçilerini etkinleştirir. Bu nedenle, pratikte sorunsuz çalışır. Yönetilen kodda geri sarma yapmanız gerekiyorsa işlem ortamında HWASAN_OPTIONS=fast_unwind_on_malloc=0 ayarlayın. Kötü bellek erişimi yığını izlerinin varsayılan olarak "yavaş" sarmalayıcıyı kullandığını unutmayın. Bu ayar yalnızca ayırma ve ayırmayı kaldırma izlerini etkiler. Bu seçenek, yüke bağlı olarak çok fazla CPU kullanabilir.

Simgeselleştirme

"HWASan raporlarını anlama" bölümündeki Sembolleştirme'ye 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 dışı bir cihazda HWASan uygulamaları çalıştırmak desteklenmiyordu.

HWASan cihazlarda uygulamalar, kodları Make'te SANITIZE_TARGET:=hwaddress ile veya derleyici işaretlerinde -fsanitize=hwaddress ile oluşturularak HWASan ile kontrol edilebilir. HWASan olmayan bir cihazda (Android 14 veya daha yeni bir sürüm çalıştıran) LD_HWASAN=1 ayarını içeren bir wrap.sh dosyası eklenmelidir. Daha fazla bilgi için uygulama geliştirici belgelerini inceleyin.