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


64

当前的Meltdown Intel处理器漏洞目前已通过启用页表隔离来解决。有一个问题如何将其关闭:如何禁用页表隔离以恢复由于英特尔CPU安全漏洞补丁而导致的性能损失?

我的问题是相反的:有没有办法检查正在运行的系统上的PTI机制在系统上是否有效,从而保护了系统?我专门在寻找cat /proc/somethingcat /sys/something,而不是检查内核版本或配置参数等。

Answers:


4

您可以运行以下命令以查看所有可用的缓解措施(不仅针对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

很棒的答案-简而言之。谢谢。
马丁·维斯尼

63
  • 按照Raniz的建议在内核配置中添加CONFIG_PAGE_TABLE_ISOLATION在桌面Ubuntu上无济于事,但在云实例上可能有帮助:

    grep CONFIG_PAGE_TABLE_ISOLATION=y /boot/config-`uname -r` && \
    echo "patched :)" || echo "unpatched :("
    

  • 您可以/proc/cpuinfo按照JonasCz的建议进行检查:

    grep -q "cpu_insecure\|cpu_meltdown\|kaiser" /proc/cpuinfo && echo "patched :)" \
    || echo "unpatched :("
    

  • 或从dmesg(感谢Jason Creighton):

    dmesg | grep -q "Kernel/User page tables isolation: enabled" \
    && echo "patched :)" || echo "unpatched :("
    

  • 您可以从Raphael Carvalho编译测试程序来检测熔毁:

    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漏洞状态的页面。

也有:


3
Ubuntu的更新计划在Januari 9上进行。它们可能会更早着陆,但我不希望它。insights.ubuntu.com/2018/01/04/...
Raniz

4
IMO最好使用“ dmesg | grep隔离”类型的答案。某些发行版(至少是Debian Stretch,也许还有其他发行版)将PTI移植到了较早的内核,但未将/ proc / cpuinfo中的cpu_insecure标志移植。在这些系统上,查看dmesg日志是检查AFAICT的唯一方法。
杰森·克里顿

3
我认为dmesg | grep isolation && echo "patched :)" || echo "unpatched :("所列出的命令不必要地危险:它不会显示实际匹配的行,并且如果匹配其他随机的“隔离”实例,也将愉快地打印“ patched :)” ...
Jaap Eldering

2
我建议反对第二个建议(/proc/cpuinfo为cpu_insecure抓取)。如果将其放入脚本中,并且将来有一个在其微体系结构中已解决问题的CPU,/proc/cpuinfo则不再赘述,cpu_insecure并且脚本将相信即使已修补内核也修补。我也建议反对第三个建议,因为在某些时候输出中可能有一个单词isolationdmesg而没有提及内核页表隔离。
blubberdiblub

4
经过进一步调查,所有这三个建议均被破坏。抓取isolation将匹配Kernel/User page tables isolation: enabledKernel/User page tables isolation: disabled on command line
马克

18

运行以下命令:

dmesg | grep 'page tables isolation'

如果显示已启用,则表示已启用PTI。如果未显示任何内容,或者您​​在终端中看到“禁用”,则表示禁用了PTI。Ubuntu尚未发布该修补程序,因此不会显示任何消息。


...或更高版本的内核消息已将启动消息从内核日志缓冲区中推出。如果您的内核打印出诸如严重的网络数据包之类的低严重性通知,则启动时消息通常不包含在dmesg输出中。查看/var/log/kern.log*它是否退回足够远的距离以显示启动消息。Ubuntu曾经将启动时dmesg输出记录到/var/log/dmesg,但似乎不再这样做了。
彼得·科德斯

14.04,我得到了dmesg: invalid option -- 'w'-H也无效。删除标志对我来说很好,就像这个答案一样
wjandrea '18

/var/log/kern.log on 14.04
eckes

12

您可以使用进行检查cat /proc/cpuinfo,如果它cpu_insecure在“错误”下报告,则表示已启用PTI。

如果为空白(或仅未列出cpu_insecure),则很可能您正在运行尚未打补丁的内核(Ubuntu尚未打补丁),或者您拥有AMD处理器(因此将不启用该处理器) (不是脆弱的)。

当前,所有最新版本4.15内核中的CPU被视为易受攻击


4.15尚未向公众发布
Aadhil RF

就是说,如果您要从kernel.org下载最新的候选版本并自己进行编译。@Mohammedaadhil
JonasCz

1
候选发行版不是发行版。
罗斯兰

您链接的文章已更新
nixpower

2
内核4.14.11将为cpu_insecure任何x86 CPU 设置;12年4月14日和更新将只设置它的Intel CPU(包括那些太老或太原始易受攻击双方将设置它,即使KPTI为禁用。
马克


2

您可以检查/proc/config.gzCONFIG_PAGE_TABLE_ISOLATION=y这意味着内核是使用KPTI编译的。

这是在我运行4.14.11-1的修补过的Arch Linux系统上:

$ zgrep CONFIG_PAGE_TABLE_ISOLATION /proc/config.gz 
CONFIG_PAGE_TABLE_ISOLATION=y

3
不幸的是,/proc/Ubuntu内核默认不启用当前运行的内核的配置。(不太优雅)的解决方法/boot/config-$( uname -r )改为grepping 。
blubberdiblub

5
这只会告诉您内核是否使用KPTI编译,而不是KPTI是否处于活动状态(可以在启动时关闭,也可以在运行时关闭)。
马克

如果您已通过内核命令行参数明确禁用了KPTI,则无需检查它是否处于活动状态。
拉尼兹

1

在我的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通用或更高版本。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.