Scudo, performansını korurken yığınla ilgili güvenlik açıklarına (ör. yığın tabanlı arabellek taşması, boşaltıldıktan sonra kullanım ve çift boşaltma) 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 ayırma ve serbest bırakma temel öğelerini (ör. malloc ve free) ve C++ temel öğelerini (ör. new ve delete) sağlar.
Scudo, AddressSanitizer (ASan) gibi tam teşekküllü bir bellek hatası algılayıcıdan ziyade bir azaltma aracıdır.
Android 11'in yayınlanmasından bu yana, tüm yerel kodlar için scudo kullanılır (düşük bellekli cihazlar hariç. Bu cihazlarda jemalloc kullanılmaya devam eder). Çalışma zamanında, tüm yerel yığın ayırma 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. Yığında bozulma veya şüpheli davranış tespit edilirse işlem durdurulur.
Scudo, açık kaynaklıdır ve LLVM'nin compiler-rt projesinin bir parçasıdır. Belgeleri https://llvm.org/docs/ScudoHardenedAllocator.html adresinde bulabilirsiniz. Scudo çalışma zamanı, Android araç zincirinin bir parçası olarak gönderilir ve ikili dosyada ayırıcının kolayca etkinleştirilmesine olanak tanımak için Soong ve Make'e destek eklenmiştir.
Aşağıda açıklanan seçenekleri kullanarak, tahsis edicide ek azaltma özelliğini etkinleştirebilir veya devre dışı bırakabilirsiniz.
Özelleştirme
Ayırıcının bazı parametreleri, çeşitli yöntemlerle işlem 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şlevin şu prototipi 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 kullanılabilir.
Option | Varsayılan olarak 64 bit | Varsayılan 32 bit | Açıklama |
---|---|---|---|
QuarantineSizeKb |
256 |
64 |
Parçaların gerçek ayırmasını geciktirmek için kullanılan karantina boyutu (KB cinsinden). Daha düşük bir değer, bellek kullanımını azaltabilir ancak azaltma işleminin etkinliğini düşürebilir. Negatif bir değer, varsayılan değerlere geri döner. Hem bu ayarın hem de ThreadLocalQuarantineSizeKb ayarının sıfıra ayarlanması, karantinayı tamamen devre dışı bırakır. |
QuarantineChunksUpToSize |
2048 |
512 |
Parçaların karantinaya alınabileceği maksimum 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 ayarı hem de QuarantineSizeKb ayarını sıfıra ayarlamak karantinayı tamamen devre dışı bırakır. |
DeallocationTypeMismatch |
false |
false |
malloc/delete, new/free, new/delete[] üzerinde hata raporlamayı etkinleştirir. |
DeleteSizeMismatch |
true |
true |
Yeni ve silinen öğelerin boyutları arasındaki uyuşmazlıklarla ilgili hata raporlamasını etkinleştirir. |
ZeroContents |
false |
false |
Ayırma ve ayırmayı kaldırma işlemlerinde sıfır yığın içeriğini etkinleştirir. |
allocator_may_return_null |
false |
false |
Ayırıcının, işlemi sonlandırmak yerine kurtarılabilir bir hata oluştuğunda null döndürebileceğini belirtir. |
hard_rss_limit_mb |
0 |
0 |
İşlemin RSS'si bu sınıra ulaştığında işlem sonlandırılır. |
soft_rss_limit_mb |
0 |
0 |
İşlemin RSS'si bu sınıra ulaştığında, RSS yeni tahsislere izin verecek şekilde tekrar düşene kadar daha fazla tahsis başarısız olur veya null döndürülür (allocator_may_return_null değerine bağlı olarak). |
allocator_release_to_os_interval_ms |
5000 |
Yok | Yalnızca 64 bitlik bir ayırıcıyı etkiler. Ayarlanırsa kullanılmayan belleği işletim sistemine bırakmaya çalışır ancak bu aralıktan (milisaniye cinsinden) daha sık yapmaz. 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() işlevini çağırır. |
Doğrulama
Şu anda Scudo için özel olarak tasarlanmış CTS testleri yoktur. Bunun yerine, CTS testlerinin, cihazı etkilemediğini doğrulamak için belirli bir ikili programda Scudo etkinleştirilmiş veya devre dışı bırakılmış halde geçmesini sağlayın.
Sorun giderme
Kurtarılamayan bir sorun algılanırsa ayırıcı, standart hata tanımlayıcısına bir hata mesajı gösterir ve ardından işlemi sonlandırır.
Sonlandırmaya yol açan yığın izlemeleri, sistem günlüğüne eklenir.
Çıkış genellikle Scudo ERROR:
ile başlar ve ardından sorunun kısa bir özeti ile ipuçları yer alır.
Mevcut hata mesajlarının ve olası nedenlerinin listesini aşağıda bulabilirsiniz:
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ık (kısmen veya tamamen) üzerine yazılmıştır ya da işleve iletilen işaretçi bir parça değildir.race on chunk header
: İki farklı ileti dizisi aynı anda aynı başlığı değiştirmeye çalışıyor. Bu durum genellikle bir yarış durumu veya bu parçada işlemler gerçekleştirilirken genel bir 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ışıldığında ayrılmamış veya geri dönüştürülmeye çalışıldığında karantinaya alınmamış. Bu hatanın tipik nedeni çift boşaltmadır.misaligned pointer
: Temel hizalama gereksinimleri sıkı bir şekilde uygulanır: 32 bit platformlarda 8 bayt, 64 bit platformlarda 16 bayt. İşlevlerimize iletilen bir işaretçi bunlara uymuyorsa işlevlerden birine iletilen işaretçi hizalanmamış demektir.allocation type mismatch
: Bu seçenek etkinleştirildiğinde, bir parça üzerinde çağrılan serbest bırakma işlevinin, onu ayırmak için çağrılan işlevin türüyle eşleşmesi gerekir. Bu tür bir uyuşmazlık, güvenlik sorunlarına yol açabilir.invalid sized delete
: C++14 boyutlu silme operatörü kullanıldığında ve isteğe bağlı kontrol etkinleştirildiğinde, bir parçanın serbest bırakılması sırasında iletilen boyut ile ayrılması sırasında istenen boyut arasında uyuşmazlık oluşur. Bu genellikle bir derleyici sorunu veya serbest bırakılan nesnede tür karışıklığıdır.RSS limit exhausted
: İsteğe bağlı olarak belirtilen maksimum RSS değeri aşıldı.
İşletim sisteminin kendisindeki bir kilitlenmede hata ayıklıyorsanız HWASan OS derlemesi kullanabilirsiniz. Bir uygulamadaki kilitlenmeyle ilgili hata ayıklama yapıyorsanız HWASan uygulama derlemesi de kullanabilirsiniz.