123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769 |
- .. SPDX-License-Identifier: GPL-2.0
- Spectre Side Channels
- =====================
- Spectre is a class of side channel attacks that exploit branch prediction
- and speculative execution on modern CPUs to read memory, possibly
- bypassing access controls. Speculative execution side channel exploits
- do not modify memory but attempt to infer privileged data in the memory.
- This document covers Spectre variant 1 and Spectre variant 2.
- Affected processors
- -------------------
- Speculative execution side channel methods affect a wide range of modern
- high performance processors, since most modern high speed processors
- use branch prediction and speculative execution.
- The following CPUs are vulnerable:
- - Intel Core, Atom, Pentium, and Xeon processors
- - AMD Phenom, EPYC, and Zen processors
- - IBM POWER and zSeries processors
- - Higher end ARM processors
- - Apple CPUs
- - Higher end MIPS CPUs
- - Likely most other high performance CPUs. Contact your CPU vendor for details.
- Whether a processor is affected or not can be read out from the Spectre
- vulnerability files in sysfs. See :ref:`spectre_sys_info`.
- Related CVEs
- ------------
- The following CVE entries describe Spectre variants:
- ============= ======================= ==========================
- CVE-2017-5753 Bounds check bypass Spectre variant 1
- CVE-2017-5715 Branch target injection Spectre variant 2
- CVE-2019-1125 Spectre v1 swapgs Spectre variant 1 (swapgs)
- ============= ======================= ==========================
- Problem
- -------
- CPUs use speculative operations to improve performance. That may leave
- traces of memory accesses or computations in the processor's caches,
- buffers, and branch predictors. Malicious software may be able to
- influence the speculative execution paths, and then use the side effects
- of the speculative execution in the CPUs' caches and buffers to infer
- privileged data touched during the speculative execution.
- Spectre variant 1 attacks take advantage of speculative execution of
- conditional branches, while Spectre variant 2 attacks use speculative
- execution of indirect branches to leak privileged memory.
- See :ref:`[1] <spec_ref1>` :ref:`[5] <spec_ref5>` :ref:`[7] <spec_ref7>`
- :ref:`[10] <spec_ref10>` :ref:`[11] <spec_ref11>`.
- Spectre variant 1 (Bounds Check Bypass)
- ---------------------------------------
- The bounds check bypass attack :ref:`[2] <spec_ref2>` takes advantage
- of speculative execution that bypasses conditional branch instructions
- used for memory access bounds check (e.g. checking if the index of an
- array results in memory access within a valid range). This results in
- memory accesses to invalid memory (with out-of-bound index) that are
- done speculatively before validation checks resolve. Such speculative
- memory accesses can leave side effects, creating side channels which
- leak information to the attacker.
- There are some extensions of Spectre variant 1 attacks for reading data
- over the network, see :ref:`[12] <spec_ref12>`. However such attacks
- are difficult, low bandwidth, fragile, and are considered low risk.
- Note that, despite "Bounds Check Bypass" name, Spectre variant 1 is not
- only about user-controlled array bounds checks. It can affect any
- conditional checks. The kernel entry code interrupt, exception, and NMI
- handlers all have conditional swapgs checks. Those may be problematic
- in the context of Spectre v1, as kernel code can speculatively run with
- a user GS.
- Spectre variant 2 (Branch Target Injection)
- -------------------------------------------
- The branch target injection attack takes advantage of speculative
- execution of indirect branches :ref:`[3] <spec_ref3>`. The indirect
- branch predictors inside the processor used to guess the target of
- indirect branches can be influenced by an attacker, causing gadget code
- to be speculatively executed, thus exposing sensitive data touched by
- the victim. The side effects left in the CPU's caches during speculative
- execution can be measured to infer data values.
- .. _poison_btb:
- In Spectre variant 2 attacks, the attacker can steer speculative indirect
- branches in the victim to gadget code by poisoning the branch target
- buffer of a CPU used for predicting indirect branch addresses. Such
- poisoning could be done by indirect branching into existing code,
- with the address offset of the indirect branch under the attacker's
- control. Since the branch prediction on impacted hardware does not
- fully disambiguate branch address and uses the offset for prediction,
- this could cause privileged code's indirect branch to jump to a gadget
- code with the same offset.
- The most useful gadgets take an attacker-controlled input parameter (such
- as a register value) so that the memory read can be controlled. Gadgets
- without input parameters might be possible, but the attacker would have
- very little control over what memory can be read, reducing the risk of
- the attack revealing useful data.
- One other variant 2 attack vector is for the attacker to poison the
- return stack buffer (RSB) :ref:`[13] <spec_ref13>` to cause speculative
- subroutine return instruction execution to go to a gadget. An attacker's
- imbalanced subroutine call instructions might "poison" entries in the
- return stack buffer which are later consumed by a victim's subroutine
- return instructions. This attack can be mitigated by flushing the return
- stack buffer on context switch, or virtual machine (VM) exit.
- On systems with simultaneous multi-threading (SMT), attacks are possible
- from the sibling thread, as level 1 cache and branch target buffer
- (BTB) may be shared between hardware threads in a CPU core. A malicious
- program running on the sibling thread may influence its peer's BTB to
- steer its indirect branch speculations to gadget code, and measure the
- speculative execution's side effects left in level 1 cache to infer the
- victim's data.
- Attack scenarios
- ----------------
- The following list of attack scenarios have been anticipated, but may
- not cover all possible attack vectors.
- 1. A user process attacking the kernel
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Spectre variant 1
- ~~~~~~~~~~~~~~~~~
- The attacker passes a parameter to the kernel via a register or
- via a known address in memory during a syscall. Such parameter may
- be used later by the kernel as an index to an array or to derive
- a pointer for a Spectre variant 1 attack. The index or pointer
- is invalid, but bound checks are bypassed in the code branch taken
- for speculative execution. This could cause privileged memory to be
- accessed and leaked.
- For kernel code that has been identified where data pointers could
- potentially be influenced for Spectre attacks, new "nospec" accessor
- macros are used to prevent speculative loading of data.
- Spectre variant 1 (swapgs)
- ~~~~~~~~~~~~~~~~~~~~~~~~~~
- An attacker can train the branch predictor to speculatively skip the
- swapgs path for an interrupt or exception. If they initialize
- the GS register to a user-space value, if the swapgs is speculatively
- skipped, subsequent GS-related percpu accesses in the speculation
- window will be done with the attacker-controlled GS value. This
- could cause privileged memory to be accessed and leaked.
- For example:
- ::
- if (coming from user space)
- swapgs
- mov %gs:<percpu_offset>, %reg
- mov (%reg), %reg1
- When coming from user space, the CPU can speculatively skip the
- swapgs, and then do a speculative percpu load using the user GS
- value. So the user can speculatively force a read of any kernel
- value. If a gadget exists which uses the percpu value as an address
- in another load/store, then the contents of the kernel value may
- become visible via an L1 side channel attack.
- A similar attack exists when coming from kernel space. The CPU can
- speculatively do the swapgs, causing the user GS to get used for the
- rest of the speculative window.
- Spectre variant 2
- ~~~~~~~~~~~~~~~~~
- A spectre variant 2 attacker can :ref:`poison <poison_btb>` the branch
- target buffer (BTB) before issuing syscall to launch an attack.
- After entering the kernel, the kernel could use the poisoned branch
- target buffer on indirect jump and jump to gadget code in speculative
- execution.
- If an attacker tries to control the memory addresses leaked during
- speculative execution, he would also need to pass a parameter to the
- gadget, either through a register or a known address in memory. After
- the gadget has executed, he can measure the side effect.
- The kernel can protect itself against consuming poisoned branch
- target buffer entries by using return trampolines (also known as
- "retpoline") :ref:`[3] <spec_ref3>` :ref:`[9] <spec_ref9>` for all
- indirect branches. Return trampolines trap speculative execution paths
- to prevent jumping to gadget code during speculative execution.
- x86 CPUs with Enhanced Indirect Branch Restricted Speculation
- (Enhanced IBRS) available in hardware should use the feature to
- mitigate Spectre variant 2 instead of retpoline. Enhanced IBRS is
- more efficient than retpoline.
- There may be gadget code in firmware which could be exploited with
- Spectre variant 2 attack by a rogue user process. To mitigate such
- attacks on x86, Indirect Branch Restricted Speculation (IBRS) feature
- is turned on before the kernel invokes any firmware code.
- 2. A user process attacking another user process
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- A malicious user process can try to attack another user process,
- either via a context switch on the same hardware thread, or from the
- sibling hyperthread sharing a physical processor core on simultaneous
- multi-threading (SMT) system.
- Spectre variant 1 attacks generally require passing parameters
- between the processes, which needs a data passing relationship, such
- as remote procedure calls (RPC). Those parameters are used in gadget
- code to derive invalid data pointers accessing privileged memory in
- the attacked process.
- Spectre variant 2 attacks can be launched from a rogue process by
- :ref:`poisoning <poison_btb>` the branch target buffer. This can
- influence the indirect branch targets for a victim process that either
- runs later on the same hardware thread, or running concurrently on
- a sibling hardware thread sharing the same physical core.
- A user process can protect itself against Spectre variant 2 attacks
- by using the prctl() syscall to disable indirect branch speculation
- for itself. An administrator can also cordon off an unsafe process
- from polluting the branch target buffer by disabling the process's
- indirect branch speculation. This comes with a performance cost
- from not using indirect branch speculation and clearing the branch
- target buffer. When SMT is enabled on x86, for a process that has
- indirect branch speculation disabled, Single Threaded Indirect Branch
- Predictors (STIBP) :ref:`[4] <spec_ref4>` are turned on to prevent the
- sibling thread from controlling branch target buffer. In addition,
- the Indirect Branch Prediction Barrier (IBPB) is issued to clear the
- branch target buffer when context switching to and from such process.
- On x86, the return stack buffer is stuffed on context switch.
- This prevents the branch target buffer from being used for branch
- prediction when the return stack buffer underflows while switching to
- a deeper call stack. Any poisoned entries in the return stack buffer
- left by the previous process will also be cleared.
- User programs should use address space randomization to make attacks
- more difficult (Set /proc/sys/kernel/randomize_va_space = 1 or 2).
- 3. A virtualized guest attacking the host
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- The attack mechanism is similar to how user processes attack the
- kernel. The kernel is entered via hyper-calls or other virtualization
- exit paths.
- For Spectre variant 1 attacks, rogue guests can pass parameters
- (e.g. in registers) via hyper-calls to derive invalid pointers to
- speculate into privileged memory after entering the kernel. For places
- where such kernel code has been identified, nospec accessor macros
- are used to stop speculative memory access.
- For Spectre variant 2 attacks, rogue guests can :ref:`poison
- <poison_btb>` the branch target buffer or return stack buffer, causing
- the kernel to jump to gadget code in the speculative execution paths.
- To mitigate variant 2, the host kernel can use return trampolines
- for indirect branches to bypass the poisoned branch target buffer,
- and flushing the return stack buffer on VM exit. This prevents rogue
- guests from affecting indirect branching in the host kernel.
- To protect host processes from rogue guests, host processes can have
- indirect branch speculation disabled via prctl(). The branch target
- buffer is cleared before context switching to such processes.
- 4. A virtualized guest attacking other guest
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- A rogue guest may attack another guest to get data accessible by the
- other guest.
- Spectre variant 1 attacks are possible if parameters can be passed
- between guests. This may be done via mechanisms such as shared memory
- or message passing. Such parameters could be used to derive data
- pointers to privileged data in guest. The privileged data could be
- accessed by gadget code in the victim's speculation paths.
- Spectre variant 2 attacks can be launched from a rogue guest by
- :ref:`poisoning <poison_btb>` the branch target buffer or the return
- stack buffer. Such poisoned entries could be used to influence
- speculation execution paths in the victim guest.
- Linux kernel mitigates attacks to other guests running in the same
- CPU hardware thread by flushing the return stack buffer on VM exit,
- and clearing the branch target buffer before switching to a new guest.
- If SMT is used, Spectre variant 2 attacks from an untrusted guest
- in the sibling hyperthread can be mitigated by the administrator,
- by turning off the unsafe guest's indirect branch speculation via
- prctl(). A guest can also protect itself by turning on microcode
- based mitigations (such as IBPB or STIBP on x86) within the guest.
- .. _spectre_sys_info:
- Spectre system information
- --------------------------
- The Linux kernel provides a sysfs interface to enumerate the current
- mitigation status of the system for Spectre: whether the system is
- vulnerable, and which mitigations are active.
- The sysfs file showing Spectre variant 1 mitigation status is:
- /sys/devices/system/cpu/vulnerabilities/spectre_v1
- The possible values in this file are:
- .. list-table::
- * - 'Not affected'
- - The processor is not vulnerable.
- * - 'Vulnerable: __user pointer sanitization and usercopy barriers only; no swapgs barriers'
- - The swapgs protections are disabled; otherwise it has
- protection in the kernel on a case by case base with explicit
- pointer sanitation and usercopy LFENCE barriers.
- * - 'Mitigation: usercopy/swapgs barriers and __user pointer sanitization'
- - Protection in the kernel on a case by case base with explicit
- pointer sanitation, usercopy LFENCE barriers, and swapgs LFENCE
- barriers.
- However, the protections are put in place on a case by case basis,
- and there is no guarantee that all possible attack vectors for Spectre
- variant 1 are covered.
- The spectre_v2 kernel file reports if the kernel has been compiled with
- retpoline mitigation or if the CPU has hardware mitigation, and if the
- CPU has support for additional process-specific mitigation.
- This file also reports CPU features enabled by microcode to mitigate
- attack between user processes:
- 1. Indirect Branch Prediction Barrier (IBPB) to add additional
- isolation between processes of different users.
- 2. Single Thread Indirect Branch Predictors (STIBP) to add additional
- isolation between CPU threads running on the same core.
- These CPU features may impact performance when used and can be enabled
- per process on a case-by-case base.
- The sysfs file showing Spectre variant 2 mitigation status is:
- /sys/devices/system/cpu/vulnerabilities/spectre_v2
- The possible values in this file are:
- - Kernel status:
- ==================================== =================================
- 'Not affected' The processor is not vulnerable
- 'Vulnerable' Vulnerable, no mitigation
- 'Mitigation: Full generic retpoline' Software-focused mitigation
- 'Mitigation: Full AMD retpoline' AMD-specific software mitigation
- 'Mitigation: Enhanced IBRS' Hardware-focused mitigation
- ==================================== =================================
- - Firmware status: Show if Indirect Branch Restricted Speculation (IBRS) is
- used to protect against Spectre variant 2 attacks when calling firmware (x86 only).
- ========== =============================================================
- 'IBRS_FW' Protection against user program attacks when calling firmware
- ========== =============================================================
- - Indirect branch prediction barrier (IBPB) status for protection between
- processes of different users. This feature can be controlled through
- prctl() per process, or through kernel command line options. This is
- an x86 only feature. For more details see below.
- =================== ========================================================
- 'IBPB: disabled' IBPB unused
- 'IBPB: always-on' Use IBPB on all tasks
- 'IBPB: conditional' Use IBPB on SECCOMP or indirect branch restricted tasks
- =================== ========================================================
- - Single threaded indirect branch prediction (STIBP) status for protection
- between different hyper threads. This feature can be controlled through
- prctl per process, or through kernel command line options. This is x86
- only feature. For more details see below.
- ==================== ========================================================
- 'STIBP: disabled' STIBP unused
- 'STIBP: forced' Use STIBP on all tasks
- 'STIBP: conditional' Use STIBP on SECCOMP or indirect branch restricted tasks
- ==================== ========================================================
- - Return stack buffer (RSB) protection status:
- ============= ===========================================
- 'RSB filling' Protection of RSB on context switch enabled
- ============= ===========================================
- Full mitigation might require a microcode update from the CPU
- vendor. When the necessary microcode is not available, the kernel will
- report vulnerability.
- Turning on mitigation for Spectre variant 1 and Spectre variant 2
- -----------------------------------------------------------------
- 1. Kernel mitigation
- ^^^^^^^^^^^^^^^^^^^^
- Spectre variant 1
- ~~~~~~~~~~~~~~~~~
- For the Spectre variant 1, vulnerable kernel code (as determined
- by code audit or scanning tools) is annotated on a case by case
- basis to use nospec accessor macros for bounds clipping :ref:`[2]
- <spec_ref2>` to avoid any usable disclosure gadgets. However, it may
- not cover all attack vectors for Spectre variant 1.
- Copy-from-user code has an LFENCE barrier to prevent the access_ok()
- check from being mis-speculated. The barrier is done by the
- barrier_nospec() macro.
- For the swapgs variant of Spectre variant 1, LFENCE barriers are
- added to interrupt, exception and NMI entry where needed. These
- barriers are done by the FENCE_SWAPGS_KERNEL_ENTRY and
- FENCE_SWAPGS_USER_ENTRY macros.
- Spectre variant 2
- ~~~~~~~~~~~~~~~~~
- For Spectre variant 2 mitigation, the compiler turns indirect calls or
- jumps in the kernel into equivalent return trampolines (retpolines)
- :ref:`[3] <spec_ref3>` :ref:`[9] <spec_ref9>` to go to the target
- addresses. Speculative execution paths under retpolines are trapped
- in an infinite loop to prevent any speculative execution jumping to
- a gadget.
- To turn on retpoline mitigation on a vulnerable CPU, the kernel
- needs to be compiled with a gcc compiler that supports the
- -mindirect-branch=thunk-extern -mindirect-branch-register options.
- If the kernel is compiled with a Clang compiler, the compiler needs
- to support -mretpoline-external-thunk option. The kernel config
- CONFIG_RETPOLINE needs to be turned on, and the CPU needs to run with
- the latest updated microcode.
- On Intel Skylake-era systems the mitigation covers most, but not all,
- cases. See :ref:`[3] <spec_ref3>` for more details.
- On CPUs with hardware mitigation for Spectre variant 2 (e.g. Enhanced
- IBRS on x86), retpoline is automatically disabled at run time.
- The retpoline mitigation is turned on by default on vulnerable
- CPUs. It can be forced on or off by the administrator
- via the kernel command line and sysfs control files. See
- :ref:`spectre_mitigation_control_command_line`.
- On x86, indirect branch restricted speculation is turned on by default
- before invoking any firmware code to prevent Spectre variant 2 exploits
- using the firmware.
- Using kernel address space randomization (CONFIG_RANDOMIZE_SLAB=y
- and CONFIG_SLAB_FREELIST_RANDOM=y in the kernel configuration) makes
- attacks on the kernel generally more difficult.
- 2. User program mitigation
- ^^^^^^^^^^^^^^^^^^^^^^^^^^
- User programs can mitigate Spectre variant 1 using LFENCE or "bounds
- clipping". For more details see :ref:`[2] <spec_ref2>`.
- For Spectre variant 2 mitigation, individual user programs
- can be compiled with return trampolines for indirect branches.
- This protects them from consuming poisoned entries in the branch
- target buffer left by malicious software. Alternatively, the
- programs can disable their indirect branch speculation via prctl()
- (See :ref:`Documentation/userspace-api/spec_ctrl.rst <set_spec_ctrl>`).
- On x86, this will turn on STIBP to guard against attacks from the
- sibling thread when the user program is running, and use IBPB to
- flush the branch target buffer when switching to/from the program.
- Restricting indirect branch speculation on a user program will
- also prevent the program from launching a variant 2 attack
- on x86. All sand-boxed SECCOMP programs have indirect branch
- speculation restricted by default. Administrators can change
- that behavior via the kernel command line and sysfs control files.
- See :ref:`spectre_mitigation_control_command_line`.
- Programs that disable their indirect branch speculation will have
- more overhead and run slower.
- User programs should use address space randomization
- (/proc/sys/kernel/randomize_va_space = 1 or 2) to make attacks more
- difficult.
- 3. VM mitigation
- ^^^^^^^^^^^^^^^^
- Within the kernel, Spectre variant 1 attacks from rogue guests are
- mitigated on a case by case basis in VM exit paths. Vulnerable code
- uses nospec accessor macros for "bounds clipping", to avoid any
- usable disclosure gadgets. However, this may not cover all variant
- 1 attack vectors.
- For Spectre variant 2 attacks from rogue guests to the kernel, the
- Linux kernel uses retpoline or Enhanced IBRS to prevent consumption of
- poisoned entries in branch target buffer left by rogue guests. It also
- flushes the return stack buffer on every VM exit to prevent a return
- stack buffer underflow so poisoned branch target buffer could be used,
- or attacker guests leaving poisoned entries in the return stack buffer.
- To mitigate guest-to-guest attacks in the same CPU hardware thread,
- the branch target buffer is sanitized by flushing before switching
- to a new guest on a CPU.
- The above mitigations are turned on by default on vulnerable CPUs.
- To mitigate guest-to-guest attacks from sibling thread when SMT is
- in use, an untrusted guest running in the sibling thread can have
- its indirect branch speculation disabled by administrator via prctl().
- The kernel also allows guests to use any microcode based mitigation
- they choose to use (such as IBPB or STIBP on x86) to protect themselves.
- .. _spectre_mitigation_control_command_line:
- Mitigation control on the kernel command line
- ---------------------------------------------
- Spectre variant 2 mitigation can be disabled or force enabled at the
- kernel command line.
- nospectre_v1
- [X86,PPC] Disable mitigations for Spectre Variant 1
- (bounds check bypass). With this option data leaks are
- possible in the system.
- nospectre_v2
- [X86] Disable all mitigations for the Spectre variant 2
- (indirect branch prediction) vulnerability. System may
- allow data leaks with this option, which is equivalent
- to spectre_v2=off.
- spectre_v2=
- [X86] Control mitigation of Spectre variant 2
- (indirect branch speculation) vulnerability.
- The default operation protects the kernel from
- user space attacks.
- on
- unconditionally enable, implies
- spectre_v2_user=on
- off
- unconditionally disable, implies
- spectre_v2_user=off
- auto
- kernel detects whether your CPU model is
- vulnerable
- Selecting 'on' will, and 'auto' may, choose a
- mitigation method at run time according to the
- CPU, the available microcode, the setting of the
- CONFIG_RETPOLINE configuration option, and the
- compiler with which the kernel was built.
- Selecting 'on' will also enable the mitigation
- against user space to user space task attacks.
- Selecting 'off' will disable both the kernel and
- the user space protections.
- Specific mitigations can also be selected manually:
- retpoline
- replace indirect branches
- retpoline,generic
- google's original retpoline
- retpoline,amd
- AMD-specific minimal thunk
- Not specifying this option is equivalent to
- spectre_v2=auto.
- For user space mitigation:
- spectre_v2_user=
- [X86] Control mitigation of Spectre variant 2
- (indirect branch speculation) vulnerability between
- user space tasks
- on
- Unconditionally enable mitigations. Is
- enforced by spectre_v2=on
- off
- Unconditionally disable mitigations. Is
- enforced by spectre_v2=off
- prctl
- Indirect branch speculation is enabled,
- but mitigation can be enabled via prctl
- per thread. The mitigation control state
- is inherited on fork.
- prctl,ibpb
- Like "prctl" above, but only STIBP is
- controlled per thread. IBPB is issued
- always when switching between different user
- space processes.
- seccomp
- Same as "prctl" above, but all seccomp
- threads will enable the mitigation unless
- they explicitly opt out.
- seccomp,ibpb
- Like "seccomp" above, but only STIBP is
- controlled per thread. IBPB is issued
- always when switching between different
- user space processes.
- auto
- Kernel selects the mitigation depending on
- the available CPU features and vulnerability.
- Default mitigation:
- If CONFIG_SECCOMP=y then "seccomp", otherwise "prctl"
- Not specifying this option is equivalent to
- spectre_v2_user=auto.
- In general the kernel by default selects
- reasonable mitigations for the current CPU. To
- disable Spectre variant 2 mitigations, boot with
- spectre_v2=off. Spectre variant 1 mitigations
- cannot be disabled.
- Mitigation selection guide
- --------------------------
- 1. Trusted userspace
- ^^^^^^^^^^^^^^^^^^^^
- If all userspace applications are from trusted sources and do not
- execute externally supplied untrusted code, then the mitigations can
- be disabled.
- 2. Protect sensitive programs
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- For security-sensitive programs that have secrets (e.g. crypto
- keys), protection against Spectre variant 2 can be put in place by
- disabling indirect branch speculation when the program is running
- (See :ref:`Documentation/userspace-api/spec_ctrl.rst <set_spec_ctrl>`).
- 3. Sandbox untrusted programs
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Untrusted programs that could be a source of attacks can be cordoned
- off by disabling their indirect branch speculation when they are run
- (See :ref:`Documentation/userspace-api/spec_ctrl.rst <set_spec_ctrl>`).
- This prevents untrusted programs from polluting the branch target
- buffer. All programs running in SECCOMP sandboxes have indirect
- branch speculation restricted by default. This behavior can be
- changed via the kernel command line and sysfs control files. See
- :ref:`spectre_mitigation_control_command_line`.
- 3. High security mode
- ^^^^^^^^^^^^^^^^^^^^^
- All Spectre variant 2 mitigations can be forced on
- at boot time for all programs (See the "on" option in
- :ref:`spectre_mitigation_control_command_line`). This will add
- overhead as indirect branch speculations for all programs will be
- restricted.
- On x86, branch target buffer will be flushed with IBPB when switching
- to a new program. STIBP is left on all the time to protect programs
- against variant 2 attacks originating from programs running on
- sibling threads.
- Alternatively, STIBP can be used only when running programs
- whose indirect branch speculation is explicitly disabled,
- while IBPB is still used all the time when switching to a new
- program to clear the branch target buffer (See "ibpb" option in
- :ref:`spectre_mitigation_control_command_line`). This "ibpb" option
- has less performance cost than the "on" option, which leaves STIBP
- on all the time.
- References on Spectre
- ---------------------
- Intel white papers:
- .. _spec_ref1:
- [1] `Intel analysis of speculative execution side channels <https://newsroom.intel.com/wp-content/uploads/sites/11/2018/01/Intel-Analysis-of-Speculative-Execution-Side-Channels.pdf>`_.
- .. _spec_ref2:
- [2] `Bounds check bypass <https://software.intel.com/security-software-guidance/software-guidance/bounds-check-bypass>`_.
- .. _spec_ref3:
- [3] `Deep dive: Retpoline: A branch target injection mitigation <https://software.intel.com/security-software-guidance/insights/deep-dive-retpoline-branch-target-injection-mitigation>`_.
- .. _spec_ref4:
- [4] `Deep Dive: Single Thread Indirect Branch Predictors <https://software.intel.com/security-software-guidance/insights/deep-dive-single-thread-indirect-branch-predictors>`_.
- AMD white papers:
- .. _spec_ref5:
- [5] `AMD64 technology indirect branch control extension <https://developer.amd.com/wp-content/resources/Architecture_Guidelines_Update_Indirect_Branch_Control.pdf>`_.
- .. _spec_ref6:
- [6] `Software techniques for managing speculation on AMD processors <https://developer.amd.com/wp-content/resources/90343-B_SoftwareTechniquesforManagingSpeculation_WP_7-18Update_FNL.pdf>`_.
- ARM white papers:
- .. _spec_ref7:
- [7] `Cache speculation side-channels <https://developer.arm.com/support/arm-security-updates/speculative-processor-vulnerability/download-the-whitepaper>`_.
- .. _spec_ref8:
- [8] `Cache speculation issues update <https://developer.arm.com/support/arm-security-updates/speculative-processor-vulnerability/latest-updates/cache-speculation-issues-update>`_.
- Google white paper:
- .. _spec_ref9:
- [9] `Retpoline: a software construct for preventing branch-target-injection <https://support.google.com/faqs/answer/7625886>`_.
- MIPS white paper:
- .. _spec_ref10:
- [10] `MIPS: response on speculative execution and side channel vulnerabilities <https://www.mips.com/blog/mips-response-on-speculative-execution-and-side-channel-vulnerabilities/>`_.
- Academic papers:
- .. _spec_ref11:
- [11] `Spectre Attacks: Exploiting Speculative Execution <https://spectreattack.com/spectre.pdf>`_.
- .. _spec_ref12:
- [12] `NetSpectre: Read Arbitrary Memory over Network <https://arxiv.org/abs/1807.10535>`_.
- .. _spec_ref13:
- [13] `Spectre Returns! Speculation Attacks using the Return Stack Buffer <https://www.usenix.org/system/files/conference/woot18/woot18-paper-koruyeh.pdf>`_.
|