ב-Android 8.0 נוספו תכונות להקשחת ליבה (kernel) כדי לעזור לצמצם את הליבה נקודות חולשה ואיתור באגים במנהלי התקנים של ליבה. התכונות נמצאות בkernel/common ב- להסתעפויות 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 ואילך ליבה (kernel) ואילך:
CONFIG_RANDOMIZE_BASE=y
KASLR גם דורש תמיכה בתוכנת אתחול להעברת אנטרופית חומרה דרך
צומת עץ המכשירים /chosen/kaslr-seed
או באמצעות הטמעה
EFI_RNG_PROTOCOL
.
כמו כן, צריך לוודא שתכונות ההקשחה הקיימות מופעלות:
- צמצום החריגה של מאגר הנתונים הזמני במקבץ:
CONFIG_CC_STACKPROTECTOR_STRONG=y
- הגנת זיכרון פנימי:
CONFIG_DEBUG_RODATA=y
אוCONFIG_STRICT_KERNEL_RWX=y
- הגבלת הגישה למרחב המשתמש מהליבה (kernel) - x86 (מופעלת כברירת מחדל):
CONFIG_X86_SMAP=y
בדיקה
כדי לבדוק את ההטמעה, מוסיפים את CONFIG_LKDTM=y
לליבה (kernel)
ולוודא שכל אחת מהפקודות הבאות מובילה לליבה (kernel)
פאניקה:
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()
הרגילה היא פונקציה.