![Waiman Long](/assets/img/avatar_default.png)
For MDS vulnerable processors with TSX support, enabling either MDS or
TAA mitigations will enable the use of VERW to flush internal processor
buffers at the right code path. IOW, they are either both mitigated
or both not. However, if the command line options are inconsistent,
the vulnerabilites sysfs files may not report the mitigation status
correctly.
For example, with only the "mds=off" option:
vulnerabilities/mds:Vulnerable; SMT vulnerable
vulnerabilities/tsx_async_abort:Mitigation: Clear CPU buffers; SMT vulnerable
The mds vulnerabilities file has wrong status in this case. Similarly,
the taa vulnerability file will be wrong with mds mitigation on, but
taa off.
Change taa_select_mitigation() to sync up the two mitigation status
and have them turned off if both "mds=off" and "tsx_async_abort=off"
are present.
Update documentation to emphasize the fact that both "mds=off" and
"tsx_async_abort=off" have to be specified together for processors that
are affected by both TAA and MDS to be effective.
[ bp: Massage and add kernel-parameters.txt change too. ]
Fixes: 1b42f01741
("x86/speculation/taa: Add mitigation for TSX Async Abort")
Signed-off-by: Waiman Long <longman@redhat.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Kosina <jkosina@suse.cz>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: linux-doc@vger.kernel.org
Cc: Mark Gross <mgross@linux.intel.com>
Cc: <stable@vger.kernel.org>
Cc: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Tim Chen <tim.c.chen@linux.intel.com>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Tyler Hicks <tyhicks@canonical.com>
Cc: x86-ml <x86@kernel.org>
Link: https://lkml.kernel.org/r/20191115161445.30809-2-longman@redhat.com
312 lines
11 KiB
ReStructuredText
312 lines
11 KiB
ReStructuredText
MDS - Microarchitectural Data Sampling
|
|
======================================
|
|
|
|
Microarchitectural Data Sampling is a hardware vulnerability which allows
|
|
unprivileged speculative access to data which is available in various CPU
|
|
internal buffers.
|
|
|
|
Affected processors
|
|
-------------------
|
|
|
|
This vulnerability affects a wide range of Intel processors. The
|
|
vulnerability is not present on:
|
|
|
|
- Processors from AMD, Centaur and other non Intel vendors
|
|
|
|
- Older processor models, where the CPU family is < 6
|
|
|
|
- Some Atoms (Bonnell, Saltwell, Goldmont, GoldmontPlus)
|
|
|
|
- Intel processors which have the ARCH_CAP_MDS_NO bit set in the
|
|
IA32_ARCH_CAPABILITIES MSR.
|
|
|
|
Whether a processor is affected or not can be read out from the MDS
|
|
vulnerability file in sysfs. See :ref:`mds_sys_info`.
|
|
|
|
Not all processors are affected by all variants of MDS, but the mitigation
|
|
is identical for all of them so the kernel treats them as a single
|
|
vulnerability.
|
|
|
|
Related CVEs
|
|
------------
|
|
|
|
The following CVE entries are related to the MDS vulnerability:
|
|
|
|
============== ===== ===================================================
|
|
CVE-2018-12126 MSBDS Microarchitectural Store Buffer Data Sampling
|
|
CVE-2018-12130 MFBDS Microarchitectural Fill Buffer Data Sampling
|
|
CVE-2018-12127 MLPDS Microarchitectural Load Port Data Sampling
|
|
CVE-2019-11091 MDSUM Microarchitectural Data Sampling Uncacheable Memory
|
|
============== ===== ===================================================
|
|
|
|
Problem
|
|
-------
|
|
|
|
When performing store, load, L1 refill operations, processors write data
|
|
into temporary microarchitectural structures (buffers). The data in the
|
|
buffer can be forwarded to load operations as an optimization.
|
|
|
|
Under certain conditions, usually a fault/assist caused by a load
|
|
operation, data unrelated to the load memory address can be speculatively
|
|
forwarded from the buffers. Because the load operation causes a fault or
|
|
assist and its result will be discarded, the forwarded data will not cause
|
|
incorrect program execution or state changes. But a malicious operation
|
|
may be able to forward this speculative data to a disclosure gadget which
|
|
allows in turn to infer the value via a cache side channel attack.
|
|
|
|
Because the buffers are potentially shared between Hyper-Threads cross
|
|
Hyper-Thread attacks are possible.
|
|
|
|
Deeper technical information is available in the MDS specific x86
|
|
architecture section: :ref:`Documentation/x86/mds.rst <mds>`.
|
|
|
|
|
|
Attack scenarios
|
|
----------------
|
|
|
|
Attacks against the MDS vulnerabilities can be mounted from malicious non
|
|
priviledged user space applications running on hosts or guest. Malicious
|
|
guest OSes can obviously mount attacks as well.
|
|
|
|
Contrary to other speculation based vulnerabilities the MDS vulnerability
|
|
does not allow the attacker to control the memory target address. As a
|
|
consequence the attacks are purely sampling based, but as demonstrated with
|
|
the TLBleed attack samples can be postprocessed successfully.
|
|
|
|
Web-Browsers
|
|
^^^^^^^^^^^^
|
|
|
|
It's unclear whether attacks through Web-Browsers are possible at
|
|
all. The exploitation through Java-Script is considered very unlikely,
|
|
but other widely used web technologies like Webassembly could possibly be
|
|
abused.
|
|
|
|
|
|
.. _mds_sys_info:
|
|
|
|
MDS system information
|
|
-----------------------
|
|
|
|
The Linux kernel provides a sysfs interface to enumerate the current MDS
|
|
status of the system: whether the system is vulnerable, and which
|
|
mitigations are active. The relevant sysfs file is:
|
|
|
|
/sys/devices/system/cpu/vulnerabilities/mds
|
|
|
|
The possible values in this file are:
|
|
|
|
.. list-table::
|
|
|
|
* - 'Not affected'
|
|
- The processor is not vulnerable
|
|
* - 'Vulnerable'
|
|
- The processor is vulnerable, but no mitigation enabled
|
|
* - 'Vulnerable: Clear CPU buffers attempted, no microcode'
|
|
- The processor is vulnerable but microcode is not updated.
|
|
|
|
The mitigation is enabled on a best effort basis. See :ref:`vmwerv`
|
|
* - 'Mitigation: Clear CPU buffers'
|
|
- The processor is vulnerable and the CPU buffer clearing mitigation is
|
|
enabled.
|
|
|
|
If the processor is vulnerable then the following information is appended
|
|
to the above information:
|
|
|
|
======================== ============================================
|
|
'SMT vulnerable' SMT is enabled
|
|
'SMT mitigated' SMT is enabled and mitigated
|
|
'SMT disabled' SMT is disabled
|
|
'SMT Host state unknown' Kernel runs in a VM, Host SMT state unknown
|
|
======================== ============================================
|
|
|
|
.. _vmwerv:
|
|
|
|
Best effort mitigation mode
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
If the processor is vulnerable, but the availability of the microcode based
|
|
mitigation mechanism is not advertised via CPUID the kernel selects a best
|
|
effort mitigation mode. This mode invokes the mitigation instructions
|
|
without a guarantee that they clear the CPU buffers.
|
|
|
|
This is done to address virtualization scenarios where the host has the
|
|
microcode update applied, but the hypervisor is not yet updated to expose
|
|
the CPUID to the guest. If the host has updated microcode the protection
|
|
takes effect otherwise a few cpu cycles are wasted pointlessly.
|
|
|
|
The state in the mds sysfs file reflects this situation accordingly.
|
|
|
|
|
|
Mitigation mechanism
|
|
-------------------------
|
|
|
|
The kernel detects the affected CPUs and the presence of the microcode
|
|
which is required.
|
|
|
|
If a CPU is affected and the microcode is available, then the kernel
|
|
enables the mitigation by default. The mitigation can be controlled at boot
|
|
time via a kernel command line option. See
|
|
:ref:`mds_mitigation_control_command_line`.
|
|
|
|
.. _cpu_buffer_clear:
|
|
|
|
CPU buffer clearing
|
|
^^^^^^^^^^^^^^^^^^^
|
|
|
|
The mitigation for MDS clears the affected CPU buffers on return to user
|
|
space and when entering a guest.
|
|
|
|
If SMT is enabled it also clears the buffers on idle entry when the CPU
|
|
is only affected by MSBDS and not any other MDS variant, because the
|
|
other variants cannot be protected against cross Hyper-Thread attacks.
|
|
|
|
For CPUs which are only affected by MSBDS the user space, guest and idle
|
|
transition mitigations are sufficient and SMT is not affected.
|
|
|
|
.. _virt_mechanism:
|
|
|
|
Virtualization mitigation
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
The protection for host to guest transition depends on the L1TF
|
|
vulnerability of the CPU:
|
|
|
|
- CPU is affected by L1TF:
|
|
|
|
If the L1D flush mitigation is enabled and up to date microcode is
|
|
available, the L1D flush mitigation is automatically protecting the
|
|
guest transition.
|
|
|
|
If the L1D flush mitigation is disabled then the MDS mitigation is
|
|
invoked explicit when the host MDS mitigation is enabled.
|
|
|
|
For details on L1TF and virtualization see:
|
|
:ref:`Documentation/admin-guide/hw-vuln//l1tf.rst <mitigation_control_kvm>`.
|
|
|
|
- CPU is not affected by L1TF:
|
|
|
|
CPU buffers are flushed before entering the guest when the host MDS
|
|
mitigation is enabled.
|
|
|
|
The resulting MDS protection matrix for the host to guest transition:
|
|
|
|
============ ===== ============= ============ =================
|
|
L1TF MDS VMX-L1FLUSH Host MDS MDS-State
|
|
|
|
Don't care No Don't care N/A Not affected
|
|
|
|
Yes Yes Disabled Off Vulnerable
|
|
|
|
Yes Yes Disabled Full Mitigated
|
|
|
|
Yes Yes Enabled Don't care Mitigated
|
|
|
|
No Yes N/A Off Vulnerable
|
|
|
|
No Yes N/A Full Mitigated
|
|
============ ===== ============= ============ =================
|
|
|
|
This only covers the host to guest transition, i.e. prevents leakage from
|
|
host to guest, but does not protect the guest internally. Guests need to
|
|
have their own protections.
|
|
|
|
.. _xeon_phi:
|
|
|
|
XEON PHI specific considerations
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
The XEON PHI processor family is affected by MSBDS which can be exploited
|
|
cross Hyper-Threads when entering idle states. Some XEON PHI variants allow
|
|
to use MWAIT in user space (Ring 3) which opens an potential attack vector
|
|
for malicious user space. The exposure can be disabled on the kernel
|
|
command line with the 'ring3mwait=disable' command line option.
|
|
|
|
XEON PHI is not affected by the other MDS variants and MSBDS is mitigated
|
|
before the CPU enters a idle state. As XEON PHI is not affected by L1TF
|
|
either disabling SMT is not required for full protection.
|
|
|
|
.. _mds_smt_control:
|
|
|
|
SMT control
|
|
^^^^^^^^^^^
|
|
|
|
All MDS variants except MSBDS can be attacked cross Hyper-Threads. That
|
|
means on CPUs which are affected by MFBDS or MLPDS it is necessary to
|
|
disable SMT for full protection. These are most of the affected CPUs; the
|
|
exception is XEON PHI, see :ref:`xeon_phi`.
|
|
|
|
Disabling SMT can have a significant performance impact, but the impact
|
|
depends on the type of workloads.
|
|
|
|
See the relevant chapter in the L1TF mitigation documentation for details:
|
|
:ref:`Documentation/admin-guide/hw-vuln/l1tf.rst <smt_control>`.
|
|
|
|
|
|
.. _mds_mitigation_control_command_line:
|
|
|
|
Mitigation control on the kernel command line
|
|
---------------------------------------------
|
|
|
|
The kernel command line allows to control the MDS mitigations at boot
|
|
time with the option "mds=". The valid arguments for this option are:
|
|
|
|
============ =============================================================
|
|
full If the CPU is vulnerable, enable all available mitigations
|
|
for the MDS vulnerability, CPU buffer clearing on exit to
|
|
userspace and when entering a VM. Idle transitions are
|
|
protected as well if SMT is enabled.
|
|
|
|
It does not automatically disable SMT.
|
|
|
|
full,nosmt The same as mds=full, with SMT disabled on vulnerable
|
|
CPUs. This is the complete mitigation.
|
|
|
|
off Disables MDS mitigations completely.
|
|
|
|
============ =============================================================
|
|
|
|
Not specifying this option is equivalent to "mds=full". For processors
|
|
that are affected by both TAA (TSX Asynchronous Abort) and MDS,
|
|
specifying just "mds=off" without an accompanying "tsx_async_abort=off"
|
|
will have no effect as the same mitigation is used for both
|
|
vulnerabilities.
|
|
|
|
Mitigation selection guide
|
|
--------------------------
|
|
|
|
1. Trusted userspace
|
|
^^^^^^^^^^^^^^^^^^^^
|
|
|
|
If all userspace applications are from a trusted source and do not
|
|
execute untrusted code which is supplied externally, then the mitigation
|
|
can be disabled.
|
|
|
|
|
|
2. Virtualization with trusted guests
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
The same considerations as above versus trusted user space apply.
|
|
|
|
3. Virtualization with untrusted guests
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
The protection depends on the state of the L1TF mitigations.
|
|
See :ref:`virt_mechanism`.
|
|
|
|
If the MDS mitigation is enabled and SMT is disabled, guest to host and
|
|
guest to guest attacks are prevented.
|
|
|
|
.. _mds_default_mitigations:
|
|
|
|
Default mitigations
|
|
-------------------
|
|
|
|
The kernel default mitigations for vulnerable processors are:
|
|
|
|
- Enable CPU buffer clearing
|
|
|
|
The kernel does not by default enforce the disabling of SMT, which leaves
|
|
SMT systems vulnerable when running untrusted code. The same rationale as
|
|
for L1TF applies.
|
|
See :ref:`Documentation/admin-guide/hw-vuln//l1tf.rst <default_mitigations>`.
|