如何在我的Ubuntu上检查KPTI是否已启用?

目前的Meltdown Intel处理器漏洞通过启用页面表隔离来解决。有个问题是如何关闭它: 如何关闭Page Table Isolation以恢复因Intel CPU安全补丁而导致的性能损失?

我的问题则相反:在运行中的系统上是否有一种方法可以检查PTI机制是否对系统有效,从而保护系统?我特别寻找cat /proc/somethingcat /sys/something 的方式,而不是检查内核版本或配置参数等。

7个回答

在内核配置中使用grep查找CONFIG_PAGE_TABLE_ISOLATION,就像Raniz提供的建议一样,在桌面版Ubuntu上没有帮助,但对云实例可能有帮助:
``` grep CONFIG_PAGE_TABLE_ISOLATION=y /boot/config-`uname -r` && \ echo "已修补 :)" || echo "未修补 :(" ```
你可以像JonasCz建议的那样通过检查/proc/cpuinfo来查看:
grep -q "cpu_insecure\|cpu_meltdown\|kaiser" /proc/cpuinfo && echo "已修复 :)" \
|| echo "未修复 :("

  • 或者从 dmesg 命令中获取(感谢 Jason Creighton):

    dmesg | grep -q "Kernel/User page tables isolation: enabled" \
    && echo "已修复 :)" || echo "未修复 :("
    

您可以从Raphael Carvalho编译用于检测Meltdown漏洞的测试程序:
sudo apt-get install git build-essential cd /tmp git clone https://github.com/raphaelsc/Am-I-affected-by-Meltdown.git cd Am-I-affected-by-Meltdown make sudo sh -c "echo 0 > /proc/sys/kernel/kptr_restrict" ./meltdown-checker 在已打补丁的系统上,它应该以输出结束。
...
so far so good (i.e. meltdown safe) ...

System not affected (take it with a grain of salt though as false negative
may be reported for specific environments; Please consider running it once again).

在已打补丁的系统上,应该显示以下内容:
Spectre and Meltdown mitigation detection tool v0.27

Checking for vulnerabilities against live running kernel Linux 4.4.0-109-generic #132-Ubuntu SMP Tue Jan 9 19:52:39 UTC 2018 x86_64
...
CVE-2017-5754 [rogue data cache load] aka 'Meltdown' aka 'Variant 3'
* Kernel supports Page Table Isolation (PTI):  YES 
* PTI enabled and active:  YES 
> STATUS:  NOT VULNERABLE  (PTI mitigates the vulnerability)

不要在Xenial上安装4.4.0-108-generic!它会破坏启动/重启/关机/挂起功能
请安装4.4.0-109-generic(有关详细信息,请参阅USN-3522-3)!
Robie Basak已经写过的那样,有一个关于Ubuntu中Spectre和Meltdown漏洞状态的页面
此外还有:

3Ubuntu的更新计划安排在1月9日。它们可能会提前发布,但我不会抱太大希望。https://insights.ubuntu.com/2018/01/04/ubuntu-updates-for-the-meltdown-spectre-vulnerabilities/ - Raniz
4在我看来,“dmesg | grep isolation”类型的答案比这个更可取。一些发行版(至少Debian stretch,可能还有其他)将PTI移植到了他们较旧的内核中,但没有在/proc/cpuinfo中添加cpu_insecure标志。在这些系统上,查看dmesg日志是唯一的检查方式,据我所知。 - Jason C
3我认为列出的 dmesg | grep isolation && echo "patched :)" || echo "unpatched :(" 命令是不必要的危险:它没有显示实际匹配的行,而且如果随机匹配到其他"隔离"实例,也会愉快地打印出"patched :)"。 - Jaap Eldering
2我不建议采用第二个建议(在/proc/cpuinfo中使用grep命令查找cpu_insecure)。如果你将其放入脚本中,并且在未来的CPU中,该问题已经在其微架构中修复,那么/proc/cpuinfo将不再显示cpu_insecure,而你的脚本会错误地认为内核是未打补丁的,即使它实际上是已打补丁的。我也不建议采用第三个建议,因为很有可能在某个时刻dmesg输出中会出现单词isolation,而它并不一定指的是内核页表隔离。 - blubberdiblub
你的前两个建议只能告诉你内核是否支持KPTI,而不能告译它是否激活。第三个建议可能会出现误报,如果其他内核隔离功能处于激活状态。 - Mark
4经进一步调查,这三个建议都有问题。在进行isolation的搜索时,会匹配到Kernel/User page tables isolation: enabledKernel/User page tables isolation: disabled on command line两个结果。 - Mark
我将这篇帖子转为社区维基格式,这样任何人都可以对其进行改进。 - N0rbert
只有最后一个是适用于 Ubuntu 16.04.34.4.0-108-generic 的正面信息。 - Seppo Erviälä
/proc/cpuinfo中检查"kaiser"标志是否足够?或者即使在启动时禁用了页面表隔离但编译进内核的情况下,我们仍然可以拥有这个标志吗? - Rmano
有趣的是,grepping dmesg 告诉我 kpti 已为我启用,但在我的/proc/cpuinfo中没有列出任何错误。我的电脑搭载了Intel Core i7 3630qm CPU,并运行基于Ubuntu 16.04 LTS的 elementary OS 0.4。 - Magnus Teekivi
更新帖子。不要安装4.4.0-108! - N0rbert
第一次检查即使在16.04.3上使用4.4.0-109版本也返回“未修补”。另外两个检查返回“已修补”。看起来这些检查不够可靠... - Andres F.
我使用的是16.04.3 LTS 4.4.0-109-generic版本,前两个是“未修补”的,最后一个(dmesg)是“已修补”的。我应该相信哪一个? - Nova
请注意,在安装了修补过的内核后,使用AMD CPU的Ubuntu系统上,上述的grep命令显示为"Kernel/User page tables isolation: disabled"。与此同时,meltdown-checker报告为"meltdown safe"。这意味着内核支持页面表隔离,但由于AMD CPU不易受到该攻击,因此被禁用了。 - rpr
同时cat /proc/cpuinfo | grep bugs将显示类似以下内容:错误 : cpu_meltdown spectre_v1 spectre_v2 - Ahmed

