Scudo

Scudo, performansı korurken yığınla ilgili güvenlik açıklarına ( yığın tabanlı arabellek taşması , boştan sonra kullanma ve çift boş gibi ) karşı dayanıklı olacak şekilde tasarlanmış dinamik bir kullanıcı modu bellek ayırıcısı veya yığın ayırıcısıdır. Standart C tahsisi ve serbest bırakma ilkellerinin ( malloc ve ücretsiz gibi) yanı sıra C++ ilkellerini (yeni ve silme gibi) sağlar.

Scudo , AdresSanitizer (ASan) gibi tam teşekküllü bir bellek hatası algılayıcısından ziyade bir hafifletme işlevi görür.

Android 11 sürümünden bu yana, tüm yerel kodlar için scudo kullanılmaktadır (jemalloc'un hala kullanıldığı düşük belleğe sahip cihazlar hariç). Çalışma zamanında, tüm yerel yığın tahsisleri ve serbest bırakma işlemleri, tüm yürütülebilir dosyalar ve bunların kitaplık bağımlılıkları için Scudo tarafından gerçekleştirilir ve yığında bir bozulma veya şüpheli davranış tespit edilirse süreç iptal edilir.

Scudo açık kaynaktır ve LLVM'nin derleyici-rt projesinin bir parçasıdır. Belgelere https://llvm.org/docs/ScudoHardenedAllocator.html adresinden ulaşılabilir. Scudo çalışma zamanı, Android araç zincirinin bir parçası olarak gönderilir ve ayırıcının bir ikili dosyada kolayca etkinleştirilmesini sağlamak için Soong ve Make'e destek eklendi.

Aşağıda açıklanan seçenekleri kullanarak ayırıcı içinde ekstra azaltmayı etkinleştirebilir veya devre dışı bırakabilirsiniz.

Özelleştirme

Ayırıcının bazı parametreleri işlem bazında çeşitli yollarla tanımlanabilir:

  • Statik olarak: Programda ayrıştırılacak seçenekler dizesini döndüren bir __scudo_default_options işlevi tanımlayın. Bu işlevin şu prototipe sahip olması gerekir: extern "C" const char *__scudo_default_options() .
  • Dinamik olarak: Ayrıştırılacak seçenekler dizesini içeren SCUDO_OPTIONS ortam değişkenini kullanın. Bu şekilde tanımlanan seçenekler, __scudo_default_options aracılığıyla yapılan tüm tanımları geçersiz kılar.

Aşağıdaki seçenekler mevcuttur.

Seçenek 64 bit varsayılan 32 bit varsayılan Tanım
QuarantineSizeKb 256 64 Parçaların gerçek dağıtımının ertelenmesi için kullanılan karantinanın boyutu (KB cinsinden). Daha düşük bir değer, bellek kullanımını azaltabilir ancak azaltmanın etkinliğini azaltabilir; negatif bir değer varsayılanlara geri döner. Bunu ve ThreadLocalQuarantineSizeKb sıfıra ayarlamak, karantinayı tamamen devre dışı bırakır.
QuarantineChunksUpToSize 2048 512 Parçaların karantinaya alınabileceği boyut (bayt cinsinden).
ThreadLocalQuarantineSizeKb 64 16 Genel karantinanın yükünü boşaltmak için kullanılan iş parçacığı başına önbelleğin boyutu (KB cinsinden). Daha düşük bir değer bellek kullanımını azaltabilir ancak genel karantinayla ilgili çekişmeyi artırabilir. Bunu ve QuarantineSizeKb sıfıra ayarlamak karantinayı tamamen devre dışı bırakır.
DeallocationTypeMismatch false false Malloc/delete, yeni/ücretsiz, yeni/delete[] ile ilgili hata raporlamayı etkinleştirir
DeleteSizeMismatch true true Yeni ve silme boyutları arasındaki uyumsuzluk konusunda hata raporlamayı etkinleştirir.
ZeroContents false false Tahsis ve serbest bırakmada sıfır parça içeriğini etkinleştirir.
allocator_may_return_null false false Ayırıcının, kurtarılabilir bir hata oluştuğunda işlemi sonlandırmak yerine null değerini döndürebileceğini belirtir.
hard_rss_limit_mb 0 0 Sürecin RSS'si bu sınıra ulaştığında süreç sonlandırılır.
soft_rss_limit_mb 0 0 Sürecin RSS'si bu sınıra ulaştığında, RSS yeni tahsislere izin verecek şekilde geri dönene kadar diğer tahsisler başarısız olur veya null değerini döndürür ( allocator_may_return_null değerine bağlı olarak).
allocator_release_to_os_interval_ms Yok 5000 Yalnızca 64 bit ayırıcıyı etkiler. Ayarlanırsa, kullanılmayan belleği işletim sistemine serbest bırakmaya çalışır, ancak bu aralıktan (milisaniye cinsinden) daha sık olmaz. Değer negatifse bellek işletim sistemine bırakılmaz.
abort_on_error true true Ayarlanırsa araç, hata mesajını yazdırdıktan sonra _exit() yerine abort() öğesini çağırır.

Doğrulama

Şu anda Scudo'ya özel bir CTS testi bulunmamaktadır. Bunun yerine, cihazı etkilemediğini doğrulamak için belirli bir ikili dosya için Scudo etkinken veya Scudo etkin değilken CTS testlerinin geçtiğinden emin olun.

Sorun giderme

Kurtarılamaz bir sorun tespit edilirse, ayırıcı standart hata tanımlayıcısına bir hata mesajı görüntüler ve ardından işlemi sonlandırır. Sonlandırmaya yol açan yığın izlemeleri sistem günlüğüne eklenir. Çıktı genellikle Scudo ERROR: ile başlar ve ardından herhangi bir işaretçiyle birlikte sorunun kısa bir özeti gelir.

Mevcut hata mesajlarının ve olası nedenlerinin bir listesi:

  • corrupted chunk header : Parça başlığının sağlama toplamı doğrulaması başarısız oldu. Bunun nedeni muhtemelen iki şeyden biridir: başlığın üzerine yazılmıştır (kısmen veya tamamen) veya işleve iletilen işaretçinin bir yığın olmaması.
  • race on chunk header : İki farklı iş parçacığı aynı anda aynı başlığı değiştirmeye çalışıyor. Bu genellikle o parça üzerinde işlemler gerçekleştirilirken bir yarış durumunun veya genel kilitleme eksikliğinin belirtisidir.
  • invalid chunk state : Parça, belirli bir işlem için beklenen durumda değil; örneğin, serbest bırakılmaya çalışılırken tahsis edilmemiş veya geri dönüştürülmeye çalışılırken karantinaya alınmamış. Bu hatanın tipik nedeni çift serbestliktir.
  • misaligned pointer : Temel hizalama gereksinimleri güçlü bir şekilde uygulanır: 32 bit platformlarda 8 bayt ve 64 bit platformlarda 16 bayt. Eğer fonksiyonlarımıza iletilen işaretçi bunlara uymuyorsa, işlevlerden birine iletilen işaretçinin hizası bozuk demektir.
  • allocation type mismatch : Bu seçenek etkinleştirildiğinde, bir yığın üzerinde çağrılan bir serbest bırakma fonksiyonunun, onu tahsis etmek için çağrılan fonksiyon tipiyle eşleşmesi gerekir. Bu tür bir uyumsuzluk güvenlik sorunlarına neden olabilir.
  • invalid sized delete : C++ 14 boyutlu silme operatörü kullanıldığında ve isteğe bağlı kontrol etkinleştirildiğinde, bir yığının tahsisi kaldırılırken iletilen boyut ile onu tahsis ederken istenen boyut arasında bir uyumsuzluk vardır. Bu genellikle bir derleyici sorunu veya serbest bırakılan nesneyle ilgili bir tür karışıklığıdır .
  • RSS limit exhausted : İsteğe bağlı olarak belirtilen maksimum RSS aşıldı.

İşletim sisteminin kendisindeki bir kilitlenmenin hatalarını ayıklıyorsanız HWASan İşletim Sistemi yapısını kullanabilirsiniz. Bir uygulamada bir kilitlenmenin hatalarını ayıklıyorsanız HWASan uygulama yapısını kullanmak da mümkündür.