| .. SPDX-License-Identifier: GPL-2.0 |
| |
| ======================= |
| RSB-related mitigations |
| ======================= |
| |
| .. warning:: |
| Please keep this document up-to-date, otherwise you will be |
| volunteered to update it and convert it to a very long comment in |
| bugs.c! |
| |
| Since 2018 there have been many Spectre CVEs related to the Return Stack |
| Buffer (RSB) (sometimes referred to as the Return Address Stack (RAS) or |
| Return Address Predictor (RAP) on AMD). |
| |
| Information about these CVEs and how to mitigate them is scattered |
| amongst a myriad of microarchitecture-specific documents. |
| |
| This document attempts to consolidate all the relevant information in |
| once place and clarify the reasoning behind the current RSB-related |
| mitigations. It's meant to be as concise as possible, focused only on |
| the current kernel mitigations: what are the RSB-related attack vectors |
| and how are they currently being mitigated? |
| |
| It's *not* meant to describe how the RSB mechanism operates or how the |
| exploits work. More details about those can be found in the references |
| below. |
| |
| Rather, this is basically a glorified comment, but too long to actually |
| be one. So when the next CVE comes along, a kernel developer can |
| quickly refer to this as a refresher to see what we're actually doing |
| and why. |
| |
| At a high level, there are two classes of RSB attacks: RSB poisoning |
| (Intel and AMD) and RSB underflow (Intel only). They must each be |
| considered individually for each attack vector (and microarchitecture |
| where applicable). |
| |
| ---- |
| |
| RSB poisoning (Intel and AMD) |
| ============================= |
| |
| SpectreRSB |
| ~~~~~~~~~~ |
| |
| RSB poisoning is a technique used by SpectreRSB [#spectre-rsb]_ where |
| an attacker poisons an RSB entry to cause a victim's return instruction |
| to speculate to an attacker-controlled address. This can happen when |
| there are unbalanced CALLs/RETs after a context switch or VMEXIT. |
| |
| * All attack vectors can potentially be mitigated by flushing out any |
| poisoned RSB entries using an RSB filling sequence |
| [#intel-rsb-filling]_ [#amd-rsb-filling]_ when transitioning between |
| untrusted and trusted domains. But this has a performance impact and |
| should be avoided whenever possible. |
| |
| .. DANGER:: |
| **FIXME**: Currently we're flushing 32 entries. However, some CPU |
| models have more than 32 entries. The loop count needs to be |
| increased for those. More detailed information is needed about RSB |
| sizes. |
| |
| * On context switch, the user->user mitigation requires ensuring the |
| RSB gets filled or cleared whenever IBPB gets written [#cond-ibpb]_ |
| during a context switch: |
| |
| * AMD: |
| On Zen 4+, IBPB (or SBPB [#amd-sbpb]_ if used) clears the RSB. |
| This is indicated by IBPB_RET in CPUID [#amd-ibpb-rsb]_. |
| |
| On Zen < 4, the RSB filling sequence [#amd-rsb-filling]_ must be |
| always be done in addition to IBPB [#amd-ibpb-no-rsb]_. This is |
| indicated by X86_BUG_IBPB_NO_RET. |
| |
| * Intel: |
| IBPB always clears the RSB: |
| |
| "Software that executed before the IBPB command cannot control |
| the predicted targets of indirect branches executed after the |
| command on the same logical processor. The term indirect branch |
| in this context includes near return instructions, so these |
| predicted targets may come from the RSB." [#intel-ibpb-rsb]_ |
| |
| * On context switch, user->kernel attacks are prevented by SMEP. User |
| space can only insert user space addresses into the RSB. Even |
| non-canonical addresses can't be inserted due to the page gap at the |
| end of the user canonical address space reserved by TASK_SIZE_MAX. |
| A SMEP #PF at instruction fetch prevents the kernel from speculatively |
| executing user space. |
| |
| * AMD: |
| "Finally, branches that are predicted as 'ret' instructions get |
| their predicted targets from the Return Address Predictor (RAP). |
| AMD recommends software use a RAP stuffing sequence (mitigation |
| V2-3 in [2]) and/or Supervisor Mode Execution Protection (SMEP) |
| to ensure that the addresses in the RAP are safe for |
| speculation. Collectively, we refer to these mitigations as "RAP |
| Protection"." [#amd-smep-rsb]_ |
| |
| * Intel: |
| "On processors with enhanced IBRS, an RSB overwrite sequence may |
| not suffice to prevent the predicted target of a near return |
| from using an RSB entry created in a less privileged predictor |
| mode. Software can prevent this by enabling SMEP (for |
| transitions from user mode to supervisor mode) and by having |
| IA32_SPEC_CTRL.IBRS set during VM exits." [#intel-smep-rsb]_ |
| |
| * On VMEXIT, guest->host attacks are mitigated by eIBRS (and PBRSB |
| mitigation if needed): |
| |
| * AMD: |
| "When Automatic IBRS is enabled, the internal return address |
| stack used for return address predictions is cleared on VMEXIT." |
| [#amd-eibrs-vmexit]_ |
| |
| * Intel: |
| "On processors with enhanced IBRS, an RSB overwrite sequence may |
| not suffice to prevent the predicted target of a near return |
| from using an RSB entry created in a less privileged predictor |
| mode. Software can prevent this by enabling SMEP (for |
| transitions from user mode to supervisor mode) and by having |
| IA32_SPEC_CTRL.IBRS set during VM exits. Processors with |
| enhanced IBRS still support the usage model where IBRS is set |
| only in the OS/VMM for OSes that enable SMEP. To do this, such |
| processors will ensure that guest behavior cannot control the |
| RSB after a VM exit once IBRS is set, even if IBRS was not set |
| at the time of the VM exit." [#intel-eibrs-vmexit]_ |
| |
| Note that some Intel CPUs are susceptible to Post-barrier Return |
| Stack Buffer Predictions (PBRSB) [#intel-pbrsb]_, where the last |
| CALL from the guest can be used to predict the first unbalanced RET. |
| In this case the PBRSB mitigation is needed in addition to eIBRS. |
| |
| AMD RETBleed / SRSO / Branch Type Confusion |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| On AMD, poisoned RSB entries can also be created by the AMD RETBleed |
| variant [#retbleed-paper]_ [#amd-btc]_ or by Speculative Return Stack |
| Overflow [#amd-srso]_ (Inception [#inception-paper]_). The kernel |
| protects itself by replacing every RET in the kernel with a branch to a |
| single safe RET. |
| |
| ---- |
| |
| RSB underflow (Intel only) |
| ========================== |
| |
| RSB Alternate (RSBA) ("Intel Retbleed") |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| Some Intel Skylake-generation CPUs are susceptible to the Intel variant |
| of RETBleed [#retbleed-paper]_ (Return Stack Buffer Underflow |
| [#intel-rsbu]_). If a RET is executed when the RSB buffer is empty due |
| to mismatched CALLs/RETs or returning from a deep call stack, the branch |
| predictor can fall back to using the Branch Target Buffer (BTB). If a |
| user forces a BTB collision then the RET can speculatively branch to a |
| user-controlled address. |
| |
| * Note that RSB filling doesn't fully mitigate this issue. If there |
| are enough unbalanced RETs, the RSB may still underflow and fall back |
| to using a poisoned BTB entry. |
| |
| * On context switch, user->user underflow attacks are mitigated by the |
| conditional IBPB [#cond-ibpb]_ on context switch which effectively |
| clears the BTB: |
| |
| * "The indirect branch predictor barrier (IBPB) is an indirect branch |
| control mechanism that establishes a barrier, preventing software |
| that executed before the barrier from controlling the predicted |
| targets of indirect branches executed after the barrier on the same |
| logical processor." [#intel-ibpb-btb]_ |
| |
| * On context switch and VMEXIT, user->kernel and guest->host RSB |
| underflows are mitigated by IBRS or eIBRS: |
| |
| * "Enabling IBRS (including enhanced IBRS) will mitigate the "RSBU" |
| attack demonstrated by the researchers. As previously documented, |
| Intel recommends the use of enhanced IBRS, where supported. This |
| includes any processor that enumerates RRSBA but not RRSBA_DIS_S." |
| [#intel-rsbu]_ |
| |
| However, note that eIBRS and IBRS do not mitigate intra-mode attacks. |
| Like RRSBA below, this is mitigated by clearing the BHB on kernel |
| entry. |
| |
| As an alternative to classic IBRS, call depth tracking (combined with |
| retpolines) can be used to track kernel returns and fill the RSB when |
| it gets close to being empty. |
| |
| Restricted RSB Alternate (RRSBA) |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| Some newer Intel CPUs have Restricted RSB Alternate (RRSBA) behavior, |
| which, similar to RSBA described above, also falls back to using the BTB |
| on RSB underflow. The only difference is that the predicted targets are |
| restricted to the current domain when eIBRS is enabled: |
| |
| * "Restricted RSB Alternate (RRSBA) behavior allows alternate branch |
| predictors to be used by near RET instructions when the RSB is |
| empty. When eIBRS is enabled, the predicted targets of these |
| alternate predictors are restricted to those belonging to the |
| indirect branch predictor entries of the current prediction domain. |
| [#intel-eibrs-rrsba]_ |
| |
| When a CPU with RRSBA is vulnerable to Branch History Injection |
| [#bhi-paper]_ [#intel-bhi]_, an RSB underflow could be used for an |
| intra-mode BTI attack. This is mitigated by clearing the BHB on |
| kernel entry. |
| |
| However if the kernel uses retpolines instead of eIBRS, it needs to |
| disable RRSBA: |
| |
| * "Where software is using retpoline as a mitigation for BHI or |
| intra-mode BTI, and the processor both enumerates RRSBA and |
| enumerates RRSBA_DIS controls, it should disable this behavior." |
| [#intel-retpoline-rrsba]_ |
| |
| ---- |
| |
| References |
| ========== |
| |
| .. [#spectre-rsb] `Spectre Returns! Speculation Attacks using the Return Stack Buffer <https://arxiv.org/pdf/1807.07940.pdf>`_ |
| |
| .. [#intel-rsb-filling] "Empty RSB Mitigation on Skylake-generation" in `Retpoline: A Branch Target Injection Mitigation <https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/technical-documentation/retpoline-branch-target-injection-mitigation.html#inpage-nav-5-1>`_ |
| |
| .. [#amd-rsb-filling] "Mitigation V2-3" in `Software Techniques for Managing Speculation <https://www.amd.com/content/dam/amd/en/documents/processor-tech-docs/programmer-references/software-techniques-for-managing-speculation.pdf>`_ |
| |
| .. [#cond-ibpb] Whether IBPB is written depends on whether the prev and/or next task is protected from Spectre attacks. It typically requires opting in per task or system-wide. For more details see the documentation for the ``spectre_v2_user`` cmdline option in Documentation/admin-guide/kernel-parameters.txt. |
| |
| .. [#amd-sbpb] IBPB without flushing of branch type predictions. Only exists for AMD. |
| |
| .. [#amd-ibpb-rsb] "Function 8000_0008h -- Processor Capacity Parameters and Extended Feature Identification" in `AMD64 Architecture Programmer's Manual Volume 3: General-Purpose and System Instructions <https://www.amd.com/content/dam/amd/en/documents/processor-tech-docs/programmer-references/24594.pdf>`_. SBPB behaves the same way according to `this email <https://lore.kernel.org/5175b163a3736ca5fd01cedf406735636c99a>`_. |
| |
| .. [#amd-ibpb-no-rsb] `Spectre Attacks: Exploiting Speculative Execution <https://comsec.ethz.ch/wp-content/files/ibpb_sp25.pdf>`_ |
| |
| .. [#intel-ibpb-rsb] "Introduction" in `Post-barrier Return Stack Buffer Predictions / CVE-2022-26373 / INTEL-SA-00706 <https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/advisory-guidance/post-barrier-return-stack-buffer-predictions.html>`_ |
| |
| .. [#amd-smep-rsb] "Existing Mitigations" in `Technical Guidance for Mitigating Branch Type Confusion <https://www.amd.com/content/dam/amd/en/documents/resources/technical-guidance-for-mitigating-branch-type-confusion.pdf>`_ |
| |
| .. [#intel-smep-rsb] "Enhanced IBRS" in `Indirect Branch Restricted Speculation <https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/technical-documentation/indirect-branch-restricted-speculation.html>`_ |
| |
| .. [#amd-eibrs-vmexit] "Extended Feature Enable Register (EFER)" in `AMD64 Architecture Programmer's Manual Volume 2: System Programming <https://www.amd.com/content/dam/amd/en/documents/processor-tech-docs/programmer-references/24593.pdf>`_ |
| |
| .. [#intel-eibrs-vmexit] "Enhanced IBRS" in `Indirect Branch Restricted Speculation <https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/technical-documentation/indirect-branch-restricted-speculation.html>`_ |
| |
| .. [#intel-pbrsb] `Post-barrier Return Stack Buffer Predictions / CVE-2022-26373 / INTEL-SA-00706 <https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/advisory-guidance/post-barrier-return-stack-buffer-predictions.html>`_ |
| |
| .. [#retbleed-paper] `RETBleed: Arbitrary Speculative Code Execution with Return Instruction <https://comsec.ethz.ch/wp-content/files/retbleed_sec22.pdf>`_ |
| |
| .. [#amd-btc] `Technical Guidance for Mitigating Branch Type Confusion <https://www.amd.com/content/dam/amd/en/documents/resources/technical-guidance-for-mitigating-branch-type-confusion.pdf>`_ |
| |
| .. [#amd-srso] `Technical Update Regarding Speculative Return Stack Overflow <https://www.amd.com/content/dam/amd/en/documents/corporate/cr/speculative-return-stack-overflow-whitepaper.pdf>`_ |
| |
| .. [#inception-paper] `Inception: Exposing New Attack Surfaces with Training in Transient Execution <https://comsec.ethz.ch/wp-content/files/inception_sec23.pdf>`_ |
| |
| .. [#intel-rsbu] `Return Stack Buffer Underflow / Return Stack Buffer Underflow / CVE-2022-29901, CVE-2022-28693 / INTEL-SA-00702 <https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/advisory-guidance/return-stack-buffer-underflow.html>`_ |
| |
| .. [#intel-ibpb-btb] `Indirect Branch Predictor Barrier' <https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/technical-documentation/indirect-branch-predictor-barrier.html>`_ |
| |
| .. [#intel-eibrs-rrsba] "Guidance for RSBU" in `Return Stack Buffer Underflow / Return Stack Buffer Underflow / CVE-2022-29901, CVE-2022-28693 / INTEL-SA-00702 <https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/advisory-guidance/return-stack-buffer-underflow.html>`_ |
| |
| .. [#bhi-paper] `Branch History Injection: On the Effectiveness of Hardware Mitigations Against Cross-Privilege Spectre-v2 Attacks <http://download.vusec.net/papers/bhi-spectre-bhb_sec22.pdf>`_ |
| |
| .. [#intel-bhi] `Branch History Injection and Intra-mode Branch Target Injection / CVE-2022-0001, CVE-2022-0002 / INTEL-SA-00598 <https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/technical-documentation/branch-history-injection.html>`_ |
| |
| .. [#intel-retpoline-rrsba] "Retpoline" in `Branch History Injection and Intra-mode Branch Target Injection / CVE-2022-0001, CVE-2022-0002 / INTEL-SA-00598 <https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/technical-documentation/branch-history-injection.html>`_ |