Çekirdek sertleştirme

Android 8.0'a, çekirdeği azaltmaya yardımcı olmak için çekirdek sağlamlaştırma özellikleri eklendi çekirdek sürücülerindeki hataları bulmak için yapay zekadan yararlanabilir. Özellikler şurada çekirdek/ortak konumundadır: android-3.18, android-4.4 ve android-4.9 dalları.

Uygulama

Bu özellikleri edinmek için cihaz üreticileri ve SOC'ler, tüm cihaz üreticilerini kernel/common çekirdeklerini çekirdek ağaçlarına ve çekirdeklerine aşağıdaki çekirdek yapılandırma seçeneklerini etkinleştirin:

  • Sağlamlaştırılmış kullanıcı kopyası: CONFIG_HARDENED_USERCOPY=y
  • PAN emülasyonu - arm64: CONFIG_ARM64_SW_TTBR0_PAN=y
  • PAN emülasyonu - kol: CONFIG_CPU_SW_DOMAIN_PAN=y
  • KASLR - 4.4 ve sonraki çekirdekler: CONFIG_RANDOMIZE_BASE=y.

KASLR ayrıca donanım entropisini iletmek için bootloader desteği gerektiriyor /chosen/kaslr-seed cihaz ağacı düğümünü veya EFI_RNG_PROTOCOL.

Ayrıca, mevcut sağlamlaştırma özelliklerinin etkinleştirildiğinden emin olun:

  • Yığın arabelleği taşma çözümü: CONFIG_CC_STACKPROTECTOR_STRONG=y.
  • Dahili bellek koruması: CONFIG_DEBUG_RODATA=y veya CONFIG_STRICT_KERNEL_RWX=y
  • Kullanıcı alanı erişimini çekirdekten kısıtla - x86 (varsayılan olarak etkindir): CONFIG_X86_SMAP=y.

Test

Uygulamanızı test etmek için çekirdeğe CONFIG_LKDTM=y ekleyin yapılandırmanızı ve aşağıdaki komutların her birinin bir çekirdeğe panik:

echo ACCESS_USERSPACE > /sys/kernel/debug/provoke-crash/DIRECT
echo EXEC_USERSPACE > /sys/kernel/debug/provoke-crash/DIRECT
echo WRITE_RO > /sys/kernel/debug/provoke-crash/DIRECT
echo WRITE_RO_AFTER_INIT > /sys/kernel/debug/provoke-crash/DIRECT
echo WRITE_KERN > /sys/kernel/debug/provoke-crash/DIRECT
echo EXEC_STACK > /sys/kernel/debug/provoke-crash/DIRECT
echo EXEC_RODATA > /sys/kernel/debug/provoke-crash/DIRECT
echo EXEC_KMALLOC > /sys/kernel/debug/provoke-crash/DIRECT
echo EXEC_VMALLOC > /sys/kernel/debug/provoke-crash/DIRECT
echo CORRUPT_STACK > /sys/kernel/debug/provoke-crash/DIRECT

Android-4.9 için:

echo USERCOPY_HEAP_SIZE_TO > /sys/kernel/debug/provoke-crash/DIRECT
echo USERCOPY_HEAP_SIZE_FROM > /sys/kernel/debug/provoke-crash/DIRECT

Genel sorunlar

Bu değişiklikler muhtemelen çekirdek sürücülerinde hataları ortaya çıkaracaktır. cihaz üreticisi veya çekirdek sürücüsünün sahibi tarafından düzeltilir.

  • Sağlamlaştırılmış kullanıcı kopyası, veriler kopyalanırken yanlış sınırlar kontrolü gösteriyor veya bir alandan diğerine gidebilmektedir. Bunlar, diğer bellek bozulması hataları gibi düzeltilmelidir.
  • PAN emülasyonu, çekirdekten doğrudan kullanıcı alanına erişimi açığa çıkarıyor. izin verilir. Kullanıcı alanı belleğine erişmeye çalışan sürücülerin şu şekilde değiştirilmesi gerekiyor: standart copy_to_user()/copy_from_user() kullanın işlevlerini kullanabilirsiniz.