运行以下命令:
dmesg | grep 'page tables isolation'

如果显示为启用,则 PTI 已启用。如果未显示任何内容或在终端中看到“禁用”,则 PTI 已禁用。Ubuntu 尚未发布此补丁,因此不会显示任何消息。


...或者更高版本的内核消息已经将启动消息推出了内核日志缓冲区。如果您的内核打印低严重性问题的通知,比如奇怪的网络数据包,那么启动时的消息通常不会出现在dmesg输出中。如果/var/log/kern.log*文件够早,可以查看其中是否包含启动消息。Ubuntu曾经将启动时的dmesg输出记录到/var/log/dmesg,但似乎不再这样做了。 - Peter Cordes
在14.04版本上,我遇到了dmesg: invalid option -- 'w'的错误。-H选项也是无效的。根据这个答案,移除这些选项对我来说解决了问题。 - wjandrea
14.04上的/var/log/kern.log - eckes

您可以通过运行cat /proc/cpuinfo命令来检查,如果在“bugs”下报告了cpu_insecure,则PTI已启用。

如果它是空白的(或者只是没有列出cpu_insecure),那么很可能您正在运行尚未修补的内核(Ubuntu尚未修补),或者您有一个AMD处理器(对于这种情况,预计不会启用,因为它们不易受攻击)。

目前,在最新的4.15内核中所有CPU都被视为易受攻击


4.15还未对公众发布。 - Aadhil
这是可以的,如果你从kernel.org下载最新的发布候选版本并自己进行编译。 - Jonas Czech
1一个发布候选版本并不是一个正式发布的版本。 - Ruslan
你链接的文章已经更新 - nixpower
2内核4.14.11将为任何x86 CPU设置cpu_insecure;4.14.12及更高版本仅为英特尔CPU设置(包括那些过旧或过原始而不易受攻击的CPU)。即使KPTI被禁用,两者都会进行设置。 - Mark
这个检查似乎不适用于纯净版的Ubuntu 16.04 LTS。 - Andres F.
它列出了bugs: cpu_meltdown spectre_v1 spectre_v2,我不知道这是否意味着CPU容易受到它们的攻击,或者这些漏洞已经被发现并得到了缓解。 - Frédéric Grosshans

你可以运行下面的命令来查看所有可用的缓解措施(不仅限于PTI,还包括其他漏洞):
$ cat /sys/devices/system/cpu/vulnerabilities/*
Mitigation: PTE Inversion
Mitigation: Clear CPU buffers; SMT vulnerable
Mitigation: PTI
Mitigation: Speculative Store Bypass disabled via prctl and seccomp
Mitigation: usercopy/swapgs barriers and __user pointer sanitization
Mitigation: Full generic retpoline, IBPB: conditional, IBRS_FW, STIBP: conditional, RSB filling

太棒了的回答——简洁明了。谢谢你。 - Martin Vysny

我找到了一个很棒的sh脚本,可以测试您系统上的Meltdown/Spectre漏洞。

https://github.com/speed47/spectre-meltdown-checker

脚本会检查您的系统,以确定您的操作系统是否已修补了Meltdown和Spectre漏洞,并告知您这些漏洞是否已得到缓解。

你可以检查/proc/config.gz,看看是否有CONFIG_PAGE_TABLE_ISOLATION=y,这意味着内核是使用KPTI编译的。
这是我打过补丁的Arch Linux系统运行的4.14.11-1版本。
$ zgrep CONFIG_PAGE_TABLE_ISOLATION /proc/config.gz 
CONFIG_PAGE_TABLE_ISOLATION=y

3很遗憾,在Ubuntu内核中,默认情况下,/proc/目录中当前运行的内核配置是未启用的。不过,有一个(不太优雅的)解决方法是改为在/boot/config-$( uname -r )中使用grep命令。 - blubberdiblub
5这只告诉你内核是否使用了KPTI编译,而不是KPTI是否处于活动状态(它可以在启动时关闭,可能也可以在运行时关闭)。 - Mark
如果您通过内核命令行参数明确禁用了KPTI,那么您就不需要检查它是否处于活动状态。 - Raniz

在我的AWS Ubuntu 14.04.5 LTS EC2实例上,我运行了以下命令:
grep CONFIG_PAGE_TABLE_ISOLATION /boot/config-$(uname -r)

应该这样说:
CONFIG_PAGE_TABLE_ISOLATION=y

我进行了更新:

sudo apt-get update && sudo apt-get install linux-image-generic

我也认为这个是可以的。
sudo apt-get update
sudo apt-get dist-upgrade

检查内核版本的方法:
uname -r

必须是3.13.0-139-generic或更高版本。

此方法已在顶部答案中提到。 - wjandrea