HWASan kilitlenmelerinin nasıl okunacağı 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 da onu tüm sistemin temizlenmesi için uygun hale getirir. HWASan, yalnızca Android 10 ve sonraki sürümlerde, yalnızca AArch64 donanımda kullanılabilir.
Temel olarak C/C++ kodu için kullanışlı olsa da HWASan, Java arayüzlerini uygulamak için kullanılan C/C++'ta kilitlenmelere neden olan Java kodunda hata ayıklamaya da yardımcı olabilir. Hafıza hatalarını oluştukları anda yakalayarak sizi doğrudan sorumlu koda yönlendirdiği için kullanışlıdır.
Hazır HWASan resimlerini ci.android.com adresinden desteklenen Pixel cihazlara yükleyebilirsiniz (ayrıntılı kurulum talimatları).
Klasik ASan'a kıyasla HWASan:
- Benzer CPU yükü (~2x)
- Benzer kod boyutu yükü (%40-50)
- Çok daha küçük RAM yükü (%10 - 35)
HWASan, ASan ile aynı hata grubunu algılar:
- Yığın ve yığın tamponu taşması/yetersizliği
- Ücretsiz kullanımdan sonra yığın kullanımı
- Kapsamın dışında grup kullanımı
- Çift serbest/wild serbest
HWASan, iadeden sonra yığın kullanımını da tespit eder.
HWASan (ASAN ile aynıdır), UBSan ile uyumludur ve her ikisi de bir hedefte aynı anda etkinleştirilebilir.
Uygulama ayrıntıları ve sınırlamalar
HWASan, küçük bir rastgele etiket değerinin hem işaretçilerle hem de bellek adresi aralıkları ile ilişkilendirildiği bellek etiketleme yaklaşımını temel alır. Bellek erişiminin geçerli olması için işaretçi ve bellek etiketlerinin eşleşmesi gerekir. HWASan, işaretçi etiketi adresin en yüksek bitlerinde depolamak için sanal adres etiketleme olarak da adlandırılan ARMv8 özelliği üst bayt yoksaymayı (TBI) kullanır.
HWASAN'ın tasarımı hakkında daha fazla bilgiyi Clang doküman sitesinde bulabilirsiniz.
HWASan, taşmayı 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şmanın ne kadar büyük olduğu veya belleğin ne kadar süre önce tahsis edildiği fark etmeksizin bir hatayı algılayabilir. Bu, HWASan'a ASan'a kıyasla büyük bir avantaj sağlar.
Ancak HWASan'ın sınırlı sayıda olası etiket değeri (256) vardır.Bu, programın tek bir çalıştırması sırasında herhangi bir hatayı kaçırma olasılığının% 0,4 olduğu anlamına gelir.
Şartlar
Ortak Android çekirdeğinin en son sürümleri (4.14 ve üzeri), HWAS'ı kutudan çıktığı anda destekler. Android 10'a özel şubelerde 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şkenlerinde etiketlenmiş işaretçileri kabul etmesini gerektirir. Bu özellik için destek aşağıdaki yayın öncesi yama paketlerinde uygulanmıştır:
- arm64 etiketli adres ABI
- arm64: Çekirdeğe iletilen kullanıcı işaretçilerinin etiketini kaldır
- mm: brk()/mmap()/mremap() içinde sanal adres takma adları oluşturmaktan kaçının
- arm64: Çekirdek iş parçacıklarından çağrılan access_ok() işlevinde etiketli adresleri doğrulama
Özel bir araç zinciriyle derliyorsanız LLVM kaydına c336557f kadar her şeyi içerdiğinden emin olun.
HWASan'ı kullanma
Platformun tamamını HWASan'ı kullanarak 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 SANITIZE_TARGET ayarını bir ürün tanımına aosp_coral_hwasan'a benzer şekilde ekleyebilirsiniz.
AddressSanitizer'ı bilen kullanıcılar için derleme işleminin karmaşıklığı büyük ölçüde ortadan kalktı:
- make komutunu iki kez çalıştırmanız gerekmez.
- 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ık temizlenirse ona bağlantı veren tüm yürütülebilir dosyaların da temizlenmesi gerekmez.
HWASan ile aynı (veya daha yüksek) derleme numarasındaki normal görüntüler arasında ücretsiz geçiş 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) dosyasını kullanın.
Ayrı hedefleri temizleyin
libc.so
de temizlendiği sürece HWASan, normal (temizlemeden geçirilmemiş) bir derlemede hedef başına etkinleştirilebilir. bionic/libc/Android.bp dosyasında "libc_defaults"
içindeki "libc_defaults"
blokuna hwaddress: true
ekleyin. Ardından, aynı işlemi üzerinde çalıştığınız hedefte yapın.
libc'yi temizlemenin, sistem genelinde yığın bellek ayırmalarının etiketlenmesini ve libc.so
içindeki bellek işlemlerine ait etiketlerin kontrol edilmesini sağladığını unutmayın. Bu, kötü bellek erişimi libc.so
içindeyse (ör. pthread_mutex_unlock()
üzerinde delete()
ed mutex).
Platformun tamamı HWASan kullanılarak derlenmişse derleme dosyalarında değişiklik yapmanız gerekmez.
Flash İstasyonu
Geliştirme amacıyla, Flashstation'ı kullanarak AOSP'nin HWASan özellikli bir derlemesini, bootloader'ı kilidi açık bir Pixel cihaza yükleyebilirsiniz. _hwasan hedefini seçin (ör. aosp_flame_hwasan-userdebug). Daha fazla bilgi için uygulama geliştiricilere yönelik HWASan NDK belgelerine bakın.
Daha iyi yığın izlemeler
HWASan, programdaki her bellek ayırma ve bellek ayırma etkinliği için bir yığın izleme kaydetmek amacıyla hızlı, çerçeve işaretçisine dayalı bir çözücü kullanır. Android, AArch64 kodunda çerçeve işaretçilerini varsayılan olarak etkinleştirdiğinden pratikte ideal bir yöntemdir. Yönetilen kodda geri sarma yapmanız gerekiyorsa HWASAN_OPTIONS=fast_unwind_on_malloc=0
değerini işlem ortamında ayarlayın. Hatalı bellek erişimi yığın izlemelerinin varsayılan olarak "yavaş" çözücü kullandığını unutmayın. Bu ayar yalnızca ayırma ve ayırma sonlandırma izlemelerini etkiler. Bu seçenek, yüke bağlı olarak çok yoğun CPU kullanımı gerektirebilir.
Simgeleştirme
"HWASan raporlarını anlama" bölümündeki Sembolleştirme bölümüne bakın.
Uygulamalarda HWASan
AddressSanitizer'a benzer şekilde HWASan, Java kodunu göremez ancak JNI kitaplıklarındaki hataları algılayabilir. Android 14'e kadar, HWASan olmayan bir cihazda HWASan uygulamalarının çalıştırılması desteklenmezdi.
HWASan cihazlarda, uygulamaların kodları Make'te SANITIZE_TARGET:=hwaddress
veya derleyici işaretlerinde -fsanitize=hwaddress
ile derlenerek HWASan ile kontrol edilebilir.
HWASan olmayan bir cihazda (Android 14 veya daha yeni bir sürüm yüklü) wrap.sh dosya ayarı eklenmelidir.
LD_HWASAN=1
Daha fazla bilgi için uygulama geliştirici belgelerine bakın.