การแข็งตัวของเคอร์เนล

Android 8.0 เพิ่มคุณสมบัติการเสริมความแข็งแกร่งของเคอร์เนลเพื่อช่วยบรรเทาช่องโหว่ของเคอร์เนลและค้นหาจุดบกพร่องในไดรเวอร์เคอร์เนล คุณสมบัติอยู่ใน เคอร์เนล / ทั่วไป ในสาขา android-3.18, android-4.4 และ android-4.9

การนำไปปฏิบัติ

หากต้องการรับคุณสมบัติเหล่านี้ ผู้ผลิตอุปกรณ์และ SOC ควรรวมแพตช์เสริมความแข็งแกร่งทั้งหมดจาก kernel/common เข้ากับแผนผังเคอร์เนลของตน และเปิดใช้งานตัวเลือกการกำหนดค่าเคอร์เนลต่อไปนี้:

  • สำเนาผู้ใช้ที่ปรับปรุงแล้ว: CONFIG_HARDENED_USERCOPY=y
  • การจำลอง PAN - arm64: CONFIG_ARM64_SW_TTBR0_PAN=y
  • การจำลอง PAN - แขน: CONFIG_CPU_SW_DOMAIN_PAN=y
  • KASLR - 4.4 และเคอร์เนลใหม่กว่า: CONFIG_RANDOMIZE_BASE=y

นอกจากนี้ KASLR ยังต้องการการสนับสนุน bootloader สำหรับการส่งผ่านเอนโทรปีของฮาร์ดแวร์ผ่านโหนดแผนผังอุปกรณ์ /chosen/kaslr-seed หรือโดยการใช้ EFI_RNG_PROTOCOL

ตรวจสอบให้แน่ใจว่าได้เปิดใช้งานคุณสมบัติการชุบแข็งที่มีอยู่แล้ว:

  • การลดบัฟเฟอร์ล้นของสแต็ก: CONFIG_CC_STACKPROTECTOR_STRONG=y
  • การป้องกันหน่วยความจำภายใน: CONFIG_DEBUG_RODATA=y หรือ CONFIG_STRICT_KERNEL_RWX=y
  • จำกัดการเข้าถึงพื้นที่ผู้ใช้จากเคอร์เนล - x86 (เปิดใช้งานโดยค่าเริ่มต้น): CONFIG_X86_SMAP=y

การทดสอบ

หากต้องการทดสอบการใช้งานของคุณ ให้เพิ่ม CONFIG_LKDTM=y ให้กับคอนฟิกูเรชันเคอร์เนล และยืนยันว่าแต่ละคำสั่งต่อไปนี้ทำให้เกิดเคอร์เนลแพนิค:

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:

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

ปัญหาทั่วไป

การเปลี่ยนแปลงเหล่านี้มีแนวโน้มที่จะเปิดเผยจุดบกพร่องในไดรเวอร์เคอร์เนล ซึ่งจำเป็นต้องได้รับการแก้ไขโดยผู้ผลิตอุปกรณ์หรือเจ้าของไดรเวอร์เคอร์เนล

  • Usercopy ที่แข็งตัวจะทำให้การตรวจสอบขอบเขตไม่ถูกต้องเมื่อคัดลอกข้อมูลไปยัง/จากพื้นที่ผู้ใช้ สิ่งเหล่านี้ควรได้รับการแก้ไขเช่นเดียวกับข้อบกพร่องด้านหน่วยความจำอื่นๆ
  • การจำลอง PAN เปิดเผยการเข้าถึงพื้นที่ผู้ใช้โดยตรงจากเคอร์เนล ซึ่งไม่ได้รับอนุญาต จำเป็นต้องเปลี่ยนไดรเวอร์ที่พยายามเข้าถึงหน่วยความจำพื้นที่ผู้ใช้เพื่อใช้ฟังก์ชัน copy_to_user() / copy_from_user() มาตรฐานแทน