Android, bellek hatalarının ayıklanması için birden fazla aracı destekler. Her birinin avantajları ve dezavantajları vardır. Hangi seçeneğin kullanım alanınız için en uygun olduğuna karar vermek üzere aşağıdaki bilgileri inceleyin. Bu doküman, hangi araçları daha ayrıntılı inceleyeceğinize karar verebilmeniz için mevcut araçlara genel bir bakış sunar. Ancak bu doküman kısa olmayı amaçladığından ayrıntılar için araca özel dokümanları okuyun.
tl;dr
- Bellek hatalarını önlemek için mümkün olduğunda bellek açısından güvenli bir dil kullanın.
- ROP/JOP saldırılarını azaltmak için her zaman PAC/BTI kullanın.
- Üretimde nadir görülen bellek hatalarını tespit etmek için her zaman GWP-ASan'ı kullanın.
- Test sırasında bellek hatalarını tespit etmek için HWASan'ı kullanın.
- MTE, belirli cihazlarda seçenek olarak sunulur.
- Test sırasında ASan'ı yalnızca son çare olarak kullanın.
Bellek açısından güvenli diller
Bellek güvenli bir dil, bellek hatalarını tamamen önlemenin ve azaltmanın tek yoludur. Bu sayfadaki diğer araçlar, bellekle ilgili güvenli olmayan kodunuzu daha güvenli ve güvenilir hale getirmenize yardımcı olabilir ancak bellekle ilgili güvenli bir dil kullanmak bu tür sorunların tamamını ortadan kaldırır.
Android'de resmi olarak desteklenen, belleğe güvenli diller Java ve Kotlin'dir. Çoğu Android uygulamasının geliştirilmesi bu dillerden birinde daha kolaydır.
Bununla birlikte, Rust ile yazılmış kod gönderen uygulama geliştiriciler de vardır. Bu sayfayı okuyorsanız yerel koda ihtiyacınız olmasının (taşınabilirlik, performans veya her ikisi) iyi bir nedeni vardır. Rust, Android'de bellek açısından güvenli yerel kod için en iyi seçenektir. Bu yolu izlerseniz NDK ekibi karşılaştığınız sorunlar konusunda size yardımcı olamayabilir ancak bu sorunları öğrenmek isteriz.
PAC/BTI
PAC/BTI olarak da bilinen Pointer Authentication and Branch Target Identification, üretimde kullanıma uygun azaltma araçlarıdır. Ayrı teknolojiler olsalar da aynı derleyici işaretiyle kontrol edilirler ve bu nedenle her zaman birlikte kullanılırlar.
Bu özellikler, kullanılan yeni talimatlar önceki cihazlarda işlem yapmadığından, bu özellikleri desteklemeyen cihazlarla geriye dönük olarak uyumludur. Ayrıca, yeterince yeni bir çekirdeğe ve yeterince yeni bir işletim sistemi sürümüne sahip olmanız gerekir.
/proc/cpuinfo
içinde paca
ve bti
araması, yeterince yeni donanım ve yeterince yeni bir çekirdeğe sahip olup olmadığınızı gösterir. Android 12 (API 31) gerekli kullanıcı alanı desteğine sahiptir.
Artıları:
- Eski cihazlarda veya çekirdeklerde sorunlara neden olmadan tüm derlemelerde etkinleştirilebilir (ancak destekleyen bir cihaz/çekirdek/işletim sistemi kombinasyonunda gerçekten test ettiğinizden emin olun).
Eksileri:
- Yalnızca 64 bit uygulamalarda kullanılabilir.
- Desteklenmeyen cihazlardaki hataları azaltmaz.
- %1 kod boyutu ek yükü
GWP-Asan
GWP-ASan, sahada bellek hatalarını tespit etmek için kullanılabilir ancak örnekleme hızı, etkili bir azaltma yöntemi olmak için çok düşüktür.
Artıları:
- Önemli CPU veya bellek ek yükü yok
- Kolay dağıtım: Yerel kodun yeniden oluşturulmasını gerektirmez.
- 32 bit uygulamalarda çalışır
Eksileri:
- Düşük örnekleme oranı, hataları etkili bir şekilde bulmak için çok sayıda kullanıcı gerektirir.
- Yalnızca yığın hatalarını algılar, yığın hatalarını algılamaz.
HWASan
HWASan olarak da bilinen donanım adresi temizleyici, test sırasında bellek hatalarını yakalamak için en uygun yöntemdir. Bu özellik, özellikle fuzz testi yapıyorsanız otomatik testlerle birlikte kullanıldığında en iyi sonucu verir. Ancak uygulamanızın performans ihtiyaçlarına bağlı olarak, yüksek performanslı telefonlarda da kullanılabilir.
Artıları:
- Yanlış pozitif yok
- ASan'ın tespit edemediği ek hata sınıflarını (fonksiyondan döndükten sonra yığın kullanımı) algılar.
- MTE'ye kıyasla daha düşük yanlış negatif oranı (256'da 1'e karşı 16'da 1)
- En yakın alternatifi olan ASan'dan daha düşük bellek ek yükü
Eksileri:
- Önemli CPU (~%100), kod boyutu (~%50) ve bellek (%10-35) ek yükü
- API 34 ve NDK r26'ya kadar, HWASan ile uyumlu bir görüntünün yüklenmesi gerekir.
- Yalnızca 64 bit uygulamalarda çalışır.
MTE
MTE olarak da bilinen bellek etiketleme uzantısı, HWASan'a kıyasla daha düşük maliyetli bir alternatiftir. Hata ayıklama ve test özelliklerinin yanı sıra üretimde bellek bozulmasını tespit etmek ve azaltmak için de kullanılabilir. MTE derlemelerini test etmek için gerekli donanıma sahipseniz bu özelliği etkinleştirmeniz gerekir.
Artıları:
- Birçok uygulama için üretimde kabul edilebilir düzeyde düşük ek yük
- Yanlış pozitif yok
- Yığın hatalarını algılamak için kodu yeniden oluşturmayı gerektirmez (ancak yığın hatalarını algılamak için gerektirir).
Eksileri:
- 2024'te MTE'nin varsayılan olarak etkinleştirildiği ticari olarak satılan cihazlar bulunmamaktadır ancak Arm'ın belgelerinde Pixel 8/Pixel 8 Pro'da test için MTE'nin nasıl etkinleştirileceği açıklanmaktadır.
- HWASan'ın 256'da 1'ine kıyasla 16'da 1 yanlış negatif oranı
- Yalnızca 64 bit uygulamalarda kullanılabilir.
- Hem MTE'nin etkin olduğu hem de olmadığı cihazları hedeflemek için ayrı kitaplıklar oluşturulması gerekir.
ASan
ASan olarak da bilinen Address Sanitizer, mevcut araçlar arasında en eski ve en yaygın olanıdır. Test sırasında bellek hatalarını yakalamak ve diğer araçların kullanılamadığı yalnızca eski cihazları etkileyen sorunlarda hata ayıklamak için kullanışlıdır. Mümkün olduğunda HWASan'ı tercih edin.
Artıları:
- Yaygın olarak kullanılabilir. KitKat kadar eski cihazlarda çalışabilir.
- Doğru kullanıldığında yanlış pozitif veya negatif sonuç vermez.
Eksileri:
- Doğru şekilde oluşturmak ve paketlemek zordur.
- Tüm seçenekler arasında en yüksek ek yük: ~% 100 CPU, ~% 50 kod boyutu, ~% 100 bellek kullanımı
- Artık desteklenmiyor
- Düzeltilmeyecek bilinen hatalar içerir.