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. 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++'de kilitlenmelere neden olan Java kodunda da hata ayıklamanıza yardımcı olabilir. Faydalı, anıyı yakalıyor göstererek sizi doğrudan sorumlu koda yönlendirmenizi sağlar.
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 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 yığın arabellek taşması/alt akışı
- Ücretsiz kullanımdan sonra yığın kullanımı
- Kapsam dışında yığın 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, 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. Bir bellek erişiminin geçerli olması için 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.
Bununla birlikte, HWASan'ın kullanabileceği 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 olmanız gerekir.
Şartlar
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 kullanılabilir.
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ı:
- arm64 etiketli adres ABI
- arm64: Çekirdeğe iletilen kullanıcı işaretçilerinin etiketini kaldırma
- 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şlevindeki etiketli adresleri doğrulama
Özel bir araç zinciri ile derliyorsanız LLVM kaydetme işlemine kadar her şeyi içerdiğinden emin olun. c336557f.
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ğ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 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 yüklemeniz gerekmez.
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.
Aynı (veya daha yüksek) derleme numarasına sahip HWASan ve normal resimler arasında geçiş yapılabilir. Cihazın silinmesi gerekmez.
Bir modülün temizlenmesini atlamak için şunu kullanın:
LOCAL_NOSANITIZE := hwaddress
(Android.mk) veya
sanitize: { hwaddress: false }
(Android.bp).
Tek tek 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 sanitize bloğuna hwaddress: true
ekleyin. Ardından, aynı işlemi üzerinde çalıştığınız hedefte yapın.
libc'nin temizlenmesi, hem sistem genelinde yığın bellek ayırmalarının hem de
libc.so
içindeki bellek işlemleri için etiketlerin kontrol ediliyor. Bu, kötü bellek erişimi libc.so
içindeyse (ör. pthread_mutex_unlock()
üzerinde delete()
ed bir mutex).
Tüm platform HWASan kullanılarak oluşturulmuşsa derleme dosyalarını değiştirmeniz 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). Bkz. HWASan için NDK belgeleri inceleyebilirsiniz.
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 kare işaretçilerini varsayılan olarak etkinleştirir.
Bu nedenle pratikte bu yöntem işe yarar. 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ı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
"HWASan raporlarını anlama" bölümündeki Sembolleştirme bölümüne 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 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.
Daha fazla bilgi için uygulama geliştirici belgelerine bakın.