Google is committed to advancing racial equity for Black communities. See how.
Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

Kontrol Akışı Bütünlüğü

2016 itibariyle, Android'deki tüm güvenlik açıklarının yaklaşık% 86'sı bellek güvenliği ile ilgilidir. Çoğu güvenlik açığı, saldırganlar tarafından bir uygulamanın normal kontrol akışını, istismar edilen uygulamanın tüm ayrıcalıklarıyla rastgele kötü amaçlı etkinlikler gerçekleştirecek şekilde değiştiren saldırganlar tarafından kullanılır. Kontrol akışı bütünlüğü (CFI), derlenmiş bir ikilinin orijinal kontrol akış grafiğindeki değişikliklere izin vermeyen ve bu tür saldırıları gerçekleştirmeyi önemli ölçüde zorlaştıran bir güvenlik mekanizmasıdır.

Android 8.1'de, LLVM'nin ortam yığınında CFI uygulamasını etkinleştirdik. Android 9'da, CFI'yi daha fazla bileşende ve ayrıca kernelde etkinleştirdik. Sistem CFI varsayılan olarak açıktır, ancak çekirdek CFI'yı etkinleştirmeniz gerekir.

LLVM'nin CFI'sı, Link-Time Optimization (LTO) ile derlemeyi gerektirir. LTO, nesne dosyalarının LLVM bit kodu temsilini bağlantı zamanına kadar korur, bu da derleyicinin hangi optimizasyonların gerçekleştirilebileceği konusunda daha iyi mantık yürütmesine olanak tanır. LTO'yu etkinleştirmek, son ikili dosyanın boyutunu azaltır ve performansı iyileştirir, ancak derleme süresini artırır. Android üzerinde test yaparken, LTO ve CFI kombinasyonu, kod boyutu ve performans için ihmal edilebilir ek yüke neden olur; birkaç durumda her ikisi de gelişti.

CFI ve diğer ileri kontrol kontrollerinin nasıl ele alındığı hakkında daha teknik ayrıntılar için LLVM tasarım belgelerine bakın .

Örnekler ve kaynak

CFI, derleyici tarafından sağlanır ve derleme süresi boyunca ikiliye enstrümantasyonu ekler. Clang araç zincirinde CFI'yi ve AOSP'de Android derleme sistemini destekliyoruz.

CFI, /platform/build/target/product/cfi-common.mk içindeki bileşen kümesi için Arm64 cihazları için varsayılan olarak /platform/build/target/product/cfi-common.mk . Ayrıca /platform/frameworks/av/media/libmedia/Android.bp ve /platform/frameworks/av/cmds/stagefright/Android.mk gibi bir dizi medya bileşeninin makefiles / blueprint dosyalarında da doğrudan etkinleştirilir.

Uygulama sistemi CFI

Clang ve Android derleme sistemini kullanıyorsanız CFI varsayılan olarak etkindir. CFI, Android kullanıcılarının güvenliğini sağlamaya yardımcı olduğundan, onu devre dışı bırakmamalısınız.

Aslında, ek bileşenler için CFI'yi etkinleştirmenizi şiddetle tavsiye ederiz. İdeal adaylar, ayrıcalıklı yerel kod veya güvenilmeyen kullanıcı girdilerini işleyen yerel koddur. Clang ve Android yapı sistemini kullanıyorsanız, makefile veya blueprint dosyalarınıza birkaç satır ekleyerek CFI'yı yeni bileşenlerde etkinleştirebilirsiniz.

Makefiles içinde CFI desteği

/platform/frameworks/av/cmds/stagefright/Android.mk gibi bir oluşturma dosyasında /platform/frameworks/av/cmds/stagefright/Android.mk etkinleştirmek için şunu ekleyin:

LOCAL_SANITIZE := cfi
# Optional features
LOCAL_SANITIZE_DIAG := cfi
LOCAL_SANITIZE_BLACKLIST := cfi_blacklist.txt
  • LOCAL_SANITIZE , derleme sırasında dezenfektan olarak LOCAL_SANITIZE belirtir.
  • LOCAL_SANITIZE_DIAG , CFI için teşhis modunu LOCAL_SANITIZE_DIAG . Tanılama modu, kilitlenmeler sırasında logcat'te ek hata ayıklama bilgilerini yazdırır; bu, yapılarınızı geliştirirken ve test ederken kullanışlıdır. Yine de, prodüksiyon yapılarında teşhis modunu kaldırdığınızdan emin olun.
  • LOCAL_SANITIZE_BLACKLIST , bileşenlerin bireysel işlevler veya kaynak dosyalar için CFI enstrümantasyonunu seçerek devre dışı LOCAL_SANITIZE_BLACKLIST izin verir. Bir kara listeyi, aksi halde ortaya çıkabilecek, kullanıcıyla ilgili sorunları çözmek için son çare olarak kullanabilirsiniz. Daha fazla ayrıntı için, bkz. CFI'yı Devre Dışı Bırakma .

