Bellek hatası ayıklama ve çözüm

Android, bellek hatalarını ayıklamak için birden fazla aracı destekler. Her birinin avantajları ve dezavantajları vardır. Bu nedenle, kullanım alanınız için en uygun seçeneğe karar vermek üzere aşağıdakileri okuyun. Bu dokümanda, hangilerini daha ayrıntılı şekilde inceleyeceğinize karar verebilmeniz için mevcut araçlara genel bir bakış sunulmaktadır. Ancak doküman kısa tutulmaya çalışıldığı için ayrıntılı bilgi için araçlara özel dokümanları okuyun.

özet

  • Bellek hatalarını imkansız kılmak 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 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 özellikli cihazlar genel olarak kullanıma sunulmamıştır. Bu durum değişene kadar bu yöntem faydalı olmaz.
  • Test sırasında ASan'ı yalnızca son çare olarak kullanın

Hafızaya güvenli diller

Bellek hatalarını tamamen önlemenin ve azaltmanın tek yolu, bellek açısından güvenli bir dil kullanmaktır. Bu sayfadaki diğer araçlar, bellek güvenliği olmayan kodunuzu daha güvenli ve güvenilir hale getirmenize yardımcı olabilir ancak bellek güvenliği olan bir dil kullanmak bu tür sorunların tümünü ortadan kaldırır.

Android için resmi olarak desteklenen bellek güvenliğine sahip diller Java ve Kotlin'dir. Çoğu Android uygulamasının bu dillerden birinde geliştirilmesi daha kolaydır.

Bununla birlikte, Rust ile yazılmış kod yayınlayan uygulama geliştiriciler de vardır. Bu sayfayı okuyorsanız muhtemelen yerel koda (taşınabilirlik, performans veya her ikisi) ihtiyaç duymanız için iyi bir nedeniniz vardır. Rust, Android'de bellek açısından güvenli yerel kod için en iyi seçimdir. NDK ekibi, bu yolu seçerseniz karşılaştığınız sorunlar konusunda size yardımcı olamayacaktır ancak sorunlardan bahsetmenizi isteriz.

PAC/BTI

PAC/BTI olarak da bilinen İşaretçi Kimlik Doğrulaması ve Dal Hedefi Tanımlama, üretimde kullanıma uygun azaltma araçlarıdır. Ayrı teknolojiler olsalar da aynı derleyici işaretçisi tarafından kontrol edilirler ve her zaman birlikte kullanılırlar.

Kullanılan yeni talimatlar önceki cihazlarda işlem yapmadığı için bu özellikler, bunları desteklemeyen cihazlarla geriye dönük uyumludur. Ayrıca, yeterince yeni bir çekirdeğe ve işletim sisteminin yeterince yeni bir sürümüne sahip olmanız gerekir. /proc/cpuinfo dosyasında paca ve bti değerlerini aramak, donanımınızın ve çekirdeğinizin yeterince yeni olup olmadığını gösterir. Android 12 (API 31), gerekli kullanıcı alanı desteğine sahiptir.

Artıları:

  • Eski cihazlarda veya çekirdeklerde soruna neden olmadan tüm derlemelerde etkinleştirilebilir (ancak bunu desteklediğini bir cihaz/çekirdek/OS kombinasyonunda test ettiğinizden emin olun).

Eksileri:

  • Yalnızca 64 bit uygulamalarda kullanılabilir.
  • Bu özelliği desteklemeyen cihazlardaki hataları azaltmaz.
  • %1 kod boyutu ek yükü

GWP-Asan

GWP-ASan, alandaki bellek hatalarını tespit etmek için kullanılabilir ancak örnekleme hızı, etkili bir azaltma yöntemi olması için çok düşüktür.

Artıları:

  • Önemli bir CPU veya bellek yükü yok
  • Dağıtım kolaydır: Yerel kodun yeniden derlenmesi gerekmez.
  • 32 bit uygulamalarda çalışır

Eksileri:

  • Düşük örnekleme hızı, 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 de fuzz testleri çalıştırıyorsanız otomatik testle birlikte kullanıldığında en yararlı olur ancak uygulamanızın performans ihtiyaçlarına bağlı olarak, üst düzey telefonlarda da test amaçlı kullanılabilir.

Artıları:

  • Yanlış pozitif yok
  • ASan'ın algılayamadığı ek hata sınıflarını algılar (döndükten sonra yığın kullanımı)
  • MTE'ye kıyasla daha düşük yanlış negatif oranı (256'da 1'e kıyasla 16'da 1)
  • En yakın alternatifi olan ASan'dan daha düşük bellek yükü

Eksileri:

  • Önemli miktarda CPU (~%100), kod boyutu (~%50) ve bellek (%10 - %35) yükü
  • API 34 ve NDK r26'ya kadar HWASan uyumlu bir resmin yanıp sönmesi gerekir.
  • Yalnızca 64 bit uygulamalarda çalışır

MTE

MTE olarak da bilinen bellek etiketleme uzantısı, HWASan'a alternatif olarak daha düşük maliyetli bir seçenektir. Hata ayıklama ve test özelliklerinin yanı sıra üretimdeki bellek bozulmalarını tespit etmek ve azaltmak için de kullanılabilir. MTE derlemelerini test edecek donanıma sahipseniz bu özelliği etkinleştirmeniz gerekir.

Artıları:

  • Birçok uygulama için üretimde kabul edilebilir olacak kadar düşük ek maliyet
  • Yanlış pozitif yok
  • Yığın hatalarını algılamak için kodun yeniden derlenmesi gerekmez (ancak yığın hatalarını algılamak için gerekir).

Eksileri:

  • 2024'te MTE'nin varsayılan olarak etkin olduğu ticari olarak satılan cihaz yoktur ancak Arm'ın dokümanlarında Pixel 8/Pixel 8 Pro'da test için MTE'nin nasıl etkinleştirileceği açıklanmaktadır.
  • 16'da 1 yanlış negatif oranı (HWASAN'ın 256'da 1'e kıyasla)
  • Yalnızca 64 bit uygulamalarda kullanılabilir.
  • Hem MTE özellikli hem de MTE özellikli olmayan cihazları hedeflemek için ayrı kitaplıklar oluşturmayı gerektirir

ASan

ASan olarak da bilinen adres temizleyici, 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 hiçbirinin kullanılamadığı eski cihazları etkileyen sorunları gidermek için kullanışlıdır. Mümkün olduğunda HWASan'ı tercih edin.

Artıları:

  • Yaygın olarak bulunur. KitKat kadar eski cihazlarda çalışabilir
  • Doğru kullanıldığında yanlış pozitif veya negatif sonuç vermez.

Eksileri:

  • Doğru şekilde derlemek 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