UndefinedBehaviorSanitizer (UBSan), aşağıdakileri yapmak için derleme zamanı enstrümantasyonunu yapar: çeşitli davranış türlerini kontrol edebilirsiniz. UBSan organizasyonel algılama birçok tanımlanmamış davranış hataları gibi Android'in desteklediği özellikler:
- hiza
- Bool
- sınırlar
- numaralandırma
- kayan-yayın-taşıma
- sıfıra-bölme-kaydırma
- tamsayı-sıfıra-böl
- non-null özellik
- boş
- return
- Return-nonnull-özellik
- üst karakter-taban
- kayma-üs
- işaretli tam sayı taşması
- ulaşılamıyor
- imzasız-tamsayı-takma
- vla bağlı
teknik olarak tanımlanmamış halde, işaretsiz-tam sayı taşması dezenfektan kabına dahil edilir ve birçok Android modülünde gizli tamsayı taşmalarını ortadan kaldırmak için medya sunucusu bileşenleri dahil güvenlik açıkları.
Uygulama
Android derleme sisteminde UBSan'ı küresel veya yerel olarak etkinleştirebilirsiniz. Etkinleştirmek için UBSan global olarak, Android.mk'de SANITIZE_TARGET'ı ayarlayın. UBSan'ı tek bir her modül düzeyinde, LOCAL_SANITIZE değerine ayarlayın ve araması yapabilirsiniz. Örnek:
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_CFLAGS := -std=c11 -Wall -Werror -O0 LOCAL_SRC_FILES:= sanitizer-status.c LOCAL_MODULE:= sanitizer-status LOCAL_SANITIZE := alignment bounds null unreachable integer LOCAL_SANITIZE_DIAG := alignment bounds null unreachable integer include $(BUILD_EXECUTABLE)
Ve eşdeğer şema (Android.bp) yapılandırması:
cc_binary { cflags: [ "-std=c11", "-Wall", "-Werror", "-O0", ], srcs: ["sanitizer-status.c"], name: "sanitizer-status", sanitize: { misc_undefined: [ "alignment", "bounds", "null", "unreachable", "integer", ], diag: { misc_undefined: [ "alignment", "bounds", "null", "unreachable", "integer", ], }, }, }
UBSan kısayolları
Android'in iki kısayolu da vardır: integer
ve
default-ub
ile aynı anda bir dezenfektan seti etkinleştirin. Tam sayı
integer-divide-by-zero
özelliğini etkinleştirir,
signed-integer-overflow
ve unsigned-integer-overflow
.
default-ub
, minimum derleyici içeren denetimleri etkinleştirir
performans sorunları: bool, integer-divide-by-zero, return,
returns-nonnull-attribute, shift-exponent, unreachable and vla-bound
. İlgili içeriği oluşturmak için kullanılan
Tamsayı temizleyici sınıfı SANITIZE_TARGET ve LOCAL_SANITIZE ile kullanılabilir,
default-ub yalnızca SANITIZE_TARGET ile kullanılabilir.
Daha iyi hata raporlama
Android'in varsayılan UBSan uygulaması, tanımlanmamış davranışla karşılaşıldı. Varsayılan olarak bu işlev iptal edilmiştir. Ancak, Android'de UBSan, Ekim 2016'dan itibaren isteğe bağlı olarak şunları içeren bir çalışma zamanı kitaplığına sahiptir: tanımlanmamış davranış türü dahil olmak üzere daha ayrıntılı hata raporu sunar dosya ve kaynak kodu satır bilgilerini içerir. Bu hatayı etkinleştirmek için tamsayı kontrolleriyle raporlama, bir Android.mk dosyasına şunu ekleyin:
LOCAL_SANITIZE:=integer LOCAL_SANITIZE_DIAG:=integer
LOCAL_SANITIZE değeri, derleme sırasında temizleyiciyi etkinleştirir. LOCAL_SANITIZE_DIAG, belirtilen temizleyici için teşhis modunu açar. Evet LOCAL_SANITIZE ve LOCAL_SANITIZE_DIAG değişkenlerini farklı değerlere ayarlamak mümkündür, ancak yalnızca LOCAL_SANITIZE içindeki bu kontroller etkindir. Bir çek LOCAL_SANITIZE, ancak LOCAL_SANITIZE_DIAG içinde belirtilmiş, kontrol etkin değil ve teşhis mesajları verilmez.
UBSan çalışma zamanı kitaplığı tarafından sağlanan bilgilerin bir örneğini aşağıda bulabilirsiniz:
pixel-xl:/ # sanitizer-status ubsan sanitizer-status/sanitizer-status.c:53:6: runtime error: unsigned integer overflow: 18446744073709551615 + 1 cannot be represented in type 'size_t' (aka 'unsigned long')
Tam sayı taşma temizleme
İstenmeyen tam sayı taşmaları bellek bozulmasına veya bilgilerin bozulmasına neden olabilir veya bunlarla ilişkili değişkenlerdeki gizlilik açıklarını bellek ayırmaları. Bununla mücadele etmek için Clang's Tanımlanmamış Davranış Temizleyici (UBSan) imzalı ve imzasız tamsayılı dezenfektanların sağlamlaştırma medya çerçevesine göz atın. Android 9'da genişletilmiş UBSan'ın daha fazla bileşeni kapsamasını sağladı ve bunun için derleme sistemi desteğini iyileştirdi.
Bu, aritmetik kontroller eklemek için tasarlanmıştır emin olun. Bu sayede, operasyon taşma: Taşma olursa işlemi güvenli bir şekilde iptal etmek için. Bu temizleyiciler, bellek bozulmasının tüm sınıfını azaltabilir Temel nedenin bir tamsayı olduğu bilgi ifşa güvenlik açıkları güvenlik açığı gibi sorunlar yaşayabilirsiniz.
Örnekler ve kaynak
Tamsayı Taşma Temizliği (IntSan), derleyici tarafından sağlanır ve
aritmetik işlemleri tespit etmek için derleme süresinde ikili sisteme enstrümantasyon
taşar. Etkinlik zamanı boyunca çeşitli bileşenlerde varsayılan olarak etkindir.
platform, örneğin
/platform/external/libnl/Android.bp
.
Uygulama
IntSan, UBSan'ın imzalı ve imzasız tam sayı taşma deterjanlarını kullanır. Bu çözüm modül düzeyinde etkinleştirilir. Kritik bileşenlerin proje için ve devre dışı bırakılmamalıdır.
Ek URL'ler için tamsayı taşma temizleme özelliğini bileşenlerine ayıralım. İdeal adaylar, güvenilir olmayan kullanıcı girişini ayrıştırır. Reklamlarla ilişkili küçük bir performans kullanımına bağlı olan dezenfektanla birlikte kod kullanımı ve aritmetik işlemler. Küçük bir genel gider yüzdesi bekleyin ve önemli bir konu.
Makefile'larda IntSan'ı destekleme
IntSan'ı bir oluşturma dosyasında etkinleştirmek için şunu ekleyin:
LOCAL_SANITIZE := integer_overflow # Optional features LOCAL_SANITIZE_DIAG := integer_overflow LOCAL_SANITIZE_BLOCKLIST := modulename_BLOCKLIST.txt
LOCAL_SANITIZE
, dezenfektanların virgülle ayrılmış listesini alır.integer_overflow
, başka e-postalar için tam sayılarla çalışan dezenfektanların kullanımı, varsayılan ENGELLE LİSTESİ.LOCAL_SANITIZE_DIAG
, şu cihaz için teşhis modunu açar: kullanın. Teşhis modunu yalnızca test sırasında kullan, çünkü bu mod işlemini tamamen geri çevirerek olabilir. Sorun giderme bölümünü inceleyin. başlıklı bölüme bakın.LOCAL_SANITIZE_BLOCKLIST
, bir BLOCKLIST (ENGELLE LİSTESİ) belirlemenize olanak tanır dosyası oluşturun. Görüntüleyin Ek bilgiler için sorun giderme bolca fırsat sunuyor.
Daha ayrıntılı kontrol istiyorsanız dezenfektanları tek tek etkinleştirin. kullanın:
LOCAL_SANITIZE := signed-integer-overflow, unsigned-integer-overflow LOCAL_SANITIZE_DIAG := signed-integer-overflow, unsigned-integer-overflow.
Proje dosyalarında IntSan'ı destekleme
Bir şema dosyasında tam sayı taşma temizleme işlemini etkinleştirmek için
/platform/external/libnl/Android.bp
ekle:
sanitize: { integer_overflow: true, diag: { integer_overflow: true, }, BLOCKLIST: "modulename_BLOCKLIST.txt", },
Yapma dosyalarında olduğu gibi, integer_overflow
özelliği önceden paketlenmiş bir
bağımsız imzalı ve imzasız tam sayı taşması için seçenek kümesi
dezenfektanlar için varsayılan
ENGELLE LİSTESİ.
diag
özellik grubu,
kullanın. Teşhis modunu yalnızca test sırasında kullanın. Teşhis modu
taşmalarda iptal eder. Bu, Search Ads 360'ın güvenlik avantajlarını tamamen ortadan kaldırır.
çözüm olarak kullanabilirsiniz. Diğer ayrıntılar için Sorun Giderme bölümünü inceleyin.
BLOCKLIST
özelliği, BLOCKLIST dosyasının belirtilmesine izin verir.
geliştiricilerin, işlevlerin ve kaynak dosyaların devre dışı bırakılmasını engellemesine
arındırılmış bir hale geldi. Aşağıdaki ayrıntılar için Sorun Giderme bölümünü inceleyin:
daha fazla bilgi edineceksiniz.
Dezenfektanları ayrı ayrı etkinleştirmek için şunu kullanın:
sanitize: { misc_undefined: ["signed-integer-overflow", "unsigned-integer-overflow"], diag: { misc_undefined: ["signed-integer-overflow", "unsigned-integer-overflow",], }, BLOCKLIST: "modulename_BLOCKLIST.txt", },.
Sorun giderme
Yeni bileşenlerde tam sayı taşması temizlemeyi etkinleştiriyorsanız veya tamsayı taşma temizleme işlemi uygulanmış platform kitaplıkları, yararlı tamsayı taşmalarıyla ilgili birkaç sorun var. Hedeflerinizi ve iyi huylu taşmaların görülebilmesini sağlamak için sterilizasyon etkinleştirilmiş bileşenleri.
Kullanıcı derlemelerinde temizleme işleminden kaynaklanan iptalleri bulmak için şunu arayın:
SIGABRT
, bir taşmanın yakalandığını gösteren İptal mesajlarıyla kilitleniyor
Ö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 (stack trace), iptale neden olan işlevi içermelidir. Satır içi işlevlerde meydana gelen taşmalar yığın izlemede belirgin olmayabilir.
Temel nedeni daha kolay belirlemek için kitaplıkta teşhis özelliğini etkinleştirin ve hatayı yeniden oluşturmayı deneyin. Şununla teşhis özelliği etkinleştirildiğinde işlem iptal edilmez ve çalıştırmaya devam etmesini sağlar. İptal etmemek, bir yeniden derlemek zorunda kalmadan belirli bir yürütme yolunu kullanabilirsiniz. Teşhis Aracı, satır numarasını ve kaynağı içeren bir hata mesajı veriyor iptal etmeye neden olan dosya:
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şma tehlikesiz ve amaca yönelik (ör. güvenlik açısından herhangi bir etkisi yoktur). Dilerseniz dezenfektanı iptal eden:
- Taşmayı önlemek için kodu yeniden düzenleme (örnek)
- Clang'in __builtin_*_overflow aracı üzerinden açıkça taşma işlevler (örnek)
no_sanitize
özelliğini belirterek işlevde temizlemeyi devre dışı bırakma (örnek)- BLOCKLIST 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 ve tek bir taşma işlemiyle fonksiyon fonksiyonun tamamı yerine tek işlemin yeniden düzenlenmesi gerekir ENGELLENENLER LİSTESİNE ALINDI.
Tehlikesiz taşmalarla sonuçlanabilecek yaygın kalıplar şunlardır:
- Üstü kapalı imzalı bir türe dönüştürülmeden önce imzasız taşmanın gerçekleştiği yayınlar (örnek)
- Silme işlemi sırasında döngü dizinini azaltan bağlı liste silme işlemleri (örnek)
- Gerçek maksimum değeri belirtmek yerine -1'e imzasız bir tür atama (örnek)
- Koşulda imzalanmamış bir tam sayıyı azaltan döngüler (örnek, örnek)
Geliştiricilerin, dezenfektanın tespit edebildiği durumlarda istenmeyen yan etki veya güvenlik içermeyen, gerçekten tehlikesiz bir taşma dikkate almanız gerektiğini unutmayın.
IntSan'ı devre dışı bırak
IntSan'ı BLOCKLIST'ler veya işlev özellikleriyle devre dışı bırakabilirsiniz. Dikkatli şekilde devre dışı bırak ve yalnızca kodun yeniden düzenlenmesi makul değilse veya kod sorunlu performans giderleri oluşturabilirsiniz.
IntSan'ı devre dışı bırakma hakkında daha fazla bilgi edinmek için yayın öncesi Clang dokümanlarına bakın fonksiyonlu özellikleri ve ENGELLEME LİSTESİ dosyası biçimlendirme hakkında daha fazla bilgi edinin. BLOCKLISTing özelliğinin kapsamı, diğerlerinin etkilenmemesi için hedef dezenfektanı belirten bölüm adlarını kullanarak kullanın.
Doğrulama
Şu anda özellikle tamsayı taşma temizleme için özel bir CTS testi yapılmamaktadır. Bunun yerine, CTS testlerinin IntSan etkin olsa da olmasa da başarılı olduğundan emin olun. etkilemediğinden emin olun.
Sınır temizleme
BoundsSanitizer (BoundSan), sınır eklemek için ikili programlara enstrümantasyon ekler dizi erişimlerini kontrol eder. Bu kontroller, derleyici tarafından derleme sırasında, erişimin güvenli olacağını ve dizinin boyutunun doğru olmadığını çalışma zamanında bilinir, böylece kontrol edilebilir. Android 10, BoundSan'ı dağıtıyor Bluetooth ve codec'ler. BoundSan, derleyici tarafından sağlanır ve çeşitli bileşenlerde varsayılan olarak kullanılır.
Uygulama
BoundSan, UBSan's dezenfektanı kullanalım. Bu çözüm modül bazında etkinleştirilir. Ekibinizin Android'in önemli bileşenlerini güvende tutmak ve devre dışı bırakılmamalıdır.
Ek bileşenler için BoundSan'ı etkinleştirmenizi kesinlikle öneririz. İdeal adaylar, güvenilir olmayan kullanıcı girişi. BoundSan'ın etkinleştirilmesiyle ilişkili performans ek yükü güvenli olduğu kanıtlanamayan dizi erişimlerinin sayısına bağlıdır. Beklenen: düşük bir genel gider yüzdesi belirleyin ve performansla ilgili bir sorun olup olmadığını test edin.
Plan dosyalarında BoundSan'ı etkinleştir
BoundSan, şema dosyalarında "bounds"
eklenerek etkinleştirilebilir
İkili program ve kitaplık için misc_undefined
arındırma özelliğine
modüllerinde yer alır:
sanitize: { misc_undefined: ["bounds"], diag: { misc_undefined: ["bounds"], }, BLOCKLIST: "modulename_BLOCKLIST.txt",
teşhis etmek
diag
özelliği, dezenfektanlar için teşhis modunu etkinleştirir.
Teşhis modunu yalnızca test sırasında kullanın. Teşhis modu şu tarihte iptal edilmiyor:
Bu durum, azaltmanın güvenlik avantajını ortadan kaldırır ve
bu nedenle üretim derlemeleri için önerilmez.
ENGELLE LİSTESİ
BLOCKLIST
özelliği, BLOCKLIST işlevinin belirtilmesine izin verir.
geliştiricilerin, işlevlerin ve kaynak dosyalarının çalışmasını engellemek için kullanabileceği dosya
arındırılmış bir hale geldi. Bu özelliği yalnızca performansla ilgili bir sorun varsa ve hedeflenen gösterim oranı
dosyaları/işlevleri önemli ölçüde katkıda bulunur. Bu dosyaları/işlevleri manuel olarak denetle
ile kontrol edilebilir. Daha fazla bilgi için Sorun Giderme bölümünü inceleyin.
bolca fırsat sunuyor.
Yapma dosyalarında BoundSan'ı etkinleştir
BoundSan, "bounds"
eklenerek oluşturma dosyalarında etkinleştirilebilir
ikilik ve kitaplık modülleri için LOCAL_SANITIZE
değişkenine ekleyin:
LOCAL_SANITIZE := bounds # Optional features LOCAL_SANITIZE_DIAG := bounds LOCAL_SANITIZE_BLOCKLIST := modulename_BLOCKLIST.txt
LOCAL_SANITIZE
dezenfektanların listesini kabul eder:
virgül olabilir.
LOCAL_SANITIZE_DIAG
, teşhis modunu açar. Teşhisi kullan
modunda kullanın. Teşhis modu, taşma işlemlerini iptal etmez. Bu da
ortadan kaldırır ve çözümün güvenlik avantajını ortadan kaldırır
bu nedenle üretim derlemeleri için önerilmez.
LOCAL_SANITIZE_BLOCKLIST
, bir BLOCKLIST işlevinin belirtilmesine izin verir.
geliştiricilerin, işlevlerin ve kaynak dosyaların çalışmasını engellemesine olanak tanıyan dosya
arındırılmış bir hale geldi. Bu özelliği yalnızca performansla ilgili bir sorun varsa ve hedeflenen gösterim oranı
dosyaları/işlevleri önemli ölçüde katkıda bulunur. Bu dosyaları/işlevleri manuel olarak denetle
ile kontrol edilebilir. Daha fazla bilgi için Sorun Giderme bölümünü inceleyin.
bolca fırsat sunuyor.
BoundSan'ı devre dışı bırak
BoundSan özelliğini, işlevlerde ve kaynak dosyalarda BLOCKLIST veya BLOCKLIST öğesini devre dışı bırakabilirsiniz. işlev öznitelikleri içerir. BoundSan'ı etkin durumda tutmak en iyisidir, bu nedenle yalnızca şu durumlarda devre dışı bırakın: bu fonksiyon veya dosya büyük miktarda performans yüküne neden olursa kaynak manuel olarak incelendi.
fonksiyon ile BoundSan'ı devre dışı bırakma hakkında daha fazla bilgi özellikleri ve ENGELLEME LİSTESİ dosyası biçimlendirme için Clang LLVM dokümanlarını inceleyin. Kapsam hedef dezenfektanı kullanmasının önüne geçin.
Doğrulama
BoundSan için özel olarak bir CTS testi yoktur. Bunun yerine CTS’nin testlerin BoundSan etkin olsa da olmasa da başarılı olup olmadığını için geçerlidir.
Sorun giderme
BoundSan'ı etkinleştirdikten sonra bileşenleri baştan sona test ederek daha önce tespit edilmemiş sınır dışı erişimlerin ele alınması gerekir.
BoundSan hataları aşağıdakileri içerdiğinden kolayca tespit edilebilir: tombstone iptal mesajı:
pid: ###, tid: ###, name: Binder:### >>> /system/bin/foobar <<< signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr -------- Abort message: 'ubsan: out-of-bounds'
Teşhis modunda çalışırken kaynak dosya, satır numarası ve dizin
değerleri logcat
hedefine yazdırılır. Bu mod varsayılan olarak
iptal mesajı gönderebilir. Kontrol etmek için logcat
inceleyin
hatalar.
external/foo/bar.c:293:13: runtime error: index -1 out of bounds for type 'int [24]'