Çekirdek Sertleştirme

Android 8.0, çekirdekteki güvenlik açıklarını azaltmaya ve çekirdek sürücülerindeki hataları bulmaya yardımcı olmak için çekirdek güçlendirme özellikleri ekledi. Özellikler çekirdekte/android-3.18, android-4.4 ve android-4.9 dallarında ortaktır .

Uygulama

Bu özellikleri elde etmek için cihaz üreticileri ve SOC'ler, kernel/common tüm güçlendirme yamalarını kendi çekirdek ağaçlarıyla birleştirmeli ve aşağıdaki çekirdek yapılandırma seçeneklerini etkinleştirmelidir:

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

KASLR ayrıca donanım entropisini /chosen/kaslr-seed aygıt ağacı düğümü üzerinden veya EFI_RNG_PROTOCOL uygulayarak geçirmek için önyükleyici desteğine ihtiyaç duyar.

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

  • Yığın arabellek taşmasını azaltma: 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ıtlayın - x86 (varsayılan olarak etkindir): CONFIG_X86_SMAP=y

Test yapmak

Uygulamanızı test etmek için çekirdek yapılandırmasına CONFIG_LKDTM=y ekleyin ve aşağıdaki komutların her birinin çekirdek paniğine yol açtığını doğrulayın:

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

Ortak sorunlar

Bu değişikliklerin çekirdek sürücülerindeki hataları ortaya çıkarması muhtemeldir ve bunların ya aygıt üreticisi ya da çekirdek sürücüsünün sahibi tarafından düzeltilmesi gerekir.

  • Sağlamlaştırılmış kullanıcı kopyası, verileri kullanıcı alanına/alanından kopyalarken hatalı sınır denetimini ortaya çıkarır. Bunlar, diğer bellek bozulması hataları gibi düzeltilmelidir.
  • PAN emülasyonu, çekirdekten doğrudan kullanıcı alanı erişimini açığa çıkarır ve buna izin verilmez. Kullanıcı alanı belleğine erişmeye çalışan sürücülerin bunun yerine standart copy_to_user() / copy_from_user() işlevlerini kullanacak şekilde değiştirilmesi gerekir.