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 kullanır. Bu nedenle, tüm sistemin temizlenmesi 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 kilitlenmelere neden olan Java kodunun hata ayıklanmasına 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 küçük RAM ek yükü (%10-35)

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

  • Yığın ve bellek yığını arabellek taşması/taşmasızlığı
  • Heap use after free
  • Yığın kullanımı kapsam dışında
  • İki katı ücretsiz/wild ü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. 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 olan en yüksek baytı yoksayma (TBI) özelliğini kullanır.

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

HWASan, tasarım gereği 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 ne kadar büyük olduğundan veya belleğin ne kadar süre önce serbest bırakıldığından bağımsız olarak bir hatayı algılayabilir. Bu durum, HWASan'a ASan karşısında büyük bir avantaj sağlar.

Ancak HWASan'ın olası etiket değerleri sınırlı (256) olduğundan programın bir kez çalıştırılması sırasında herhangi bir hatanın gözden kaçırılma olasılığı% 0,4'tür.

Ş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 derleme yapıyorsanız LLVM c336557f taahhüdüne kadar her şeyin dahil edildiğ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 silmenize gerek yoktur.

AddressSanitizer ile ilgili bazı 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 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 konumundaysa (ö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 bir yığın izi kaydetmek üzere hızlı, çerçeve işaretçisine dayalı bir açı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 sarmaya ihtiyacınız varsa HWASAN_OPTIONS=fast_unwind_on_malloc=0 işlem ortamında ayarlayın. Kötü bellek erişimi yığını izlemelerinin varsayılan olarak "yavaş" sarmalayıcıyı kullandığını unutmayın. Bu ayar yalnızca ayırma ve ayırmayı kaldırma izlemelerini 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

HWASan, AddressSanitizer'a benzer şekilde Java kodunu göremez ancak JNI kitaplıklarındaki hataları tespit edebilir. Android 14'e kadar, HWASan uygulamalarının HWASan olmayan bir cihazda çalıştırılması 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ün yüklü olduğu) LD_HWASAN=1 ayarını içeren bir wrap.sh dosyası eklenmelidir. Daha fazla bilgi için uygulama geliştirici belgelerini inceleyin.