Scudo

Scudo (örneğin yığın ilgili açıkları karşı dirençli olacak şekilde tasarlanmış bir dinamik kullanıcı modu bellek ayırıcısı veya yığın ayırıcısı, bir bellek tabanlı bir tampon taşması , serbest sonra kullanıma ve çift serbest performansını korurken). Bu (örneğin standart C yerleştirme ve boşaltmaları ilkelleri içerir Malloc ve serbest), ve aynı zamanda (örneğin, yeni ve silme gibi) C ++ temel öğeleri.

Scudo daha bir tam anlamıyla bir bellek hatası detektörü daha azaltılması ait AddressSanitizer (Aşan) .

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 yılında ayarlayarak başına ikili bazda etkin olması gerekiyordu Scudo LOCAL_SANITIZE := scudo .mk dosya veya seçeneği sanitize: { scudo: true, } .bp dosyasında.

Scudo olan açık kaynak ve LLVM en derleyici-rt projenin parçası. Belgeler mevcuttur https://llvm.org/docs/ScudoHardenedAllocator.html . Android toolchain parçası ve destek olarak Scudo çalışma zamanı gemileri eklendi Soong ve Make kolay bir ikilik sistemde ayırıcı etkinleştirilmesi için izin vermek.

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: Bir tanımlayın __scudo_default_options ayrıştırılmasına seçenekleri dize döndürür programda çalışır. Bu işlev aşağıdaki prototip olması gerekir: extern "C" const char *__scudo_default_options() .
  • Dinamik: değişken ortamı kullanın SCUDO_OPTIONS seçenekleri dizesi içeren ayrıştırılmasına. Bu şekilde tanımlanan Seçenekler aracılığıyla yapılan herhangi bir tanımını geçersiz __scudo_default_options .

Aşağıdaki seçenekler mevcuttur.

Seçenek 64 bit varsayılan 32 bit varsayılan Açıklama
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 bu ayarlama ThreadLocalQuarantineSizeKb sıfır devre dışı bırakır tamamen karantina için.
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 bu ayarlama QuarantineSizeKb sıfır devre dışı bırakır tamamen karantina için.
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 bu sınıra ulaştığında, diğer atamaları başarısız veya dönüş null (değerine bağlı allocator_may_return_null RSS yeni tahsisleri için izin vermek geri iner kadar).
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 Seti değilse, araç çağrılar abort() yerine _exit() hata mesajı yazdırmadan sonra.

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 ile başlar Scudo ERROR: Herhangi işaretçiler ile birlikte sorunun kısa özeti izler.

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

  • corrupted chunk header : öbek başlığının sağlama doğrulaması başarısız oldu. Bunun nedeni muhtemelen 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ık işlemek çalışıyorsunuz. Bu, genellikle bir yarış koşulunun veya o yığın üzerinde işlemler gerçekleştirirken genel kilitleme eksikliğinin belirtisidir.
  • invalid chunk state : bunu boşaltmak için çalışırken yığın verilen bir operasyon için beklenen durumda değil, örneğin, tahsis değil, ya da geri dönüşüm için çalışırken, karantinaya değil. Bu hatanın tipik nedeni çift serbesttir.
  • misaligned pointer : Temel hizalama şartlarının güçlü 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 adında bir miktarda kaldırma işlevi yeniden tahsis etmek için çağrıldı fonksiyonun türüne uygun zorundadır. Bu tür bir uyumsuzluk, güvenlik sorunlarına neden olabilir.
  • invalid sized delete : C ++ 14 boy delete operatörü kullanılır ve isteğe bağlı onay etkinleştirildiğinde, bir parça ayırmayı kaldırma sırasında geçirildi boyutu ve bunu tahsis ederken istendi boyutu arasında bir uyumsuzluk var. Bu tipik bir derleyici sorunu veya bir olduğu tip karışıklık nesne üzerinde ayırmanın.
  • RSS limit exhausted : isteğe belirtilen maksimum RSS aşıldı.

Eğer OS kendisinde bir kilitlenme hata ayıklama ediyorsanız, bir kullanabilirsiniz Hwasan OS yapı . Bir uygulama bir kilitlenme hata ayıklama ediyorsanız, bir kullanmak mümkündür Hwasan uygulaması yapı da.