Blueprint dosyalarında CFI desteği

/platform/frameworks/av/media/libmedia/Android.bp gibi bir taslak dosyasında etkinleştirmek için şunu ekleyin:

   sanitize: {
        cfi: true,
        diag: {
            cfi: true,
        },
        blacklist: "cfi_blacklist.txt",
    },

Sorun giderme

CFI'yi yeni bileşenlerde etkinleştiriyorsanız, işlev türü uyuşmazlığı hataları ve derleme kodu türü uyuşmazlığı hataları ile ilgili birkaç sorunla karşılaşabilirsiniz.

İşlev türü uyuşmazlığı hataları, CFI dolaylı çağrıları yalnızca çağrıda kullanılan statik türle aynı dinamik türe sahip işlevlere atlamakla sınırladığından oluşur. CFI, sanal ve sanal olmayan üye işlev çağrılarını yalnızca çağrıyı yapmak için kullanılan nesnenin statik türünün türetilmiş bir sınıfı olan nesnelere atlamak için kısıtlar. Bu, bu varsayımlardan herhangi birini ihlal eden bir kodunuz olduğunda, CFI'nin eklediği enstrümantasyonun iptal olacağı anlamına gelir. Örneğin, yığın izleme bir SIGABRT gösterir ve logcat, bir uyumsuzluk bulan kontrol akışı bütünlüğü hakkında bir satır içerir.

Bunu düzeltmek için, çağrılan işlevin statik olarak bildirilenle aynı türe sahip olduğundan emin olun. İşte iki örnek CL:

Bir başka olası sorun, derlemeye yönelik dolaylı çağrıları içeren kodda CFI'yi etkinleştirmeye çalışmaktır. Montaj kodu yazılmadığından, bu tür uyumsuzluğuna neden olur.

Bunu düzeltmek için, her derleme çağrısı için yerel kod sarmalayıcılar oluşturun ve sarmalayıcılara çağıran işaretçi ile aynı işlev imzasını verin. Sarmalayıcı daha sonra doğrudan montaj kodunu çağırabilir. Doğrudan şubeler CFI tarafından enstrümantasyona tabi tutulmadığından (çalışma zamanında yeniden görevlendirilemezler ve dolayısıyla bir güvenlik riski oluşturmazlar), bu sorunu çözecektir.

Çok fazla montaj işlevi varsa ve hepsi düzeltilemezse, dolaylı montaj çağrıları içeren tüm işlevleri de kara listeye alabilirsiniz. Bu işlevler üzerindeki CFI denetimlerini devre dışı bıraktığı ve dolayısıyla saldırı yüzeyini açtığı için bu önerilmez.

CFI'yi devre dışı bırakma

Herhangi bir performans ek yükü gözlemlemedik, bu nedenle CFI'yi devre dışı bırakmanıza gerek yoktur. Bununla birlikte, kullanıcıya dönük bir etki varsa, derleme sırasında bir temizleyici kara liste dosyası sağlayarak bireysel işlevler veya kaynak dosyalar için CFI'yı seçerek devre dışı bırakabilirsiniz. Kara liste, derleyiciye belirtilen konumlarda CFI enstrümantasyonunu devre dışı bırakması talimatını verir.

Android yapı sistemi, hem Make hem de Soong için bileşen başına kara listeler için destek sağlar (kaynak dosyaları veya CFI enstrümantasyonunu almayacak bireysel işlevleri seçmenize olanak tanır). Bir kara liste dosyasının biçimi hakkında daha fazla ayrıntı için, yukarı akış Clang belgelerine bakın .

Doğrulama

Şu anda, özellikle CFI için CTS testi yoktur. Bunun yerine, CFI'nin cihazı etkilemediğini doğrulamak için CTS testlerinin CFI etkinleştirilmiş veya CFI etkin olmadan geçtiğinden emin olun.