İstenmeyen tamsayı taşmaları, bellek erişimleri veya bellek ayırmalarıyla ilişkili değişkenlerde bellek bozulmasına veya bilginin açığa çıkmasına neden olabilir. Bununla mücadele etmek için, Android 7.0'daki medya çerçevesini güçlendirmek için Clang'ın UndefinedBehaviorSanitizer (UBSan) imzalı ve imzasız tamsayı taşma temizleyicileri ekledik. Android 9'da, UBSan'ı daha fazla bileşeni kapsayacak ve bunun için geliştirilmiş derleme sistemi desteğini kapsayacak şekilde genişlettik .
Bu, bir taşma meydana gelirse bir işlemi güvenli bir şekilde iptal etmek için aritmetik işlemler / talimatlar etrafına - taşabilecek - kontroller eklemek için tasarlanmıştır. Bu dezenfektanlar, temel nedenin orijinal Stagefright güvenlik açığı gibi bir tamsayı taşması olduğu durumlarda tüm bellek bozulması ve bilgi ifşa güvenlik açıklarını azaltabilir.
Örnekler ve kaynak
Integer Overflow Sanitization (IntSan) derleyici tarafından sağlanır ve aritmetik taşmaları tespit etmek için derleme süresi boyunca ikiliye enstrümantasyon ekler. Platform genelinde çeşitli bileşenlerde varsayılan olarak etkindir, örneğin /platform/external/libnl/Android.bp
.
Uygulama
IntSan, UBSan'ın imzalı ve işaretsiz tamsayı taşma temizleyicilerini 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ı Temizlemesini etkinleştirmenizi şiddetle tavsiye ederiz. İdeal adaylar, ayrıcalıklı yerel kod veya güvenilmeyen kullanıcı girişini ayrıştıran yerel koddur. Kodun kullanımına ve aritmetik işlemlerin yaygınlığına bağlı olarak dezenfektanla ilişkili küçük bir performans ek yükü vardır. Küçük bir genel gider yüzdesi bekleyin ve performansın önemli olup olmadığını test edin.
Makefiles içinde IntSan desteği
Makefile'da IntSan'ı 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ış dezenfektan listesini alır veinteger_overflow
, varsayılan bir kara listeye sahip ayrı imzalı ve işaretsiz tamsayı taşma dezenfektanları için önceden paketlenmiş bir seçenekler kümesidir. -
LOCAL_SANITIZE_DIAG
, dezenfektanlar için teşhis modunuLOCAL_SANITIZE_DIAG
. Teşhis modunu yalnızca test sırasında kullanın, çünkü bu, taşma durumlarında iptal olmayacak 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ı belirlemenizi sağlar. Ek ayrıntılar için Sorun Giderme bölümüne bakın.
Daha ayrıntılı kontrol istiyorsanız, dezenfektanları işaretlerden birini veya her ikisini kullanarak ayrı ayrı etkinleştirin:
LOCAL_SANITIZE := signed-integer-overflow, unsigned-integer-overflow LOCAL_SANITIZE_DIAG := signed-integer-overflow, unsigned-integer-overflow
Blueprint dosyalarında IntSan'ı destekleme
/platform/external/libnl/Android.bp
gibi bir taslak dosyasında tamsayı taşma /platform/external/libnl/Android.bp
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 ayrı imzalı ve işaretsiz tamsayı taşma temizleyicileri için önceden paketlenmiş bir seçenekler kümesidir.
diag
özelliklerinin kümesi sanitizers için teşhis modu sağlar. Teşhis 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şmaları durdurmaz. 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 önlemesine 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şma temizliğini etkinleştiriyorsanız veya tamsayı taşma temizliğine sahip platform kitaplıklarına güveniyorsanız, iptallere neden olan zararsız tamsayı taşmalarıyla ilgili birkaç sorunla karşılaşabilirsiniz. İyi huylu taşmaların yüzeye çıkmasını sağlamak için bileşenleri temizleme etkinleştirilmiş olarak test etmelisiniz.
Kullanıcı derlemelerinde temizlemenin neden olduğu iptalleri bulmak için, SIGABRT
kilitlenmelerini, UBSan tarafından yakalanan bir taşmayı belirten Abort mesajlarıyla birlikte 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 iptal edilmeyecek ve bunun yerine çalışmaya devam edecektir. İptal etmemek, her bir hatayı düzelttikten sonra yeniden derlemeye gerek kalmadan belirli bir yürütme yolundaki zararsız taşma sayısını en üst düzeye çıkarmaya yardımcı olur. Teşhis, 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 belirlendikten sonra, taşmanın zararsız ve amaçlanmış olduğundan emin olun (örneğin, hiçbir güvenlik etkisinin olmaması). Dezenfektan iptalini şu şekilde ele alabilirsiniz:
- Taşmayı önlemek için kodu yeniden düzenleme ( örnek )
- Clang'ın __builtin _ * _ taşma işlevleri aracılığıyla açıkça taşma ( örnek )
-
no_sanitize
özniteliğini belirterekno_sanitize
dışı bırakma ( örnek ) - Kara liste dosyası aracılığıyla bir işlevin veya kaynak dosyanın temizliğinin devre dışı bırakılması ( örnek )
Mümkün olan en ayrıntılı çözümü kullanmalısınız. Örneğin, birçok aritmetik işlem ve tek bir taşma işlemi içeren büyük bir işlev, tüm işlevin kara listeye alınması yerine tek işlemin yeniden düzenlenmesini sağlamalıdır.
İyi huylu taşmalara neden olabilecek yaygın modeller şunları içerir:
- İşaretli bir türe dönüştürülmeden önce bir işaretsiz taşmanın meydana geldiği örtük yayınlar ( örnek )
- Silme sırasında döngü dizinini azaltan bağlantılı liste silme işlemleri ( örnek )
- Gerçek maksimum değeri belirtmek yerine işaretsiz bir türü -1'e atamak ( örnek )
- Koşulda 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 de zararsız olduğunu garanti etmeleri önerilir.
IntSan'ı devre dışı bırakma
Kara listeler veya işlev özellikleriyle IntSan'ı devre dışı bırakabilirsiniz. Yalnızca kodun yeniden düzenlenmesi başka şekilde mantıksız olduğunda veya sorunlu performans yükü varsa, tedbirli bir şekilde devre dışı bırakın.
İşlev öznitelikleri ve kara liste dosyası biçimlendirmesiyle IntSan'ı devre dışı bırakma hakkında daha fazla bilgi için yukarı akış Clang belgelerine bakın. Diğer dezenfektanları etkilemekten kaçınmak için hedef dezenfektanı belirterek bölüm adları kullanılarak kara listeye belirli bir dezenfektan dahil edilmelidir.
Doğrulama
Şu anda, Tamsayı Taşma Temizlemesi için özel olarak CTS testi bulunmamaktadır. Bunun yerine, cihazı etkilemediğini doğrulamak için CTS testlerinin IntSan etkinken veya olmadan geçtiğinden emin olun.