PTI 中的 SMEP 模拟
近期内核页表隔离补丁(CONFIG_PAGE_TABLE_ISOLATION)带来了一项额外优势:当内核模式运行时,可见的用户空间页表缺少可执行位。这使得不具备 SMEP CPU 特性的系统(Ivy-Bridge 之前的处理器)能"免费"获得该特性的模拟实现。
非 SMEP 系统测试案例
关闭 PTI 的情况(使用"pti=off"启动参数):
# grep smep /proc/cpuinfo
# dmesg -c | grep isolation
[ 0.000000] Kernel/User page tables isolation: disabled on command line.
# cat <(echo EXEC_USERSPACE) > /sys/kernel/debug/provoke-crash/DIRECT
# dmesg
[ 17.883754] lkdtm: Performing direct entry EXEC_USERSPACE
[ 17.885149] lkdtm: attempting ok execution at ffffffff9f6293a0
[ 17.886350] lkdtm: attempting bad execution at 00007f6a2f84d000
复制代码
系统未崩溃!内核成功执行了用户空间内存。
开启 PTI 的情况:
# grep smep /proc/cpuinfo
# dmesg -c | grep isolation
[ 0.000000] Kernel/User page tables isolation: enabled
# cat <(echo EXEC_USERSPACE) > /sys/kernel/debug/provoke-crash/DIRECT
Killed
# dmesg
[ 33.657695] lkdtm: Performing direct entry EXEC_USERSPACE
[ 33.658800] lkdtm: attempting ok execution at ffffffff926293a0
[ 33.660110] lkdtm: attempting bad execution at 00007f7c64546000
[ 33.661301] BUG: unable to handle kernel paging request at 00007f7c64546000
[ 33.662554] IP: 0x7f7c64546000
...
复制代码
未来优化方向
只需稍加改进,就能在内核模式下完全取消用户空间页表的映射,仅在 copy_to_user()/copy_from_user()时临时映射——这与 ARM 架构通过 ARM64_SW_TTBR0_PAN(或 arm32 的 CONFIG_CPU_SW_DOMAIN_PAN)实现的方式类似。
© 2018, Kees Cook. 本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。更多精彩内容 请关注我的个人公众号 公众号(办公 AI 智能小助手)公众号二维码
办公AI智能小助手
评论