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 ve yalnızca AArch64 donanımlarında kullanılabilir.
HWASan, öncelikle C/C++ kodu için yararlı olsa da Java arayüzlerini uygulamak için kullanılan C/C++'da kilitlenmelere neden olan Java kodunda da hata ayıklamanıza 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, desteklenen Pixel cihazlara ci.android.com adresinden yükleyebilirsiniz (ayrıntılı kurulum talimatları).
Klasik ASan'a kıyasla HWASan'da:
- 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/vahşi serbest
Ayrıca HWASan, dönüşten sonra yığın kullanımını algılar.
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. 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 ARMv8 özelliği olan üst bayt yoksayma (TBI) özelliğinden (sanal adres etiketleme olarak da bilinir) yararlanı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 kullanılabilir.
Farklı bir çekirdekle çalışıyorsanız HWASan, Linux çekirdeğinin sistem çağrısı bağımsız değişkenlerinde etiketli işaretçileri kabul etmesini gerektirir. Bu özellik için aşağıdaki yayın öncesi yama paketlerinde destek sağlanmış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 c336557f commit'ine kadarki tüm öğeleri 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 yapı oluşturma 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ırdır.
- Kullanıcı verilerini yüklemeniz gerekmez.
AddressSanitizer kısıtlamalarının bazıları da kaldırıldı:
- Statik yürütülebilir dosyalar desteklenir.
- libc dışındaki hedeflerin temizlenmesini atlayabilirsiniz. ASan'ın aksine, bir kitaplık temizlenirse ona bağlantı veren tüm yürütülebilir dosyaların da temizlenmesi gerekmez.
Aynı (veya daha yüksek) derleme numarasına sahip HWASan ile normal resimler arasında 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 temizleme
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, üzerinde çalıştığınız hedefte de aynı işlemi yapın.
libc'yi temizlemenin, sistem genelinde yığın bellek ayırmalarının etiketlenmesini ve libc.so
içindeki bellek işlemlerinin etiketlerinin kontrol edilmesini sağladığını unutmayın. Bu, kötü bellek erişimi libc.so
içindeyse (ör. pthread_mutex_unlock()
üzerinde delete()
ed bir mutex).
Platformun tamamı HWASan kullanılarak derlenmişse derleme dosyalarında değişiklik yapmanız gerekmez.
FlashStation
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ştirir. Bu nedenle, bu yöntem pratikte mükemmel bir şekilde çalışır. 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'ye bakın.
Uygulamalarda HWASan
AddressSanitizer'a benzer şekilde HWASan da Java kodunu göremez ancak JNI kitapları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.