Akış bütünlüğünü kontrol etme

2016 itibarıyla Android'deki tüm güvenlik açıklarının yaklaşık% 86'sı bellek güvenliğinden kaynaklanmaktadır. emin olun. Güvenlik açıklarının çoğu, normal güvenlik açığını değiştiren saldırganlar tarafından kötü amaçla kullanılır. rastgele kötü amaçlı işlemler gerçekleştirmek için bir uygulamanın akışını kontrol etmek bu uygulamanın tüm ayrıcalıklarından yararlanılabilir. Akışı kontrol etme (CFI), derlenmiş bir ikili programın orijinal kontrol akış grafiğidir. Böylece, bu tür saldırıları gerçekleştirir.

Android 8.1'de, LLVM'nin medya yığınına CFI uygulamasını etkinleştirdik. İçinde Android 9'da, daha fazla bileşende ve çekirdekte CFI'yı etkinleştirdik. Sistem CFI (yeni) varsayılan olarak açıktır, ancak çekirdek CFI'yı etkinleştirmeniz gerekir.

LLVM'nin CFI'ı, Bağlantı Zamanı Optimizasyonu (LTO) ile iletişime geçebilirsiniz. LTO, nesne dosyalarının LLVM bit kodu gösterimini bağlantı süresi (link-time), derleyicinin hangi optimizasyonların yardımcı olur. LTO'yu etkinleştirmek, nihai ikili programın boyutunu küçültür ve performansı artırır ancak derleme süresini artırır. Android'de yapılan testlerde, LTO ve CFI ile kod boyutu ve performansı üzerinde ihmal edilebilir düzeyde ek yük anlamına gelir; bazı durumlarda iyileşti.

CFI ve diğer ileri kontrol kontrollerinin nasıl ilerlediği hakkında daha teknik bilgi hakkında daha fazla bilgi için LLVM tasarımına dokümanlarına göz atın.

Örnekler ve kaynak

CFI, derleyici tarafından sağlanır ve sırasında ikili sisteme enstrümantasyon ekler. derleme zamanıdır. Clang araç zincirinde ve Android derleme sisteminde CFI desteklenir AOSP'de.

CFI, Arm64 cihazlarda kullanılan bileşen grubu için varsayılan olarak etkindir. /platform/build/target/product/cfi-common.mk Ayrıca, medya bileşenleri grubunda doğrudan etkinleştirilir. oluşturma dosyaları/şeması dosyalar, örneğin /platform/frameworks/av/media/libmedia/Android.bp ve /platform/frameworks/av/cmds/stagefright/Android.mk.

Sistem CFI'ı uygulama

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

Aslında ek bileşenler için CFI'yı etkinleştirmenizi kesinlikle öneririz. İdeal adaylar, ayrıcalıklı yerel kod veya güvenilir olmayan kullanıcı girişi. Clang ve Android derleme sistemini kullanıyorsanız oluşturma dosyalarınıza birkaç satır ekleyerek yeni bileşenlerde CFI'yı etkinleştirebilir veya şema dosyası oluşturabilirsiniz.

Yapma dosyalarında CFI'yı destekleme

/platform/frameworks/av/cmds/stagefright/Android.mk gibi bir oluşturma dosyasında CFI'yı etkinleştirmek için, ekle:

LOCAL_SANITIZE := cfi
# Optional features
LOCAL_SANITIZE_DIAG := cfi
LOCAL_SANITIZE_BLACKLIST := cfi_blacklist.txt

  • LOCAL_SANITIZE, dezenfektan olarak CFI olduğunu belirtiyor seçeceğiz.
  • LOCAL_SANITIZE_DIAG, CFI için teşhis modunu açar. Teşhis modu, kilitlenmelerini de sağlayabilir. Bu, derlemelerinizi geliştirirken ve test ederken faydalıdır. Marka yine de üretim derlemelerinde teşhis modunu kaldırdığınızdan emin olun.
  • LOCAL_SANITIZE_BLACKLIST, bileşenlerin seçmeli olarak yapılmasına izin verir Ayrı ayrı işlevler veya kaynak dosyalar için CFI araçlarını devre dışı bırakabilirsiniz. Siz kullanıcıların karşılaştığı sorunları düzeltmek için son çare olarak kara listeyi mevcut olmayabilir. Daha fazla bilgi için bkz. CFI'yı devre dışı bırakma.

Proje dosyalarında CFI'yı destekleme

/platform/frameworks/av/media/libmedia/Android.bp gibi bir şema dosyasında CFI'yı etkinleştirmek için ekle:

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

Sorun giderme

CFI'ı yeni bileşenlerde etkinleştiriyorsanız işlev türü uyuşmazlığı hataları ve derleme kodu türü uyuşmazlığı hataları.

İşlev türü uyuşmazlığı hataları, CFI dolaylı çağrıları yalnızca kullanılan statik türle aynı dinamik türe sahip fonksiyonlara çağrısına bir tıklama URL'si eklemeniz gerekir. CFI, sanal ve sanal olmayan üye işlev çağrılarını yalnızca atlamayla kısıtlıyor. kullanılan statik nesnenin türetilmiş bir sınıfı olan telefon et. Bu, şunlardan birini ihlal eden bir kodunuz olduğunda CFI'ın eklediği araçlar iptal eder. Örneğin, yığın izlemede SIGABRT, logcat ise kontrol akışıyla ilgili bir satır gösterir ve bir uyuşmazlık bulma sürecidir.

Bunu düzeltmek için çağrılan işlevin statik olarak açıklanır. Aşağıda iki örnek CL verilmiştir:

Olası başka bir sorun da dolaylı yol içeren kodda CFI'ı etkinleştirmeye çalışmaktır. çağrısından ibaret değildir. Derleme kodu yazılmadığı için bu, uyuşmazlığı.

Bu sorunu düzeltmek için her derleme çağrısına yönelik yerel kod sarmalayıcıları oluşturun ve çağıran poiner ile aynı işlev imzasını sarmalar. Böylece sarmalayıcı doğrudan derleme kodunu çağırın. Çünkü doğrudan dallara CFI (çalışma zamanında yeniden atanamaz, bu nedenle güvenlik riski yoktur), bu işlem sorunu çözecektir.

Çok fazla derleme işlevi varsa ve hepsi düzeltilemiyorsa aynı zamanda derlemeye dolaylı çağrılar içeren tüm işlevleri kara listeye alır. Bu CFI kontrollerini devre dışı bıraktığından bu işlevlerde CFI kontrollerini devre dışı bıraktığından saldırıya uğrayan yüzeylere bakın.

CFI devre dışı bırakılıyor

Herhangi bir performans yükü gözlemlenmediğimizden, CFI. Bununla birlikte, kullanıcı açısından bir etki varsa CFI'yı seçerek devre dışı bırakabilirsiniz temizleyici kara liste dosyası sağlayarak tek tek işlevler veya kaynak dosyalar için sırasında görünür. Kara liste, derleyiciye CFI'yı devre dışı bırakması talimatını verir enstrümantasyon kullanabilir.

Android derleme sistemi, bileşen başına kara listeler için destek sağlar ( CFI almayacak kaynak dosyaları veya işlevleri seçebilirsiniz enstrümantasyonu) kullanır. Biçimle ilgili daha fazla bilgi edinmek için emin değilseniz, yukarıdaki yukarı akışa Clang dokümanlarına göz atın.

Doğrulama

Şu anda, özellikle CFI için bir CTS testi yoktur. Bunun yerine, CTS testleri, CFI etkin olsa da olmasa da başarılı olduğundan CFI'ın etkilenmediğini doğrular. için geçerlidir.