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) bir bellek hatasıdır algılama aracını kullanarak Adres Temizleyici. HWASan ASan'a kıyasla çok daha az RAM kullanır ve bu nedenle bir çözüm olabilir. HWASan, yalnızca Android 10'da kullanılabilir yalnızca AArch64 donanımında kullanılabilir.
Özellikle C/C++ kodu için yararlı olsa da HWASan, soruna neden olan Java kodunda hata ayıklamaya da Java arayüzlerini uygulamak için kullanılan C/C++'ta kilitlenmeler. Faydalı, anıyı yakalıyor göstererek sizi doğrudan sorumlu koda yönlendirmenizi sağlar.
Önceden oluşturulmuş HWASan resimlerini desteklenen Pixel cihazlara ci.android.com (ayrıntılı kurulum talimatları).
Klasik ASan'a kıyasla HWASan:
- Benzer CPU ek 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 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, 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. Anılar için erişim geçerliyse 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
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 çekirdek kullanı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 destek aşağıdaki yayın öncesi yama paketlerinde 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ç setiyle 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ğ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 karmaşıklığının büyük bir kısmı ortadan kalktı:
- Yapma işlemini iki kez çalıştırmaya gerek yoktur.
- 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ığın arındırılmış olması durumunda, bu kitaplığın bağlantısını veren yürütülebilir öğelerin de kullanılması şart değildir.
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).
Ayrı hedefleri temizleyin
HWASan, normal (düzenlenmemiş) bir derlemede hedef başına etkinleştirilebilir (libc.so
aynı zamanda olduğu sürece)
arındırılmış bir hale geldi. "libc_defaults"
içindeki arındırma blokuna hwaddress: true
ekleyin
bionic/libc/Android.bp biçimindedir. 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ş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.
Flash İstasyonu
Geliştirme amacıyla, HWASan etkin AOSP derlemesini Pixel cihaza yükleyebilirsiniz. Flashstation kullanarak kilidi açılmış bootloader'ı kullanın. _hwasan hedefini seçin, ör. aosp_flame_hwasan-userdebug. Bkz. HWASan için NDK belgeleri inceleyebilirsiniz.
Daha iyi yığın izlemeler
HWASan, yığın kaydetmek için hızlı, kare işaretçisine dayalı bir açıcı kullanır
her bellek ayırma ve dağıtım etkinliği için
çok önemli. 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ı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 çalıştıran HWASan olmayan cihazdaki uygulamalar desteklenmiyordu.
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.