页大小更改造成的机器检查错误 - CVE-2018-12207
已更新
此信息是否有帮助?
简介
红帽已了解到在微架构(硬件)实现中存在一个安全漏洞。利用这个漏洞,一个没有特定权限的本地攻击者,可以绕过传统的系统安全控制机制对系统发动安全攻击,从而导致系统范围内的拒绝服务(DoS)问题。
目前,只知道此漏洞仅对基于 Intel 的处理器有影响。此安全漏洞与硬件相关,需要内核更新才能修复。此问题会影响所有 Red Hat Enterprise Linux 8 及更早版本的产品。
技术详情和背景信息
页大小更改造成的机器检查错误问题已被记录为 CVE-2018-12207,它的严重性影响级别被定为Important(重要)。
在 Intel 微处理器中与 ITLB 相关的硬件中发现了一个安全漏洞。ITLB (Translation Lookaside Buffer)也被称为地址翻译缓存,它专门用于可执行指令,用来缓存客户机(及主机)虚拟地址到物理地址的转换数据。它为应用程序提供了一个抽象层,以简化其对系统内存的了解。对于软件,ITLB 的功能是完全透明的,使用它可以大大提高系统性能。
在指令被执行时,它们的线性(或虚拟)地址会被转换为相应的物理地址。对于可执行指令,这种虚拟地址到物理地址的映射信息被缓存在 ITLB 中。
一个具有特权的软件(操作系统或虚拟机监视器(VMM))可能会更改页结构中的页面大小(例如4KB、2MB、1GB)及其他属性。通常情况下,在进行此类页结构更改之后,与更改的页相对应的缓存的 ITLB 条目会被设置为无效。但是,把 ITLB 设置为无效的行为可能会被延迟。这个延迟可能会为攻击者提供一个时间窗口,在该时间窗口中调用指令提取,这将导致处理器使用来自 ITLB 的无效缓存地址转换信息来访问无效物理地址,并导致出现一个机器检查错误异常,从而导致 CPU 进入挂起状态。
在一个客户虚拟机中具有特殊权限的攻击者可以控制客户机页表中的项,并通过设计一个恶意的内核模块来执行特定的指令,以在没有正确清除缓存的 ITLB 项的情况下,创建一些不一致的 ITLB 项。这会导致后续的指令抓取发现多个不兼任的 ITLB 项。在这种情况下会触发一个不可被修正的机器检查错误(Machine Check Error)。这将会使 CPU 进入一个无法恢复的挂起状态,从而导致出现系统范围内的 DoS 问题。
这些缓存的更新需要与处理器内部数据结构进行同步,从而需要使用特定的处理器指令(microcode 中的 INVLPG 和 CR3 更改)。 攻击者可以指示一个恶意的客户系统来请求一个位置的映射,然后修改页的大小,并在没有使用把相关的内部 CPU 缓存设置为无效的相关指令的情况下,使用新的页大小重新发布一个请求。
致谢
该问题由 Intel 内部发现。红帽借此感谢 Deepak Gupta。
额外参考信息
红帽勘误更新政策
缺少 microcode 信息?请参阅: Microcode 特定的 KCS
缺少 TSX 信息?请参阅:TSX 特定的 KCS
受影响的产品
以下版本的红帽产品会受到影响:
Red Hat Enterprise Linux 5
Red Hat Enterprise Linux 6
Red Hat Enterprise Linux 7
Red Hat Enterprise Linux 8
Red Hat Atomic Host
Red Hat Enterprise MRG
OpenShift Container Platform
Red Hat OpenShift Online
Red Hat Virtualization (RHV-H)
Red Hat OpenStack Platform(镜像提供的内核)
虽然基于 Red Hat Enterprise Linux 的容器不会直接受到内核问题的影响,但它们的安全性取决于主机内核环境的安全性。红帽建议您使用最新版本的容器镜像。Container Health Index(Red Hat Container Catalog, 的一部分)可以用来检查红帽容器的安全状态。为了保护所有容器的隐私,需要确保所使用的容器主机(例如,Red Hat Enterprise Linux 或 Atomic Host)已进行了可以解决这个安全问题的更新。红帽已针对这个安全问题发布了一个更新的 Red Hat Enterprise Linux Atomic Host 版本。
诊断您的环境是否存在漏洞
使用检测脚本检查您的系统当前是否存在安全漏洞。您可以下载附带的 GPG 签名来验证脚本的真实性。
采取行动
我们强烈建议,所有运行受影响版本的红帽产品的用户,在相关勘误可用后尽快进行更新。用户需要马上对环境进行相关的更新。
受影响产品的更新
产品 | 软件包 | 公告/更新 |
---|---|---|
Red Hat Enterprise Linux 8 (z-stream) | kernel | RHSA-2019-3832 |
Red Hat Enterprise Linux 8 | kernel-rt | RHSA-2019-3833 |
Red Hat Enterprise Linux 8 | kpatch | |
Red Hat Enterprise Linux 7 (z-stream) | kernel | RHSA-2019-3834 |
Red Hat Enterprise Linux 7 | kernel-rt | RHSA-2019-3835 |
Red Hat Enterprise Linux 7 | kpatch | |
Red Hat Enterprise Linux 6 (z-stream) | kernel | RHSA-2019-3836 |
Red Hat Enterprise MRG 2 | kernel-rt | RHSA-2019-3844 |
Red Hat Enterprise Linux 5 (z-stream) | kernel | 受影响(不会被修复,不在支持范围内) |
Red Hat Virtualization 4 for Red Hat Enterprise Linux 7 | redhat-virtualization-host | RHSA-2019-3860 |
Red Hat Virtualization 4.2 Red Hat Enterprise Linux 7.6 AUS | redhat-virtualization-host | RHSA-2019-3860 |
Red Hat Enterprise MRG 2 | kernel-rt | RHSA-2019:3844 |
Red Hat OpenShift Container Platform 4.1 | machine-os-content-container | |
Red Hat OpenShift Container Platform 4.2 | machine-os-content-container |
影响
性能影响:
对于 RHEL-7 和 RHEL-8,我们测得的性能影响大部分在 0-4% 的范围内。 那些对延迟敏感且只带有较小文本数据的应用程序(如网络基准数据程序),以及带有大量文本数据的应用程序(如数据库应用程序)所受的影响一般都会在这个范围之内。
在 RHEL-7 和 RHEL-8 上,当缓解方案被启用时,KVM 还会在后台将可执行的 4KB 页转换回不可执行的大页,以恢复不再包含特定代码的页的性能。此恢复过程可能会在客户机系统中导致短暂的停顿(大约 10-100 毫秒或更长一些);如果客户机需要运行对延迟敏感或实时的工作负载,红帽建议使用新引入的 kvm.nx_huge_page_recovery_ratio=0 模块参数禁用大页恢复功能。
对于 RHEL-6,性能影响可能会较大,因为文本和数据巨页都会被分解为 4K 的页。
主机/裸机系统
在裸机系统上运行的非特权应用程序一般无法修改(或控制)页结构的条目。例如,没有特权的系统软件应该无法更新页结构中的页大小属性来导致机器检查错误异常。因此不会出现上述的 DoS 问题。
虚拟机管理程序/虚拟客户系统环境:
对于此类 DoS,最重要的攻击向量是通过一个虚拟客户系统在主机(或 hypervisor)中造成一个 MCE(Machine Check Error,机器检查错误),从而对主机上运行的其他众多客户虚拟机系统形成 DoS。因为在云环境中运行的客户机系统及在这些客户机系统上运行的代码不被信任,所以这个问题对于云环境极端严重。
这个问题的缓解方案有两个形式。
1. Intel 提供的一个硬件 microcode 更新用来在 IA32_ARCH_CAPABILITIES MSR 中启用新的 Machine Specific Register (MSR) bit (6)。
IA32_ARCH_CAPABILITIES[PSCHANGE_MC_NO=6]
该 bit(6) 的存在和状态(0/1)代表 CPU 是否会受到此 DoS 问题的影响,以及是否需要在内核/hypervisor 中的软件算法缓解方案。
2. Kernel/KVM 模块的软件更新提供了以下缓解措施,以防止出现此问题
- 使大(或巨)页(> 4KB)不可执行。处理器将无法在不造成到主机内核/hypervisor 的 trap 的情况下执行大页(例如, 2MB、1GB)中的指令。
- 如果大页不可执行,且在该页面上执行了一个指令,则 KVM 会将大页分成多个 4KB 页,并为这些 4KB 页提供可执行权限。
- 在 RHEL-7 和 RHEL-8 中增加了一个新的 kvm 模块和命令行引导参数 kvm.nx_huge_pages=force/off/auto 来启用/禁用这个缓解方案。
- kvm.nx_huge_pages=off 禁用缓解方案,使巨页可执行
- 现有的 "mitigations=off" 内核命令行参数也可以用来在内核引导时禁用此 CVE。
- kvm.nx_huge_pages=auto 只有在 CPU 受影响的情况下启用缓解方案
- kvm.nx_huge_pages=force 启用缓解方案
- 可以使用 /sys/module/kvm/parameters/nx_huge_pages 在运行时启用或禁用这个 CVE,例如
- echo off > /sys/module/kvm/parameters/nx_huge_pages
- echo auto > /sys/module/kvm/parameters/nx_huge_pages
- echo force > /sys/module/kvm/parameters/nx_huge_pages
- kvm.nx_huge_pages=off 禁用缓解方案,使巨页可执行
- 在 RHEL-6 中增加了一个新的 kvm 模块和命令行引导参数 kvm.no_huge_pages=0/1 来启用/禁用这个缓解方案
- kvm.no_huge_pages=0 禁用缓解方案
- kvm.no_huge_pages=1 启用缓解方案
- 这个缓解方案会被默认禁用,且无法在运行时对其进行切换。
3. Kernel/KVM 更新同时还提供了一个 sysfs 界面,用户可以用来查询系统是否存在安全漏洞,以及缓解方案是否已启用。
$ cat /sys/devices/system/cpu/vulnerabilities/itlb_multihit
-Not affected
-KVM Mitigation: Split huge pages
-KVM Vulnerable: no mitigation enabled
缓解方案
对受这个安全漏洞影响的红帽产品的唯一已知缓解方案是应用相关的内核软件包更新或 kpatch。
红帽已经在 KVM 虚拟化技术中创建了修复程序,这些修复程序可阻止客户端系统利用此漏洞。其他虚拟化厂商可能会实施特定的修复程序,请咨询您的虚拟化厂商以获取相关信息。
Comments