Scudo, performansı korurken yığınla ilgili güvenlik açıklarına ( yığın tabanlı arabellek taşması , kullanımdan sonra kullanım ve çift boş 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ı algılayıcıdan çok 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: Programda, ayrıştırılacak seçenekler dizesini döndüren 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 olarak). 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 | İşlemin 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 bitlik 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, tahsisatçı 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 bu yığın üzerinde işlemler gerçekleştirirken genel kilitleme eksikliğinin belirtisidir. -
invalid chunk state
: Parça, 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.