Tanımlanmamış Davranış Temizleyici

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:

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]'