Meltdown 攻击常见问题解答说 KPTI 是 linux 的修复程序。如何检查 KPTI 是否正在运行/启用?
如何检查 Linux 上是否启用了 KPTI?
Linux 内核在启动时记录 KPTI 状态,因此,运行以下命令将打印已修补内核的状态。如果它什么也不打印,则禁用 KPTI。
dmesg -wH | grep 'Kernel/User page tables isolation'
Linux Kernel 4.15rc6 启用了 KPTI(内核页表隔离),并且它已被反向移植到 Linux Kernel 4.14.11、4.9.74、4.4.109、3.16.52和 3.2.97。
因此,如果您正在运行这些版本中的任何一个,那么 KPTI 就位。大多数发行版(运行任何 Linux 内核版本)都会在一两天内推送 Linux 内核的更新,以修复 Meltdown 和幽灵。
注意:将参数添加pti=off
到 GRUB 以禁用 KPTI。有关信息:https : //askubuntu.com/questions/19486/how-do-i-add-a-kernel-boot-parameter
确实表明 KPTI 状态的事情:
在标准内核中,输出中的字符串
Kernel/User page tables isolation: enabled
或表示内核正在执行内核页表隔离。后一条消息还意味着内核认为此 CPU 不需要页表隔离。Kernel/User page tables isolation: force enabled on command line
dmesg
在一些供应商修补的内核(主要是 RedHat 和衍生产品)中:
/sys/kernel/debug/x86/pti_enabled
. 然而,没有这个文件并不意味着什么:标准内核不提供它。在内核 4.14.18 或更新版本以及 LTS 内核的相应版本中,以
/sys/devices/system/cpu/vulnerabilities/meltdown
: 开头的行Mitigation:
表示缓解(KPTI、微码或其他)已到位,以 开头的行Not affected
表示 CPU认为不受该问题的影响,并且以开头的行Vulnerable
表示 CPU 被认为是易受攻击的,但没有或没有适当的缓解措施。
不表明 KPTI 状态的事情:
内核版本。内核 4.14.11 和更新版本,以及相应版本的 4.1、4,4 和 4.9 LTS 内核都支持KPTI,但可以在禁用它的情况下进行编译,并且可以在启动时禁用它。此外,比这些更早的版本不会自动面临风险:一些发行版已将 KPTI 补丁向后移植到旧内核。
bugs : cpu_insecure
在/proc/cpuinfo
. 这表明如果内核被编译为页表隔离,并且如果在启动时或运行时没有禁用页表隔离,则将使用页表隔离。此外,它并不表示CPU 容易受到 Meltdown 攻击:4.14.11 内核为所有 x86 CPU 设置它,而 4.14.12 内核为所有非 AMD CPU 设置它,甚至像 Pentium MMX 或不易受攻击的“Bonnell”Atom CPU。CONFIG_PAGE_TABLE_ISOLATION=y
在内核配置中。这仅表明内核能够进行内核页表隔离。KPTI 可以在引导时通过nopti
或pti=off
选项从内核命令行禁用。在某些系统上,可以在运行时通过0
写入/sys/kernel/debug/x86/pti_enabled
.
在受支持的内核上:
dmesg | grep '内核/用户页表隔离'
将导致启用或禁用。
如果没有结果,则内核不支持 KPTI。
检查 dmesg 输出,例如dmesg | grep isolation
,以确定它是否为您正在运行的机器打开。
这里提到了一些进一步的细节:https ://lwn.net/Articles/741878/
- 将有一个 nopti 命令行选项在引导时禁用此机制。
- 内核选项 PAGE_TABLE_ISOLATION 启用了 KPTI 补丁,如果启用了 CONFIG_IKCONFIG,您可以通过以下方式检查正在运行的内核
zcat /proc/config.gz | grep CONFIG_PAGE_TABLE_ISOLATION=y
- 有一个特性标志 X86_BUG_CPU_INSECURE,如果已知 CPU 不受影响,则关闭页表隔离。