Oracle 为 Red Hat 修复 Spectre 漏洞

Red Hat 的 Spectre 漏洞修复目前需要新的微代码才能完全修复,这使得大多数 x86 处理器由于缺乏此更新而容易受到攻击。 Oracle 发布了新的 retpoline 内核,可以在所有兼容的 CPU 上完全修复 Meltdown 和 Spectre 漏洞。我将在此处展示如何在 CentOS 上安装和测试。

Red Hat 社区一直在耐心等待 retpoline 内核的实现,以修复 CVE-2017-5715 (Spectre v2) 并关闭今年成为头条新闻的所有 Meltdown 和 Spectre 漏洞。

Red Hat 最初的修复依赖于微代码更新来进行 v2 漏洞修复,这一决定使得绝大多数支持 AMD64 的处理器处于可被利用的状态。 英特尔的新微代码已被证明尤其有问题;其性能不佳,并且 2018 年 1 月的版本充满了稳定性问题,导致许多系统崩溃。 这是一个针对紧迫问题的糟糕解决方案。

Google 的 retpolines——一种针对 v2 的巧妙方法——本质上是在 Linux 内核中的任何和所有易受攻击的代码中执行利用。 这种方法允许内核在其运行的所有架构中保留对推测执行硬件的完全控制。 它比英特尔的微代码更快、更通用,并且在各方面似乎都是一个更优越的解决方案。

Oracle 似乎是 Red Hat 社区中第一个交付具有 retpoline 支持的 Linux 内核的主要成员。 最新版本的 Unbreakable Enterprise Kernel 预览版 5 (UEKr5) 现在提供了 Meltdown 和 Spectre 的完整修复,而与 CPU 微代码状态无关。 UEKr5 基于主线 Linux 内核的长期支持分支 v4.14 版本。 最新消息,Oracle 发布了 UEKr4 的生产版本,其中也包含 retpolines,详情如下。 对于企业用户和其他对大量服务器有强制补丁计划的用户来说,UEK 现在似乎是所有 CPU 上完全覆盖 Spectre 漏洞的唯一解决方案。 UEK 比“Red Hat 兼容内核” (RHCK) 带来了许多其他优势,但如果 Oracle 仍然是唯一来源,这种补丁响应可能会将 Oracle 深入 Red Hat 社区。

CentOS 安装

CentOSScientificOracle Linux 都基于上游提供商 Red Hat。 CentOS 是一个流行的变体,并且很可能是同类发行版上加载 UEK 的最佳演示。

Red Hat 自身似乎一直在为 retpoline 内核奠定基础。 2018 年 1 月的 gcc 编译器更新暗示了成功的反向移植


