Scudo

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.

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

Scudo, AddressSanitizer (ASan) gibi tam teşekküllü bir bellek hatası dedektöründen daha fazla bir hafifletmedir.

Android 11 sürümünden itibaren, tüm yerel kodlar için scudo kullanılır (jemalloc'un hâlâ kullanıldığı düşük bellekli cihazlar hariç). Çalışma zamanında, tüm yerel yığın ayırmaları 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 sağlanır ve yığında bir bozulma veya şüpheli davranış algılanırsa işlem durdurulur.

Android 10'da, .mk dosyasında LOCAL_SANITIZE := scudo seçeneği veya .bp dosyasında sanitize: { scudo: true, } ayarlanarak scudo'nun ikili program bazında etkinleştirilmesi gerekiyordu.

Scudo açık kaynak kodludur ve LLVM'nin derleyici-rt projesinin bir parçasıdır. Belgeler https://llvm.org/docs/ScudoHardenedAllocator.html adresinde mevcuttur. 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'a 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, çeşitli yollarla süreç bazında tanımlanabilir:

  • Statik olarak: Ayrıştırılacak seçenekler dizesini döndüren programda bir __scudo_default_options işlevi tanımlayın. Bu işlev aşağıdaki prototipe sahip olmalıdır: 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 fiili olarak serbest bırakılmasını geciktirmek 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. Hem this hem de 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 karantinayı boşaltmak için iş parçacığı başına önbellek kullanımının boyutu (KB cinsinden). Daha düşük bir değer bellek kullanımını azaltabilir, ancak genel karantinadaki çekişmeyi artırabilir. Hem bunu hem de QuarantineSizeKb sıfıra ayarlamak, karantinayı tamamen devre dışı bırakır.
DeallocationTypeMismatch false false malloc/delete, yeni/ücretsiz, yeni/delete[] için hata raporlamayı etkinleştirir
DeleteSizeMismatch true true Yeni ve silme boyutları arasındaki uyumsuzlukta hata raporlamayı etkinleştirir.
ZeroContents false false Tahsis ve ayırmada sıfır yığın içeriği sağlar.
allocator_may_return_null false false Tahsis edicinin, kurtarılabilir bir hata oluştuğunda işlemi sonlandırmak yerine null döndürebileceğini belirtir.
hard_rss_limit_mb 0 0 İşlemin RSS'si bu sınıra ulaştığında işlem sona erer.
soft_rss_limit_mb 0 0 Sürecin RSS'si bu sınıra ulaştığında, RSS yeni ayırmalara izin vermek için geri dönene kadar, diğer ayırmalar 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 değil. Değer negatifse, bellek işletim sistemine serbest bırakılmaz.
abort_on_error true true Ayarlanırsa, hata mesajını yazdırdıktan sonra araç _exit() abort() 'u çağırır.

doğrulama

Şu anda, özellikle Scudo için herhangi bir CTS testi bulunmamaktadır. Bunun yerine, cihazı etkilemediğini doğrulamak için belirli bir ikili dosya için Scudo etkin olsun veya olmasın CTS testlerinin geçtiğinden emin olun.

Sorun giderme

Kurtarılamaz bir sorun algılanırsa, 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 izleri sistem günlüğüne eklenir. Çıktı genellikle Scudo ERROR: ardından herhangi bir işaretçiyle birlikte sorunun kısa bir özeti gelir.

İşte mevcut hata mesajlarının ve olası nedenlerinin bir listesi:

  • corrupted chunk header : Yığın başlığının sağlama toplamı doğrulaması başarısız oldu. Bunun nedeni büyük olasılıkla iki şeyden biri: başlığın üzerine yazılmış (kısmen veya tamamen) veya işleve iletilen işaretçi bir yığın değil.
  • race on chunk header : İki farklı iş parçacığı aynı anda aynı başlığı değiştirmeye çalışıyor. Bu, genellikle bir yarış koşulunun veya o yığın üzerinde işlemler gerçekleştirirken genel kilitleme eksikliğinin belirtisidir.
  • invalid chunk state : Öbek, belirli bir işlem için beklenen durumda değil; örneğin, serbest bırakmaya çalışırken tahsis edilmiyor veya geri dönüştürülmeye çalışılırken karantinaya alınmıyor. Bu hatanın tipik nedeni çift serbesttir.
  • misaligned pointer : Temel hizalama gereksinimleri güçlü bir şekilde uygulanır: 32 bit platformlarda 8 bayt ve 64 bit platformlarda 16 bayt. Fonksiyonlarımıza geçirilen bir işaretçi bunlara uymuyorsa, işlevlerden birine iletilen işaretçi uyumsuzdur.
  • allocation type mismatch : Bu seçenek etkinleştirildiğinde, bir yığın üzerinde çağrılan bir ayırma işlevinin, onu tahsis etmek için çağrılan işlevin türüyle 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 serbest bırakılırken geçirilen boyut ile tahsis edilirken istenen boyut arasında bir uyumsuzluk vardır. Bu genellikle bir derleyici sorunudur veya serbest bırakılan nesnede bir tür karışıklığıdır .
  • RSS limit exhausted : İsteğe bağlı olarak belirtilen maksimum RSS aşıldı.

İşletim sisteminin kendisinde bir çökme hatası ayıklıyorsanız, bir HWASan OS derlemesi kullanabilirsiniz. Bir uygulamada bir çökme hatası ayıklıyorsanız, bir HWASan uygulama derlemesi de kullanmak mümkündür.