|  | iTLB multihit | 
|  | ============= | 
|  |  | 
|  | iTLB multihit is an erratum where some processors may incur a machine check | 
|  | error, possibly resulting in an unrecoverable CPU lockup, when an | 
|  | instruction fetch hits multiple entries in the instruction TLB. This can | 
|  | occur when the page size is changed along with either the physical address | 
|  | or cache type. A malicious guest running on a virtualized system can | 
|  | exploit this erratum to perform a denial of service attack. | 
|  |  | 
|  |  | 
|  | Affected processors | 
|  | ------------------- | 
|  |  | 
|  | Variations of this erratum are present on most Intel Core and Xeon processor | 
|  | models. The erratum is not present on: | 
|  |  | 
|  | - non-Intel processors | 
|  |  | 
|  | - Some Atoms (Airmont, Bonnell, Goldmont, GoldmontPlus, Saltwell, Silvermont) | 
|  |  | 
|  | - Intel processors that have the PSCHANGE_MC_NO bit set in the | 
|  | IA32_ARCH_CAPABILITIES MSR. | 
|  |  | 
|  |  | 
|  | Related CVEs | 
|  | ------------ | 
|  |  | 
|  | The following CVE entry is related to this issue: | 
|  |  | 
|  | ==============  ================================================= | 
|  | CVE-2018-12207  Machine Check Error Avoidance on Page Size Change | 
|  | ==============  ================================================= | 
|  |  | 
|  |  | 
|  | Problem | 
|  | ------- | 
|  |  | 
|  | Privileged software, including OS and virtual machine managers (VMM), are in | 
|  | charge of memory management. A key component in memory management is the control | 
|  | of the page tables. Modern processors use virtual memory, a technique that creates | 
|  | the illusion of a very large memory for processors. This virtual space is split | 
|  | into pages of a given size. Page tables translate virtual addresses to physical | 
|  | addresses. | 
|  |  | 
|  | To reduce latency when performing a virtual to physical address translation, | 
|  | processors include a structure, called TLB, that caches recent translations. | 
|  | There are separate TLBs for instruction (iTLB) and data (dTLB). | 
|  |  | 
|  | Under this errata, instructions are fetched from a linear address translated | 
|  | using a 4 KB translation cached in the iTLB. Privileged software modifies the | 
|  | paging structure so that the same linear address using large page size (2 MB, 4 | 
|  | MB, 1 GB) with a different physical address or memory type.  After the page | 
|  | structure modification but before the software invalidates any iTLB entries for | 
|  | the linear address, a code fetch that happens on the same linear address may | 
|  | cause a machine-check error which can result in a system hang or shutdown. | 
|  |  | 
|  |  | 
|  | Attack scenarios | 
|  | ---------------- | 
|  |  | 
|  | Attacks against the iTLB multihit erratum can be mounted from malicious | 
|  | guests in a virtualized system. | 
|  |  | 
|  |  | 
|  | iTLB multihit system information | 
|  | -------------------------------- | 
|  |  | 
|  | The Linux kernel provides a sysfs interface to enumerate the current iTLB | 
|  | multihit status of the system:whether the system is vulnerable and which | 
|  | mitigations are active. The relevant sysfs file is: | 
|  |  | 
|  | /sys/devices/system/cpu/vulnerabilities/itlb_multihit | 
|  |  | 
|  | The possible values in this file are: | 
|  |  | 
|  | .. list-table:: | 
|  |  | 
|  | * - Not affected | 
|  | - The processor is not vulnerable. | 
|  | * - KVM: Mitigation: Split huge pages | 
|  | - Software changes mitigate this issue. | 
|  | * - KVM: Vulnerable | 
|  | - The processor is vulnerable, but no mitigation enabled | 
|  |  | 
|  |  | 
|  | Enumeration of the erratum | 
|  | -------------------------------- | 
|  |  | 
|  | A new bit has been allocated in the IA32_ARCH_CAPABILITIES (PSCHANGE_MC_NO) msr | 
|  | and will be set on CPU's which are mitigated against this issue. | 
|  |  | 
|  | =======================================   ===========   =============================== | 
|  | IA32_ARCH_CAPABILITIES MSR                Not present   Possibly vulnerable,check model | 
|  | IA32_ARCH_CAPABILITIES[PSCHANGE_MC_NO]    '0'           Likely vulnerable,check model | 
|  | IA32_ARCH_CAPABILITIES[PSCHANGE_MC_NO]    '1'           Not vulnerable | 
|  | =======================================   ===========   =============================== | 
|  |  | 
|  |  | 
|  | Mitigation mechanism | 
|  | ------------------------- | 
|  |  | 
|  | This erratum can be mitigated by restricting the use of large page sizes to | 
|  | non-executable pages.  This forces all iTLB entries to be 4K, and removes | 
|  | the possibility of multiple hits. | 
|  |  | 
|  | In order to mitigate the vulnerability, KVM initially marks all huge pages | 
|  | as non-executable. If the guest attempts to execute in one of those pages, | 
|  | the page is broken down into 4K pages, which are then marked executable. | 
|  |  | 
|  | If EPT is disabled or not available on the host, KVM is in control of TLB | 
|  | flushes and the problematic situation cannot happen.  However, the shadow | 
|  | EPT paging mechanism used by nested virtualization is vulnerable, because | 
|  | the nested guest can trigger multiple iTLB hits by modifying its own | 
|  | (non-nested) page tables.  For simplicity, KVM will make large pages | 
|  | non-executable in all shadow paging modes. | 
|  |  | 
|  | Mitigation control on the kernel command line and KVM - module parameter | 
|  | ------------------------------------------------------------------------ | 
|  |  | 
|  | The KVM hypervisor mitigation mechanism for marking huge pages as | 
|  | non-executable can be controlled with a module parameter "nx_huge_pages=". | 
|  | The kernel command line allows to control the iTLB multihit mitigations at | 
|  | boot time with the option "kvm.nx_huge_pages=". | 
|  |  | 
|  | The valid arguments for these options are: | 
|  |  | 
|  | ==========  ================================================================ | 
|  | force       Mitigation is enabled. In this case, the mitigation implements | 
|  | non-executable huge pages in Linux kernel KVM module. All huge | 
|  | pages in the EPT are marked as non-executable. | 
|  | If a guest attempts to execute in one of those pages, the page is | 
|  | broken down into 4K pages, which are then marked executable. | 
|  |  | 
|  | off	      Mitigation is disabled. | 
|  |  | 
|  | auto        Enable mitigation only if the platform is affected and the kernel | 
|  | was not booted with the "mitigations=off" command line parameter. | 
|  | This is the default option. | 
|  | ==========  ================================================================ | 
|  |  | 
|  |  | 
|  | Mitigation selection guide | 
|  | -------------------------- | 
|  |  | 
|  | 1. No virtualization in use | 
|  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | 
|  |  | 
|  | The system is protected by the kernel unconditionally and no further | 
|  | action is required. | 
|  |  | 
|  | 2. Virtualization with trusted guests | 
|  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | 
|  |  | 
|  | If the guest comes from a trusted source, you may assume that the guest will | 
|  | not attempt to maliciously exploit these errata and no further action is | 
|  | required. | 
|  |  | 
|  | 3. Virtualization with untrusted guests | 
|  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | 
|  | If the guest comes from an untrusted source, the guest host kernel will need | 
|  | to apply iTLB multihit mitigation via the kernel command line or kvm | 
|  | module parameter. |