如何检查 Linux 上是否启用了 KPTI?

信息安全 linux 开发 崩溃
2021-08-10 07:52:12

Meltdown 攻击常见问题解答说 KPTI 是 linux 的修复程序如何检查 KPTI 是否正在运行/启用?

4个回答

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 linedmesg

  • 在一些供应商修补的内核(主要是 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 可以在引导时通过noptipti=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 不受影响,则关闭页表隔离。