PTI中的SMEP模拟:内核页表隔离带来的安全增强

本文探讨了内核页表隔离(PTI)技术如何在不支持SMEP的CPU上模拟SMEP功能,通过禁用用户空间内存执行来增强系统安全性,并对比了PTI启用和禁用时的行为差异。

SMEP emulation in PTI

最近的内核页表隔离(CONFIG_PAGE_TABLE_ISOLATION)补丁(用于防御CVE-2017-5754,即推测执行的“恶意数据缓存加载”或“Meltdown”漏洞)带来了一个额外的好处:在内核模式下运行时可见的用户空间页表缺少可执行位。因此,没有SMEP CPU功能的系统(在Ivy-Bridge之前)可以“免费”获得模拟的SMEP功能。

以下是一个禁用PTI的非SMEP系统(使用“pti=off”启动),运行EXEC_USERSPACE LKDTM测试:

1
2
3
4
5
6
7
8
# 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后:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 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国际许可协议授权。

评论 (3)

ZZ — 2018年1月6日下午4:21
一旦Meltdown在未来CPU上得到硬件/微码修复,KPTI是否还会被使用?换句话说,在你们发现Meltdown之前,你们是否认为KPTI/KAISER是必要的?

kees — 2018年1月27日上午2:48
我更感兴趣的是在内核模式下取消映射用户空间(PTI与此相反),但是的,在用户空间模式下取消映射内核可以消除许多其他侧信道攻击,因此我个人即使在“修复的硬件”上也会继续使用它。

kurdt — 2018年3月4日上午11:08
您好。Cook先生,我想问一个关于ix86/x86_32架构的PTI问题:是否有计划向后移植此功能?我知道开发人员(OpenSUSE等)正在为此工作(参见1.)。所以,如果一切顺利,“内核页表隔离”也应该在32位系统上可用,对吗?谢谢,致以最诚挚的问候。


  1. http://lkml.iu.edu/hypermail/linux/kernel/1802.1/00925.html
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计