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