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()
มาตรฐานแทน