# rpm -q --changelog gcc | head -2
* Wed Jan 24 2018 Jeff Law ... 4.8.5-16.2
- retpoline support for spectre mitigation (#1538487)

Oracle 于 2018 年 2 月 25 日宣布了 UEKr5 的 yum 存储库。 详细说明了 Oracle Linux 用户添加此存储库的步骤,但 CentOS 上的安装过程略有不同。 或者,可以从存储库手动下载和安装 RPM。 下面我将描述如何继续使用 yum 存储库。

首先,使用 Oracle 安装说明中找到的确切内容为 yum 定义存储库


echo '[ol7_developer_UEKR5]
name=Oracle Linux $releasever UEK5 Development Packages
 ↪($basearch)
baseurl=http://yum.oracle.com/repo/OracleLinux/OL7/
↪developer_UEKR5/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1' > /etc/yum.repos.d/public-yum-ol7_uek.repo

请注意,上面的 GPG 条目通常在 CentOS 上不存在。 如果您想安装它,则文件的内容必须是


# cat /etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.5 (GNU/Linux)

mQENBEwtJWoBCACpiY2rGA6T0ceBi92X88/QclytVBjtDRohOVzs3pmIPh3ULqsW
G323nmyKbKQBBSjh9OnuO9Y09VG8mzr/w9YV0Ix4cI9/HDTERZ2+TR5u+VNn5J5h
yvwQSN/FEK6oH2+mz7O0yUNleN7UltR4MOEkHIoAhIvv+1AQQKN3OM8oalz+3gv/
zz9rAoQczQzT7QWOtBrsRMZgBrKXY/TpJrpVSO3Hx8CnbhKGtLxCCrxZ5v7hh1ht
3CRAr2+h5bDA9KP6vBZWKEs7NgcvtZFDY6EJc7AoApr3phX9hHE2+snTxe82DkFT
uA69C8wLyjPCoSy+tcaCqJKOZelNy9RN/WKRABEBAAG0RE9yYWNsZSBPU1MgZ3Jv
dXAgKE9wZW4gU291cmNlIFNvZnR3YXJlIGdyb3VwKSA8YnVpbGRAb3NzLm9yYWNs
ZS5jb20+iQE8BBMBAgAmAhsDBgsJCAcDAgQVAggDBBYCAwECHgECF4AFAlNhkUEF
CSaOl9cACgkQcvl7dOxVHwNHFQf9G2ZI5ZH8T1VASvQteTyUR7uNgqXEbJhi9zZO
7EO26+wzkj9EGLmH1COdUApZ1cINsYfGGgUJT5mfcRV3yYZbwc4AZJbJe0z7C5Yu
ZLs5W0ryV4bzIqcWnVphIAOwmxMxIVGz8Cr1Dsyyal7ORgYzdfOppYetwtZ+J+Wn
/oVgFkh9v19l/CltBkRh2SqgUZYfCoELo7hUzLNh7cw2av8rcSUKSH3ra9MvpYfS
ANCnouzbgKix1gD6niT3pm1s5II3VuQ2vEcJunnoRFci9FzLXelTuL00MvuxERr7
Fsqm1/D2JfKDbE09qy5bLWrWaTM6zOFQKN7F2edY2uaukLT6/w==
=Djed
-----END PGP PUBLIC KEY BLOCK-----

假设 GPG 密钥尚未加载,请使用跳过 GPG 检查的标志安装 kernel-uek 软件包


# yum install --nogpgcheck kernel-uek
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: www.gtlib.gatech.edu
 * extras: www.gtlib.gatech.edu
 * updates: www.gtlib.gatech.edu
Resolving Dependencies
--> Running transaction check
---> Package kernel-uek.x86_64 0:4.14.26-1.el7uek will be installed
--> Processing Dependency: linux-firmware >= 20180113-60.git65b1c68
     for package: kernel-uek-4.14.26-1.el7uek.x86_64
--> Running transaction check
---> Package linux-firmware.noarch
      0:20170606-58.gitc990aae.el7_4 will be updated
---> Package linux-firmware.noarch
      0:20180113-60.git65b1c68.el7 will be an update
--> Finished Dependency Resolution

Dependencies Resolved

=========================================================================
 Package         Arch    Version                     Repository
=========================================================================
Installing:
 kernel-uek      x86_64  4.14.26-1.el7uek            ol7_developer_UEKR5
Updating for dependencies:
 linux-firmware  noarch  20180113-60.git65b1c68.el7  ol7_developer_UEKR5

Transaction Summary
=========================================================================
Install  1 Package
Upgrade             ( 1 Dependent package)

Total size: 108 M
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Updating   : linux-firmware-20180113-60.git65b1c68.el7.noarch       1/3
  Installing : kernel-uek-4.14.26-1.el7uek.x86_64                     2/3
  Cleanup    : linux-firmware-20170606-58.gitc990aae.el7_4.noarch     3/3
  Verifying  : kernel-uek-4.14.26-1.el7uek.x86_64                     1/3
  Verifying  : linux-firmware-20180113-60.git65b1c68.el7.noarch       2/3
  Verifying  : linux-firmware-20170606-58.gitc990aae.el7_4.noarch     3/3

Installed:
  kernel-uek.x86_64 0:4.14.26-1.el7uek                                         

Dependency Updated:
  linux-firmware.noarch 0:20180113-60.git65b1c68.el7                           

Complete!

在已删除所有过去内核更新的干净 CentOS 系统上安装后,将存在以下内核软件包


# rpm -qa | grep ^kernel | sort
kernel-3.10.0-693.21.1.el7.x86_64
kernel-devel-3.10.0-693.21.1.el7.x86_64
kernel-headers-3.10.0-693.21.1.el7.x86_64
kernel-tools-3.10.0-693.21.1.el7.x86_64
kernel-tools-libs-3.10.0-693.21.1.el7.x86_64
kernel-uek-4.14.26-1.el7uek.x86_64

重启到此内核。 GRUB 菜单项将显示为


CentOS Linux (4.14.26-1.el7uek.x86_64) 7 (Core)

启动进入 CentOS-uek 后,运行 Stephane Lesimple 的 spectre-meltdown-checker.sh 脚本。 它应该确认 retpoline 支持


# ./spectre-meltdown-checker.sh
Spectre and Meltdown mitigation detection tool v0.35

Checking for vulnerabilities on current system
Kernel is Linux 4.14.26-1.el7uek.x86_64 #2 SMP
 Tue Mar 13 01:14:49 PDT 2018 x86_64
CPU is Intel(R) Core(TM)2 Duo CPU     E6550  @ 2.33GHz

Hardware check
* Hardware support (CPU microcode) for mitigation techniques
  * Indirect Branch Restricted Speculation (IBRS)
    * SPEC_CTRL MSR is available:  NO
    * CPU indicates IBRS capability:  NO
  * Indirect Branch Prediction Barrier (IBPB)
    * PRED_CMD MSR is available:  NO
    * CPU indicates IBPB capability:  NO
  * Single Thread Indirect Branch Predictors (STIBP)
    * SPEC_CTRL MSR is available:  NO
    * CPU indicates STIBP capability:  NO
  * Enhanced IBRS (IBRS_ALL)
    * CPU indicates ARCH_CAPABILITIES MSR availability:  NO
    * ARCH_CAPABILITIES MSR advertises IBRS_ALL capability:  NO
  * CPU explicitly indicates not being vulnerable to Meltdown (RDCL_NO):
     NO
  * CPU microcode is known to cause stability problems:
     NO  (model 15 stepping 11 ucode 0xba)
* CPU vulnerability to the three speculative execution attacks variants
  * Vulnerable to Variant 1:  YES
  * Vulnerable to Variant 2:  YES
  * Vulnerable to Variant 3:  YES

CVE-2017-5753 [bounds check bypass] aka 'Spectre Variant 1'
* Mitigated according to the /sys interface:
     YES  (kernel confirms that the mitigation is active)
* Kernel has array_index_mask_nospec:
     YES  (1 occurrence(s) found of 64 bits array_index_mask_nospec())
* Kernel has the Red Hat/Ubuntu patch:  NO
> STATUS:  NOT VULNERABLE  (Mitigation: __user pointer sanitization)

CVE-2017-5715 [branch target injection] aka 'Spectre Variant 2'
* Mitigated according to the /sys interface:
     YES  (kernel confirms that the mitigation is active)
* Mitigation 1
  * Kernel is compiled with IBRS/IBPB support:  YES
  * Currently enabled features
    * IBRS enabled for Kernel space:  UNKNOWN
    * IBRS enabled for User space:  UNKNOWN
    * IBPB enabled:  UNKNOWN
* Mitigation 2
  * Kernel compiled with retpoline option:  YES
  * Kernel compiled with a retpoline-aware compiler:
     YES  (kernel reports full retpoline compilation)
> STATUS:  NOT VULNERABLE  (Mitigation: Full generic retpoline)

CVE-2017-5754 [rogue data cache load] aka 'Meltdown' aka 'Variant 3'
* Mitigated according to the /sys interface:
     YES  (kernel confirms that the mitigation is active)
* Kernel supports Page Table Isolation (PTI):  YES
* PTI enabled and active:  YES
* Running as a Xen PV DomU:  NO
> STATUS:  NOT VULNERABLE  (Mitigation: PTI)

A false sense of security is worse than no security at all,
 see --disclaimer

在本文提交之日(2018 年 3 月 15 日),Oracle 发布了新的 UEKr4,其中包括 retpoline 支持。 生产环境 Oracle Linux 现在已完全缓解 Meltdown 和 Spectre 漏洞


# ./spectre-meltdown-checker.sh
Spectre and Meltdown mitigation detection tool v0.35

Checking for vulnerabilities on current system
Kernel is Linux 4.1.12-112.16.4.el7uek.x86_64
     #2 SMP Mon Mar 12 23:57:12 PDT 2018 x86_64
CPU is Intel(R) Xeon(R) CPU E5-2609 0 @ 2.40GHz

Hardware check
* Hardware support (CPU microcode) for mitigation techniques
  * Indirect Branch Restricted Speculation (IBRS)
    * SPEC_CTRL MSR is available:  YES
    * CPU indicates IBRS capability:  YES  (SPEC_CTRL feature bit)
  * Indirect Branch Prediction Barrier (IBPB)
    * PRED_CMD MSR is available:  YES
    * CPU indicates IBPB capability:  YES  (SPEC_CTRL feature bit)
  * Single Thread Indirect Branch Predictors (STIBP)
    * SPEC_CTRL MSR is available:  YES
    * CPU indicates STIBP capability:  YES
  * Enhanced IBRS (IBRS_ALL)
    * CPU indicates ARCH_CAPABILITIES MSR availability:  NO
    * ARCH_CAPABILITIES MSR advertises IBRS_ALL capability:  NO
  * CPU explicitly indicates not being vulnerable to Meltdown (RDCL_NO):
  * NO
  * CPU microcode is known to cause stability problems:
     NO  (model 45 stepping 7 ucode 0x713)
* CPU vulnerability to the three speculative execution attacks variants
  * Vulnerable to Variant 1:  YES
  * Vulnerable to Variant 2:  YES
  * Vulnerable to Variant 3:  YES

CVE-2017-5753 [bounds check bypass] aka 'Spectre Variant 1'
* Mitigated according to the /sys interface:
     YES  (kernel confirms that the mitigation is active)
* Kernel has array_index_mask_nospec:  NO
* Kernel has the Red Hat/Ubuntu patch:  YES
> STATUS:  NOT VULNERABLE  (Mitigation: lfence)

CVE-2017-5715 [branch target injection] aka 'Spectre Variant 2'
* Mitigated according to the /sys interface:
     YES  (kernel confirms that the mitigation is active)
* Mitigation 1
  * Kernel is compiled with IBRS/IBPB support:  YES
  * Currently enabled features
    * IBRS enabled for Kernel space:  NO
    * IBRS enabled for User space:  NO
    * IBPB enabled:  YES
* Mitigation 2
  * Kernel compiled with retpoline option:  YES
  * Kernel compiled with a retpoline-aware compiler:
     YES  (kernel reports full retpoline compilation)
> STATUS:  NOT VULNERABLE
     (Mitigation: Full generic retpoline, IBRS_FW, IBPB)


CVE-2017-5754 [rogue data cache load] aka 'Meltdown' aka 'Variant 3'
* Mitigated according to the /sys interface:
     YES  (kernel confirms that the mitigation is active)
* Kernel supports Page Table Isolation (PTI):  YES
* PTI enabled and active:  YES
* Running as a Xen PV DomU:  NO
> STATUS:  NOT VULNERABLE  (Mitigation: PTI)

A false sense of security is worse than no security at all,
     see --disclaimer

UEKr4 的 yum 存储库条目如下所示


[ol7_UEKR4]
name=Latest Unbreakable Enterprise Kernel Release 4 for Oracle Linux
$releasever ($basearch)
baseurl=http://yum.oracle.com/repo/OracleLinux/OL7/UEKR4/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1

UEK 是企业 Linux 中的热门选择,它为 RPM 发行版带来了许多新功能。 这是在受支持的方式下在 Red Hat 衍生操作系统(通常最多运行 v3.10)上实现 v4 性能调整内核的最简单、最稳定的方法。

UEK 特别值得注意,因为它与 Ksplice(与 Oracle 的 RHCK 一样)配合使用,这允许在线内核补丁和升级,而无需重启,并且 Ksplice 甚至可以将此功能扩展到选择用户空间库(glibc 和 OpenSSL)。 此服务免费提供给 Fedora 和 Ubuntu 用户,并作为 CentOS(在脚本化转换为 Oracle Linux 后)和 Red Hat 的付费支持选项提供。 Ksplice 是 Linux 安全升级最古老、最成熟的高可用性选项。

结论

虽然 UEKr5 仍处于预览发布状态,但在关键生产服务器上使用它可能不合适。 UEKr4 现在是需要立即修复漏洞的用户的生产选项。 如果时间允许,同类发行版的用户肯定应该立即开始测试 UEKr5。 那些拥有关键系统的用户应考虑商业(付费)支持,并可能实施 Ksplice 以实现高可用性。

许多同类发行版的客户可能更喜欢保持其系统“纯净”,不受单一供应商的影响。 然而,长期以来,社区一直在使用 EPELElRepoNux 等。 Oracle 只是提供了另一个包含有用软件包的存储库。 EPEL 维护者 Fedora 是由 Red Hat 作为组织发起的;禁止第三方 yum 存储库的管理员可能不了解这些组织之间的历史关系。

由于各种原因,偶尔也会出现对 Oracle 的敌对情绪。 然而,Oracle 仍然是 Linux 社区的重要贡献者,其软件满足了庞大客户群的需求。 具有有用功能的优质软件不应因组织偏见而被拒绝。

无论如何,这对于 Oracle Linux 来说是一项重大成就,Red Hat 社区的所有成员都将从这些努力中受益,无论他们的参与程度如何。 Oracle 不太可能永远保持此处讨论的技术优势,但它已经赢得并值得因这些进步而受到赞誉。

免责声明

本文中表达的观点和意见是作者的观点和意见,不一定反映 Linux Journal 的观点和意见。

Charles Fisher 拥有爱荷华大学的电气工程学位,并在一家财富 500 强矿业和制造公司担任系统和数据库管理员。

加载 Disqus 评论