การปิดรูปเคอร์เนล

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

ปัญหาทั่วไป

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

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