Linux 上的 Spectre 和 Meltdown CPU 漏洞测试和微码更新
在此页
- 如何检查您的 Linux 服务器是否容易受到 Spectre CPU 错误的影响
- 安装
- 如何检查 Linux 是否存在 Spectre 和 Meltdown 漏洞
- 如何在 Linux 上安装/更新英特尔微码固件?
- 如何找出微码的当前状态
Spectre & Meltdown CPU 漏洞介绍
阻止这些攻击的一种方法是在特定时间清空内存缓存,在攻击者可以访问之前消除泄露的信息。在每次系统调用后下载缓存可能会阻止范围广泛的推测性攻击,但它也会降低系统速度,以至于用户会寻找方法来停用该机制。信息的安全性非常重要,但清空内存缓存会减少宝贵的生产时间,成本太高。
使用推测执行的攻击涉及说服处理器推测非推测执行不会遵循的路线。例如,内核函数可能包含限制检查,以防止代码访问超出数组末尾的范围,这将导致返回错误。使用 Spectre 漏洞的攻击将以推测的方式跳过该检查,访问代码专门编写的不访问的数据。错误返回是一个线索,表明可能发生了不适当的事情,但到那时,损害就会完成。
如何检查您的 Linux 服务器是否容易受到 Spectre CPU 错误的影响
Spectre & Meltdown Checker 是一个 shell 脚本,用于检查以下 Intel/AMD/ARM 和其他 CPU 是否存在错误:
- CVE-2017-5753:绕过边界检查(Spectre 变体 1)。您需要使用修改后的编译器重新编译软件和内核,该编译器在结果代码的适当位置引入 LFENCE 操作码。缓解措施对性能的影响可以忽略不计。
- CVE-2017-5715:分支目标注入(Spectre 变体 2)。缓解措施的性能影响取决于您的 CPU。
- CVE-2017-5754:恶意数据缓存加载 (Meltdown)。您必须安装带有 PTI/KPTI 补丁的更新内核版本。更新内核就足够了。缓解措施对性能的影响从低到中等。
spectre-meltdown-checker.sh 是一个简单的 shell 脚本,用于查明您的 Linux 内核(安装)是否容易受到 3 个“推测执行”CVE 的攻击。
安装
该脚本必须以 root 用户身份运行。您可以在下面查看源代码。使用 wget 命令或 curl 命令获取 Linux 机器上的源代码:
$ cd /tmp/
$ wget https://raw.githubusercontent.com/speed47/spectre-meltdown-checker/master/spectre-meltdown-checker.sh
或者
$ git clone https://github.com/speed47/spectre-meltdown-checker.git
示例输出:
克隆到 spectre-meltdown-checker...远程:计数对象:155,完成。
远程:压缩对象:100% (20/20),完成。
远程:总计 155(增量 18),重复使用 21(增量 10),打包重复使用 125
接收对象:100% (155/155), 49.78 KiB | 145.00 KiB/s,完成。
解决增量:100% (88/88),完成。
如何检查 Linux 是否存在 Spectre 和 Meltdown 漏洞
使用 sudo 命令或 su 命令以 root 用户身份运行脚本:
$ sudo sh spectre-meltdown-checker.sh
Ubuntu Linux 桌面的示例输出:
我的 CentOS 7.x 服务器的另一个输出,其中使用内核修补了 Meltdown/Spectre v1:
$ sudo sh spectre-meltdown-checker.sh
如何在 Linux 上安装/更新 Intel 微码固件?
微代码不过是 Intel 或 AMD 提供的 CPU 固件。 Linux 内核可以在启动时更新 CPU 的固件而无需更新 BIOS。处理器微码存储在 RAM 中,内核在每次启动时更新微码。这些来自 Intel/AMD 的微代码更新需要修复错误或应用勘误表以避免 CPU 错误。此页面显示如何使用包管理器或英特尔在 Linux 上提供的处理器微码更新来安装 AMD 或英特尔微码更新。
如何找出微码的当前状态
以 root 用户身份运行以下命令:
# dmesg | grep microcode
示例输出:
如何使用包管理器在 Linux 上安装英特尔微码固件
为 x86/amd64 转换和部署 CPU 微代码更新的工具随 Linux 一起提供。在 Linux 上安装 AMD 或 Intel 微码固件的过程如下:
- 打开终端应用
- Debian/Ubuntu Linux 用户类型:sudo apt install intel-microcode
- CentOS/RHEL Linux 用户类型:sudo yum install microcode_ctl
流行的 Linux 发行版的包名称如下:
- microcode_ctl and linux-firmware – CentOS/RHEL 微码更新包
- intel-microcode – 英特尔 CPU 的 Debian/Ubuntu 和克隆微码更新包
- amd64-microcode – Debian/Ubuntu 和克隆 AMD CPU 的微码固件
- linux-firmware – 适用于 AMD CPU 的 Arch Linux 微码固件(默认安装,您无需采取任何操作)
- intel-ucode – 用于 Intel CPU 的 Arch Linux 微码固件
- microcode_ctl、linux-firmware 和 ucode-intel – Suse/OpenSUSE Linux 微代码更新包
警告:在某些情况下,微码更新可能会导致启动问题,例如服务器挂起或在启动时自动重置。风险自负。
例子
在适用于 Intel CPU 的 Debian/Ubuntu Linux 上键入以下 apt 命令/apt-get 命令:
$ sudo apt-get install intel-microcode
示例输出:
您必须重新启动盒子才能激活微码更新:
$ sudo reboot
重启后验证:
# dmesg | grep 'microcode'
如果您使用的是 RHEL/CentOS,请尝试使用 yum 命令安装或更新以下两个软件包:
$ sudo yum install linux-firmware microcode_ctl
$ sudo reboot
$ sudo dmesg | grep 'microcode'
如何更新/安装从英特尔网站下载的微代码?
仅在您的供应商推荐时才使用以下方法,否则请坚持使用上述 Linux 软件包。大多数 Linux 发行版维护者通过包管理器更新微代码。许多用户测试过包管理器方法是安全的。
如何为 Linux(20180108 版)安装 Intel 处理器微码 blob?
访问 AMD 或 Intel 网站获取最新的微码固件。首先使用 tar 命令提取它:
$ mkdir firmware
$ cd firmware
$ tar xvf ~/path/to/file/microcode-20180108.tgz
$ ls –l
示例输出:
确保 /sys/devices/system/cpu/microcode/reload 退出:
$ ls -l /sys/devices/system/cpu/microcode/reload
您必须使用 cp 命令将所有文件从 intel-ucode 复制到 /lib/firmware/intel-ucode/:
$ sudo cp -v intel-ucode/* /lib/firmware/intel-ucode/
您刚刚将 intel-ucode 目录复制到 /lib/firmware/。将reload接口写入1,重新加载微码文件:
# echo 1 > /sys/devices/system/cpu/microcode/reload
更新现有的 initramfs,以便下次通过内核加载它:
$ sudo update-initramfs -u
$ sudo reboot
验证微码是否在启动时更新或通过 echo 命令重新加载:
# dmesg | grep microcode
就这些。您刚刚更新了 Intel CPU 的固件。