İstenmeyen tamsayı taşmaları, bellek erişimleri veya bellek tahsisleriyle ilişkili değişkenlerde bellek bozulmasına veya bilgilerin açığa çıkması güvenlik açıklarına neden olabilir. Bununla mücadele etmek için, Android 7.0'da medya çerçevesini sağlamlaştırmak için Clang'ın UndefinedBehaviorSanitizer (UBSan) imzalı ve imzasız tamsayı taşması temizleyicilerini ekledik. Android 9'da, UBSan'ı daha fazla bileşeni kapsayacak şekilde genişlettik ve bunun için geliştirilmiş yapı sistemi desteği sağladık.
Bu, bir taşma meydana gelirse bir işlemi güvenli bir şekilde iptal etmek için - taşabilecek - aritmetik işlemler / talimatlar etrafında kontroller eklemek için tasarlanmıştır. Bu temizleyiciler, asıl nedenin orijinal Stagefright güvenlik açığı gibi bir tamsayı taşması olduğu tüm bir bellek bozulması ve bilgi ifşası güvenlik açıkları sınıfını azaltabilir.
Örnekler ve kaynak
Tamsayı Taşması Temizleme (IntSan), derleyici tarafından sağlanır ve aritmetik taşmaları algılamak için derleme süresi sırasında ikili dosyaya enstrümantasyon ekler. Platform genelinde çeşitli bileşenlerde varsayılan olarak etkinleştirilmiştir, örneğin /platform/external/libnl/Android.bp
.
uygulama
IntSan, UBSan'ın imzalı ve imzasız tamsayı taşma dezenfektanlarını kullanır. Bu azaltma, modül başına düzeyde etkinleştirilir. Android'in kritik bileşenlerini güvende tutmaya yardımcı olur ve devre dışı bırakılmamalıdır.
Ek bileşenler için Tam Sayı Taşması Temizleme özelliğini etkinleştirmenizi şiddetle tavsiye ederiz. İdeal adaylar, güvenilmeyen kullanıcı girişini ayrıştıran ayrıcalıklı yerel kod veya yerel koddur. Dezenfektanla ilişkili, kodun kullanımına ve aritmetik işlemlerin yaygınlığına bağlı olarak küçük bir performans yükü vardır. Küçük bir genel gider yüzdesi bekleyin ve performansın bir endişe olup olmadığını test edin.
Makefiles'de IntSan'ı destekleme
IntSan'i bir makefile'de etkinleştirmek için şunu ekleyin:
LOCAL_SANITIZE := integer_overflow # Optional features LOCAL_SANITIZE_DIAG := integer_overflow LOCAL_SANITIZE_BLACKLIST := modulename_blacklist.txt
-
LOCAL_SANITIZE
, virgülle ayrılmış bir dezenfektan listesi alır;integer_overflow
, varsayılan bir kara listeye sahip bireysel imzalı ve imzasız tamsayı taşması temizleyicileri için önceden paketlenmiş bir seçenekler kümesidir. -
LOCAL_SANITIZE_DIAG
, dezenfektanlar için teşhis modunu açar. Tanılama modunu yalnızca test sırasında kullanın, çünkü bu, taşmalarda iptal edilmeyecek ve azaltmanın güvenlik avantajını tamamen ortadan kaldıracaktır. Ek ayrıntılar için Sorun Giderme bölümüne bakın. -
LOCAL_SANITIZE_BLACKLIST
, işlevlerin ve kaynak dosyaların sterilize edilmesini önlemek için bir kara liste dosyası belirlemenize olanak tanır. Ek ayrıntılar için Sorun Giderme bölümüne bakın.
Daha ayrıntılı kontrol istiyorsanız, bir veya iki bayrak kullanarak dezenfektanları ayrı ayrı etkinleştirin:
LOCAL_SANITIZE := signed-integer-overflow, unsigned-integer-overflow LOCAL_SANITIZE_DIAG := signed-integer-overflow, unsigned-integer-overflow
Plan dosyalarında IntSan'ı destekleme
/platform/external/libnl/Android.bp
gibi bir plan dosyasında tamsayı taşması temizlemeyi etkinleştirmek için şunu ekleyin:
sanitize: { integer_overflow: true, diag: { integer_overflow: true, }, blacklist: "modulename_blacklist.txt", },
make dosyalarında olduğu gibi, integer_overflow
özelliği, varsayılan bir kara listeye sahip bireysel imzalı ve imzasız tamsayı taşması temizleyicileri için önceden paketlenmiş bir seçenekler kümesidir.
diag
özellikleri seti, dezenfektanlar için tanılama modunu etkinleştirir. Tanılama modunu yalnızca test sırasında kullanın. Tanılama modu, kullanıcı yapılarındaki azaltmanın güvenlik avantajını tamamen ortadan kaldıran taşmalarda iptal etmez. Ek ayrıntılar için Sorun Giderme bölümüne bakın.
blacklist
özelliği, geliştiricilerin işlevlerin ve kaynak dosyaların sterilize edilmesini engellemesine olanak tanıyan bir kara liste dosyasının belirtilmesine olanak tanır. Ek ayrıntılar için Sorun Giderme bölümüne bakın.
Dezenfektanları ayrı ayrı etkinleştirmek için şunları kullanın:
sanitize: { misc_undefined: ["signed-integer-overflow", "unsigned-integer-overflow"], diag: { misc_undefined: ["signed-integer-overflow", "unsigned-integer-overflow",], }, blacklist: "modulename_blacklist.txt", },
Sorun giderme
Yeni bileşenlerde tamsayı taşması temizliğini etkinleştiriyorsanız veya tamsayı taşması temizliği olan platform kitaplıklarına güveniyorsanız, iyi huylu tamsayı taşmalarının iptallere neden olmasıyla ilgili birkaç sorunla karşılaşabilirsiniz. İyi huylu taşmaların ortaya çıkmasını sağlamak için bileşenleri temizleme özelliği etkinleştirilmiş olarak test etmelisiniz.
Kullanıcı yapılarında temizlemenin neden olduğu iptalleri bulmak için, UBSan tarafından yakalanan bir taşmayı belirten Abort mesajlarıyla SIGABRT
çökmelerini arayın, örneğin:
pid: ###, tid: ###, name: Binder:### >>> /system/bin/surfaceflinger <<< signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr -------- Abort message: 'ubsan: sub-overflow'
Yığın izleme, iptale neden olan işlevi içermelidir, ancak satır içi işlevlerde meydana gelen taşmalar yığın izlemede belirgin olmayabilir.
Temel nedeni daha kolay belirlemek için kitaplıkta iptali tetikleyen tanılamayı etkinleştirin ve hatayı yeniden oluşturmaya çalışın. Tanılama etkinleştirildiğinde, işlem durdurulmayacak ve bunun yerine çalışmaya devam edecektir. İptal etmemek, her bir hatayı düzelttikten sonra yeniden derlemek zorunda kalmadan belirli bir yürütme yolundaki iyi huylu taşmaların sayısını en üst düzeye çıkarmaya yardımcı olur. Tanılama, iptale neden olan satır numarasını ve kaynak dosyayı içeren bir hata mesajı üretir:
frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp:2188:32: runtime error: unsigned integer overflow: 0 - 1 cannot be represented in type 'size_t' (aka 'unsigned long')
Sorunlu aritmetik işlem bulunduğunda, taşmanın iyi huylu ve amaçlanmış olduğundan emin olun (örneğin, güvenlik etkileri yoktur). Dezenfektan iptalini şu şekilde yapabilirsiniz:
- Taşmayı önlemek için kodu yeniden düzenleme ( örnek )
- Clang'ın __builtin_*_overflow işlevleri aracılığıyla açıkça taşma ( örnek )
-
no_sanitize
özniteliğini belirterek işlevde temizlemeyi devre dışı bırakma ( örnek ) - Bir kara liste dosyası aracılığıyla bir işlevin veya kaynak dosyanın temizlenmesini devre dışı bırakma ( örnek )
Mümkün olan en ayrıntılı çözümü kullanmalısınız. Örneğin, birçok aritmetik işlem içeren büyük bir işlev ve tek bir taşma işlemi, tüm işlevi kara listeye almak yerine tek işlemi yeniden düzenlemelidir.
İyi huylu taşmalara neden olabilecek yaygın kalıplar şunları içerir:
- İmzalı bir türe dönüştürülmeden önce imzasız bir taşmanın meydana geldiği örtülü yayınlar ( örnek )
- Silme sırasında döngü indeksini azaltan bağlantılı liste silme işlemleri ( örnek )
- Gerçek maksimum değeri belirtmek yerine -1'e imzasız bir tür atama ( örnek )
- Koşuldaki işaretsiz bir tamsayıyı azaltan döngüler ( örnek , örnek )
Geliştiricilerin, dezenfektanın bir taşma tespit ettiği durumlarda, sanitizasyonu devre dışı bırakmadan önce, istenmeyen yan etkiler veya güvenlik etkileri olmaksızın gerçekten iyi huylu olduğunu garanti etmeleri önerilir.
IntSan'ı Devre Dışı Bırakma
IntSan'i kara listeler veya işlev öznitelikleri ile devre dışı bırakabilirsiniz. Dikkatli bir şekilde ve yalnızca kodu yeniden düzenlerken mantıksız olduğunda veya sorunlu bir performans yükü varsa devre dışı bırakın.
IntSan'i işlev öznitelikleri ve kara liste dosyası biçimlendirmesiyle devre dışı bırakma hakkında daha fazla bilgi için yukarı akış Clang belgelerine bakın. Kara listeye alma, diğer dezenfektanları etkilemekten kaçınmak için hedef dezenfektanı belirten bölüm adları kullanılarak belirli bir dezenfektana göre belirlenmelidir.
doğrulama
Şu anda, özellikle Tam Sayı Taşması Temizleme için bir CTS testi yoktur. Bunun yerine, cihazı etkilemediğini doğrulamak için CTS testlerinin IntSan etkin olsun veya olmasın geçtiğinden emin olun.