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

Android, bellek hatalarını ayıklamak için birden fazla aracı destekler. Her birinin artıları olduğundan kullanım alanınız için hangisinin en iyi olduğuna karar vermek üzere aşağıdakileri okuyun. Bu belgede, kullanabileceğiniz araçlarla ilgili genel bilgiler verilmektedir. Böylece, hangi araçla ilgili daha ayrıntılı araştırma yapacağınıza karar verebilirsiniz. Ancak özünde anlatılması amaçlandığından, ayrıntılar için araca özel belgeleri de okuyabilirsiniz.

tl;dr

  • Bellek hatalarını önlemek için mümkün olduğunda bellekte 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ı algılamak için her zaman GWP-ASan kullanın
  • Test sırasında bellek hatalarını algılamak için HWASan kullanma
  • MTE özellikli cihazlar genellikle 2023'te kullanıma sunulmamıştır, ancak üretimde hataları tespit edebiliyorsanız bu özelliği kullanın
  • ASan'ı yalnızca son çare olarak test sırasında kullanın

Bellek açısından güvenli diller

Bellek hatalarını tamamen önlemenin ve azaltmanın tek yolu bellekte güvenli bir dildir. Bu sayfadaki diğer araçlar, belleğinizi güvenli olmayan kod daha güvenli ve daha güvenilir hale getirmenize yardımcı olabilir. Ancak bellek açısından güvenli bir dil kullanmak tüm sorun sınıfını ortadan kaldırır.

Android tarafından resmi olarak desteklenen, bellek açısından güvenli diller Java ve Kotlin'dir. Bu dillerden birinde çoğu Android uygulamasını geliştirmek daha kolaydır.

Bununla birlikte, Rust'ta yazılmış uygulama geliştiriciler gönderim kodu vardır ve bu sayfayı okuyorsanız muhtemelen yerel koda (taşınabilirlik, performans veya her ikisi) ihtiyaç duymanız için geçerli bir neden vardır. Rust, Android'de bellekte güvenli yerel kod için en iyi seçimdir. NDK Ekibi, bu yolu kullandığınızda karşınıza çıkabilecek sorunlar konusunda size yardımcı olamayacak olsa da bunları öğrenmek isteriz.

PAC/BTI

PAC/BTI olarak da bilinen İşaretçi Kimlik Doğrulaması ve Dal Hedef Tanımlama, üretimde kullanılmaya uygun risk azaltma araçlarıdır. Ayrı teknolojiler olsa da aynı derleyici işaretiyle kontrol edildiği için her zaman birlikte kullanılırlar.

Eski cihazlarda yeni talimatlar işlemsiz olduğundan, bu özellikler bunları desteklemeyen cihazlarla geriye dönük uyumludur. Yeterince yeni bir çekirdeğe ve yeterli sayıda işletim sistemi sürümüne sahip olmak da gereklidir. /proc/cpuinfo bölgesinde paca ve bti aratıldığında, yeterli miktarda yeni donanıma ve yeterince yeni bir çekirdeğe sahip olup olmadığınız gösterilir. 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 destekleyen bir cihaz/çekirdek/işletim sistemi kombinasyonunda test ettiğinizden emin olun!)

Eksileri:

  • Yalnızca 64 bit uygulamalarda kullanılabilir
  • Destekleyen cihazlarda hataları azaltmaz
  • %1 kod boyutu ek yükü

GWP - Asana

GWP-ASan alandaki bellek hatalarını algılamak için kullanılabilir ancak örnekleme hızı, etkili bir çözüm olamayacak kadar düşük.

Artıları:

  • Önemli CPU veya bellek ek yükü yok
  • Dağıtım için önemsiz: 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ının olmasını 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 seçenektir. En çok, otomatik test ile kullanıldığında, özellikle de fuzz testleri gerçekleştiriyorsanız yararlıdır. Ancak, uygulamanızın performans ihtiyaçlarına bağlı olarak, test sürümü ortamında ileri teknoloji telefonlarda da kullanılabilir.

Artıları:

  • Yanlış pozitif yok
  • ASan'ın yapamayacağı ek hata sınıflarını algılar (döndükten sonra yığın kullanımı)
  • MTE'ye kıyasla yanlış negatiflerde daha düşük oran (256'da 1'e 16'ya 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 uyumlu bir görüntünün yüklenmesi gerekir
  • Yalnızca 64 bit uygulamalarda çalışır

MTE

Bellek etiketleme uzantısı (MTE olarak da bilinir), 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 edecek donanıma sahipseniz bunu etkinleştirmeniz gerekir.

Artıları:

  • Birçok uygulama için üretimde tolere edilebilecek kadar ek yükü düşük
  • Yanlış pozitif yok
  • Yığın hatalarını algılamak için yeniden kod oluşturmaz (ancak yığın hatalarını tespit eder)

Eksileri:

  • 2024'te MTE'nin varsayılan olarak etkin olduğu, ticari olarak satılan herhangi bir 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.
  • Yanlış negatif oranı: 16/16, HWASan'ın 256'da 1'i
  • Yalnızca 64 bit uygulamalarda kullanılabilir
  • Hem MTE özellikli hem de MTE olmayan cihazları hedeflemek için ayrı kitaplıklar oluşturmayı gerektirir.

ASan

ASan olarak da bilinen adres temizleyici, mevcut araçların en eski ve en yaygın olarak kullanılanıdır. Test ve hata ayıklama sırasında, yalnızca diğer araçların kullanılamadığı eski cihazları etkileyen bellek hatalarını yakalamak için yararlıdır. Mümkünse HWASan'ı tercih edin.

Artıları:

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

Eksileri:

  • Düzgün ş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 olan bilinen hatalar var