mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
x86/spec-ctrl: Mitigate the TSX Asynchronous Abort sidechannel
See patch documentation and comments. This is part of XSA-305 / CVE-2019-11135 Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
070e8ce9d3
commit
8c4330818f
4 files changed
+76
-6
No files matched your search
@@ -1973,7 +1973,7 @@ extreme care.**
|
||||
An overall boolean value, `spec-ctrl=no`, can be specified to turn off all
|
||||
mitigations, including pieces of infrastructure used to virtualise certain
|
||||
mitigation features for guests. This also includes settings which `xpti`,
|
||||
`smt`, `pv-l1tf` control, unless the respective option(s) have been
|
||||
`smt`, `pv-l1tf`, `tsx` control, unless the respective option(s) have been
|
||||
specified earlier on the command line.
|
||||
|
||||
Alternatively, a slightly more restricted `spec-ctrl=no-xen` can be used to
|
||||
@@ -2083,7 +2083,7 @@ pages) must also be specified via the tbuf_size parameter.
|
||||
= <bool>
|
||||
|
||||
Applicability: x86
|
||||
Default: true
|
||||
Default: false on parts vulnerable to TAA, true otherwise
|
||||
|
||||
Controls for the use of Transactional Synchronization eXtensions.
|
||||
|
||||
@@ -2093,6 +2093,19 @@ a control has been introduced which allows TSX to be turned off.
|
||||
On systems with the ability to turn TSX off, this boolean offers system wide
|
||||
control of whether TSX is enabled or disabled.
|
||||
|
||||
On parts vulnerable to CVE-2019-11135 / TSX Asynchronous Abort, the following
|
||||
logic applies:
|
||||
|
||||
* An explicit `tsx=` choice is honoured, even if it is `true` and would
|
||||
result in a vulnerable system.
|
||||
|
||||
* When no explicit `tsx=` choice is given, parts vulnerable to TAA will be
|
||||
mitigated by disabling TSX, as this is the lowest overhead option.
|
||||
|
||||
* If the use of TSX is important, the more expensive TAA mitigations can be
|
||||
opted in to with `smt=0 spec-ctrl=md-clear`, at which point TSX will remain
|
||||
active by default.
|
||||
|
||||
### ucode (x86)
|
||||
> `= List of [ <integer> | scan=<bool>, nmi=<bool> ]`
|
||||
|
||||
|
||||
@@ -99,6 +99,9 @@ static int __init parse_spec_ctrl(const char *s)
|
||||
|
||||
opt_branch_harden = false;
|
||||
|
||||
if ( opt_tsx == -1 )
|
||||
opt_tsx = -3;
|
||||
|
||||
disable_common:
|
||||
opt_rsb_pv = false;
|
||||
opt_rsb_hvm = false;
|
||||
@@ -310,7 +313,7 @@ static void __init print_details(enum ind_thunk thunk, uint64_t caps)
|
||||
printk("Speculative mitigation facilities:\n");
|
||||
|
||||
/* Hardware features which pertain to speculative mitigations. */
|
||||
printk(" Hardware features:%s%s%s%s%s%s%s%s%s%s%s%s\n",
|
||||
printk(" Hardware features:%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
|
||||
(_7d0 & cpufeat_mask(X86_FEATURE_IBRSB)) ? " IBRS/IBPB" : "",
|
||||
(_7d0 & cpufeat_mask(X86_FEATURE_STIBP)) ? " STIBP" : "",
|
||||
(_7d0 & cpufeat_mask(X86_FEATURE_L1D_FLUSH)) ? " L1D_FLUSH" : "",
|
||||
@@ -322,7 +325,9 @@ static void __init print_details(enum ind_thunk thunk, uint64_t caps)
|
||||
(caps & ARCH_CAPS_RSBA) ? " RSBA" : "",
|
||||
(caps & ARCH_CAPS_SKIP_L1DFL) ? " SKIP_L1DFL": "",
|
||||
(caps & ARCH_CAPS_SSB_NO) ? " SSB_NO" : "",
|
||||
(caps & ARCH_CAPS_MDS_NO) ? " MDS_NO" : "");
|
||||
(caps & ARCH_CAPS_MDS_NO) ? " MDS_NO" : "",
|
||||
(caps & ARCH_CAPS_TSX_CTRL) ? " TSX_CTRL" : "",
|
||||
(caps & ARCH_CAPS_TAA_NO) ? " TAA_NO" : "");
|
||||
|
||||
/* Compiled-in support which pertains to mitigations. */
|
||||
if ( IS_ENABLED(CONFIG_INDIRECT_THUNK) || IS_ENABLED(CONFIG_SHADOW_PAGING) )
|
||||
@@ -336,7 +341,7 @@ static void __init print_details(enum ind_thunk thunk, uint64_t caps)
|
||||
"\n");
|
||||
|
||||
/* Settings for Xen's protection, irrespective of guests. */
|
||||
printk(" Xen settings: BTI-Thunk %s, SPEC_CTRL: %s%s, Other:%s%s%s%s\n",
|
||||
printk(" Xen settings: BTI-Thunk %s, SPEC_CTRL: %s%s%s, Other:%s%s%s%s\n",
|
||||
thunk == THUNK_NONE ? "N/A" :
|
||||
thunk == THUNK_RETPOLINE ? "RETPOLINE" :
|
||||
thunk == THUNK_LFENCE ? "LFENCE" :
|
||||
@@ -345,6 +350,8 @@ static void __init print_details(enum ind_thunk thunk, uint64_t caps)
|
||||
(default_xen_spec_ctrl & SPEC_CTRL_IBRS) ? "IBRS+" : "IBRS-",
|
||||
!boot_cpu_has(X86_FEATURE_SSBD) ? "" :
|
||||
(default_xen_spec_ctrl & SPEC_CTRL_SSBD) ? " SSBD+" : " SSBD-",
|
||||
!(caps & ARCH_CAPS_TSX_CTRL) ? "" :
|
||||
(opt_tsx & 1) ? " TSX+" : " TSX-",
|
||||
opt_ibpb ? " IBPB" : "",
|
||||
opt_l1d_flush ? " L1D_FLUSH" : "",
|
||||
opt_md_clear_pv || opt_md_clear_hvm ? " VERW" : "",
|
||||
@@ -867,6 +874,7 @@ void __init init_speculation_mitigations(void)
|
||||
{
|
||||
enum ind_thunk thunk = THUNK_DEFAULT;
|
||||
bool use_spec_ctrl = false, ibrs = false, hw_smt_enabled;
|
||||
bool cpu_has_bug_taa;
|
||||
uint64_t caps = 0;
|
||||
|
||||
if ( boot_cpu_has(X86_FEATURE_ARCH_CAPS) )
|
||||
@@ -1094,6 +1102,53 @@ void __init init_speculation_mitigations(void)
|
||||
"enabled. Mitigations will not be fully effective. Please\n"
|
||||
"choose an explicit smt=<bool> setting. See XSA-297.\n");
|
||||
|
||||
/*
|
||||
* Vulnerability to TAA is a little complicated to quantify.
|
||||
*
|
||||
* In the pipeline, it is just another way to get speculative access to
|
||||
* stale load port, store buffer or fill buffer data, and therefore can be
|
||||
* considered a superset of MDS (on TSX-capable parts). On parts which
|
||||
* predate MDS_NO, the existing VERW flushing will mitigate this
|
||||
* sidechannel as well.
|
||||
*
|
||||
* On parts which contain MDS_NO, the lack of VERW flushing means that an
|
||||
* attacker can still use TSX to target microarchitectural buffers to leak
|
||||
* secrets. Therefore, we consider TAA to be the set of TSX-capable parts
|
||||
* which have MDS_NO but lack TAA_NO.
|
||||
*
|
||||
* Note: cpu_has_rtm (== hle) could already be hidden by `tsx=0` on the
|
||||
* cmdline. MSR_TSX_CTRL will only appear on TSX-capable parts, so
|
||||
* we check both to spot TSX in a microcode/cmdline independent way.
|
||||
*/
|
||||
cpu_has_bug_taa =
|
||||
(cpu_has_rtm || (caps & ARCH_CAPS_TSX_CTRL)) &&
|
||||
(caps & (ARCH_CAPS_MDS_NO | ARCH_CAPS_TAA_NO)) == ARCH_CAPS_MDS_NO;
|
||||
|
||||
/*
|
||||
* On TAA-affected hardware, disabling TSX is the preferred mitigation, vs
|
||||
* the MDS mitigation of disabling HT and using VERW flushing.
|
||||
*
|
||||
* On CPUs which advertise MDS_NO, VERW has no flushing side effect until
|
||||
* the TSX_CTRL microcode is loaded, despite the MD_CLEAR CPUID bit being
|
||||
* advertised, and there isn't a MD_CLEAR_2 flag to use...
|
||||
*
|
||||
* If we're on affected hardware, able to do something about it (which
|
||||
* implies that VERW now works), no explicit TSX choice and traditional
|
||||
* MDS mitigations (no-SMT, VERW) not obviosuly in use (someone might
|
||||
* plausibly value TSX higher than Hyperthreading...), disable TSX to
|
||||
* mitigate TAA.
|
||||
*/
|
||||
if ( opt_tsx == -1 && cpu_has_bug_taa && (caps & ARCH_CAPS_TSX_CTRL) &&
|
||||
((hw_smt_enabled && opt_smt) ||
|
||||
!boot_cpu_has(X86_FEATURE_SC_VERW_IDLE)) )
|
||||
{
|
||||
setup_clear_cpu_cap(X86_FEATURE_HLE);
|
||||
setup_clear_cpu_cap(X86_FEATURE_RTM);
|
||||
|
||||
opt_tsx = 0;
|
||||
tsx_init();
|
||||
}
|
||||
|
||||
print_details(thunk, caps);
|
||||
|
||||
/*
|
||||
|
||||
+2
-1
@@ -5,7 +5,8 @@
|
||||
* Valid values:
|
||||
* 1 => Explicit tsx=1
|
||||
* 0 => Explicit tsx=0
|
||||
* -1 => Default, implicit tsx=1
|
||||
* -1 => Default, implicit tsx=1, may change to 0 to mitigate TAA
|
||||
* -3 => Implicit tsx=1 (feed-through from spec-ctrl=0)
|
||||
*
|
||||
* This is arranged such that the bottom bit encodes whether TSX is actually
|
||||
* disabled, while identifying various explicit (>=0) and implicit (<0)
|
||||
|
||||
@@ -54,6 +54,7 @@
|
||||
#define ARCH_CAPS_MDS_NO (_AC(1, ULL) << 5)
|
||||
#define ARCH_CAPS_IF_PSCHANGE_MC_NO (_AC(1, ULL) << 6)
|
||||
#define ARCH_CAPS_TSX_CTRL (_AC(1, ULL) << 7)
|
||||
#define ARCH_CAPS_TAA_NO (_AC(1, ULL) << 8)
|
||||
|
||||
#define MSR_FLUSH_CMD 0x0000010b
|
||||
#define FLUSH_CMD_L1D (_AC(1, ULL) << 0)
|
||||
|
||||