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位系统上可用,对吗?谢谢,致以最诚挚的问候。
- http://lkml.iu.edu/hypermail/linux/kernel/1802.1/00925.html