| .. SPDX-License-Identifier: GPL-2.0 | 
 |  | 
 | Indirect Target Selection (ITS) | 
 | =============================== | 
 |  | 
 | ITS is a vulnerability in some Intel CPUs that support Enhanced IBRS and were | 
 | released before Alder Lake. ITS may allow an attacker to control the prediction | 
 | of indirect branches and RETs located in the lower half of a cacheline. | 
 |  | 
 | ITS is assigned CVE-2024-28956 with a CVSS score of 4.7 (Medium). | 
 |  | 
 | Scope of Impact | 
 | --------------- | 
 | - **eIBRS Guest/Host Isolation**: Indirect branches in KVM/kernel may still be | 
 |   predicted with unintended target corresponding to a branch in the guest. | 
 |  | 
 | - **Intra-Mode BTI**: In-kernel training such as through cBPF or other native | 
 |   gadgets. | 
 |  | 
 | - **Indirect Branch Prediction Barrier (IBPB)**: After an IBPB, indirect | 
 |   branches may still be predicted with targets corresponding to direct branches | 
 |   executed prior to the IBPB. This is fixed by the IPU 2025.1 microcode, which | 
 |   should be available via distro updates. Alternatively microcode can be | 
 |   obtained from Intel's github repository [#f1]_. | 
 |  | 
 | Affected CPUs | 
 | ------------- | 
 | Below is the list of ITS affected CPUs [#f2]_ [#f3]_: | 
 |  | 
 |    ========================  ============  ====================  =============== | 
 |    Common name               Family_Model  eIBRS                 Intra-mode BTI | 
 |                                            Guest/Host Isolation | 
 |    ========================  ============  ====================  =============== | 
 |    SKYLAKE_X (step >= 6)     06_55H        Affected              Affected | 
 |    ICELAKE_X                 06_6AH        Not affected          Affected | 
 |    ICELAKE_D                 06_6CH        Not affected          Affected | 
 |    ICELAKE_L                 06_7EH        Not affected          Affected | 
 |    TIGERLAKE_L               06_8CH        Not affected          Affected | 
 |    TIGERLAKE                 06_8DH        Not affected          Affected | 
 |    KABYLAKE_L (step >= 12)   06_8EH        Affected              Affected | 
 |    KABYLAKE (step >= 13)     06_9EH        Affected              Affected | 
 |    COMETLAKE                 06_A5H        Affected              Affected | 
 |    COMETLAKE_L               06_A6H        Affected              Affected | 
 |    ROCKETLAKE                06_A7H        Not affected          Affected | 
 |    ========================  ============  ====================  =============== | 
 |  | 
 | - All affected CPUs enumerate Enhanced IBRS feature. | 
 | - IBPB isolation is affected on all ITS affected CPUs, and need a microcode | 
 |   update for mitigation. | 
 | - None of the affected CPUs enumerate BHI_CTRL which was introduced in Golden | 
 |   Cove (Alder Lake and Sapphire Rapids). This can help guests to determine the | 
 |   host's affected status. | 
 | - Intel Atom CPUs are not affected by ITS. | 
 |  | 
 | Mitigation | 
 | ---------- | 
 | As only the indirect branches and RETs that have their last byte of instruction | 
 | in the lower half of the cacheline are vulnerable to ITS, the basic idea behind | 
 | the mitigation is to not allow indirect branches in the lower half. | 
 |  | 
 | This is achieved by relying on existing retpoline support in the kernel, and in | 
 | compilers. ITS-vulnerable retpoline sites are runtime patched to point to newly | 
 | added ITS-safe thunks. These safe thunks consists of indirect branch in the | 
 | second half of the cacheline. Not all retpoline sites are patched to thunks, if | 
 | a retpoline site is evaluated to be ITS-safe, it is replaced with an inline | 
 | indirect branch. | 
 |  | 
 | Dynamic thunks | 
 | ~~~~~~~~~~~~~~ | 
 | From a dynamically allocated pool of safe-thunks, each vulnerable site is | 
 | replaced with a new thunk, such that they get a unique address. This could | 
 | improve the branch prediction accuracy. Also, it is a defense-in-depth measure | 
 | against aliasing. | 
 |  | 
 | Note, for simplicity, indirect branches in eBPF programs are always replaced | 
 | with a jump to a static thunk in __x86_indirect_its_thunk_array. If required, | 
 | in future this can be changed to use dynamic thunks. | 
 |  | 
 | All vulnerable RETs are replaced with a static thunk, they do not use dynamic | 
 | thunks. This is because RETs get their prediction from RSB mostly that does not | 
 | depend on source address. RETs that underflow RSB may benefit from dynamic | 
 | thunks. But, RETs significantly outnumber indirect branches, and any benefit | 
 | from a unique source address could be outweighed by the increased icache | 
 | footprint and iTLB pressure. | 
 |  | 
 | Retpoline | 
 | ~~~~~~~~~ | 
 | Retpoline sequence also mitigates ITS-unsafe indirect branches. For this | 
 | reason, when retpoline is enabled, ITS mitigation only relocates the RETs to | 
 | safe thunks. Unless user requested the RSB-stuffing mitigation. | 
 |  | 
 | RSB Stuffing | 
 | ~~~~~~~~~~~~ | 
 | RSB-stuffing via Call Depth Tracking is a mitigation for Retbleed RSB-underflow | 
 | attacks. And it also mitigates RETs that are vulnerable to ITS. | 
 |  | 
 | Mitigation in guests | 
 | ^^^^^^^^^^^^^^^^^^^^ | 
 | All guests deploy ITS mitigation by default, irrespective of eIBRS enumeration | 
 | and Family/Model of the guest. This is because eIBRS feature could be hidden | 
 | from a guest. One exception to this is when a guest enumerates BHI_DIS_S, which | 
 | indicates that the guest is running on an unaffected host. | 
 |  | 
 | To prevent guests from unnecessarily deploying the mitigation on unaffected | 
 | platforms, Intel has defined ITS_NO bit(62) in MSR IA32_ARCH_CAPABILITIES. When | 
 | a guest sees this bit set, it should not enumerate the ITS bug. Note, this bit | 
 | is not set by any hardware, but is **intended for VMMs to synthesize** it for | 
 | guests as per the host's affected status. | 
 |  | 
 | Mitigation options | 
 | ^^^^^^^^^^^^^^^^^^ | 
 | The ITS mitigation can be controlled using the "indirect_target_selection" | 
 | kernel parameter. The available options are: | 
 |  | 
 |    ======== =================================================================== | 
 |    on       (default)  Deploy the "Aligned branch/return thunks" mitigation. | 
 | 	    If spectre_v2 mitigation enables retpoline, aligned-thunks are only | 
 | 	    deployed for the affected RET instructions. Retpoline mitigates | 
 | 	    indirect branches. | 
 |  | 
 |    off      Disable ITS mitigation. | 
 |  | 
 |    vmexit   Equivalent to "=on" if the CPU is affected by guest/host isolation | 
 | 	    part of ITS. Otherwise, mitigation is not deployed. This option is | 
 | 	    useful when host userspace is not in the threat model, and only | 
 | 	    attacks from guest to host are considered. | 
 |  | 
 |    stuff    Deploy RSB-fill mitigation when retpoline is also deployed. | 
 | 	    Otherwise, deploy the default mitigation. When retpoline mitigation | 
 | 	    is enabled, RSB-stuffing via Call-Depth-Tracking also mitigates | 
 | 	    ITS. | 
 |  | 
 |    force    Force the ITS bug and deploy the default mitigation. | 
 |    ======== =================================================================== | 
 |  | 
 | Sysfs reporting | 
 | --------------- | 
 |  | 
 | The sysfs file showing ITS mitigation status is: | 
 |  | 
 |   /sys/devices/system/cpu/vulnerabilities/indirect_target_selection | 
 |  | 
 | Note, microcode mitigation status is not reported in this file. | 
 |  | 
 | The possible values in this file are: | 
 |  | 
 | .. list-table:: | 
 |  | 
 |    * - Not affected | 
 |      - The processor is not vulnerable. | 
 |    * - Vulnerable | 
 |      - System is vulnerable and no mitigation has been applied. | 
 |    * - Vulnerable, KVM: Not affected | 
 |      - System is vulnerable to intra-mode BTI, but not affected by eIBRS | 
 |        guest/host isolation. | 
 |    * - Mitigation: Aligned branch/return thunks | 
 |      - The mitigation is enabled, affected indirect branches and RETs are | 
 |        relocated to safe thunks. | 
 |    * - Mitigation: Retpolines, Stuffing RSB | 
 |      - The mitigation is enabled using retpoline and RSB stuffing. | 
 |  | 
 | References | 
 | ---------- | 
 | .. [#f1] Microcode repository - https://github.com/intel/Intel-Linux-Processor-Microcode-Data-Files | 
 |  | 
 | .. [#f2] Affected Processors list - https://www.intel.com/content/www/us/en/developer/topic-technology/software-security-guidance/processors-affected-consolidated-product-cpu-model.html | 
 |  | 
 | .. [#f3] Affected Processors list (machine readable) - https://github.com/intel/Intel-affected-processor-list |