On Fri, Feb 16, 2018 at 12:51 AM, Nadav Amit <nadav.a...@gmail.com> wrote: > Andrew Cooper <andrew.coop...@citrix.com> wrote: > >> On 16/02/2018 00:25, Nadav Amit wrote: >>> Dave Hansen <dave.han...@linux.intel.com> wrote: >>> >>>> On 02/15/2018 08:35 AM, Nadav Amit wrote: >>>>> I removed the PTI disabling while SMEP is unsupported, although I >>>>> must admit I did not fully understand why it is required. >>>> Do you mean you don't fully understand how PTI gives SMEP-like behavior >>>> on non-SMEP hardware? >>> No. I understand how it provide SMEP-like behavior, and I understand the >>> value >>> of SMEP by itself. >>> >>> However, I do not understand why SMEP-like protection is required to protect >>> processes that run in compatibility-mode from Meltdown/Spectre attacks. As >>> far as I understand, the process should not be able to manipulate the kernel >>> to execute code in the low 4GB. >> >> Being 32bit is itself sufficient protection against Meltdown (as long as >> there nothing interesting of the kernels mapped below the 4G boundary). >> >> However, a 32bit compatibility process try to attack with Spectre/SP2 to >> redirect speculation back into userspace, at which point (if successful) >> the pipeline will be speculating in 64bit mode, and Meltdown is back on >> the table. SMEP will block this attack vector, irrespective of other >> SP2 defences the kernel may employ, but a fully SP2-defended kernel >> doesn't require SMEP to be safe in this case. > > Based on Jann Horn’s description of the branch predictor, it basically only > holds the lowest 31-bits of the target address. There might be a subtle > problem if the prediction wrapsaround, but excluding this case, I do not see > how Spectre v2 can be used to jump into running user code. >
If you can make the *kernel* speculate into user code, you can create whatever gadget you want. A 32-bit task can poison the branch predictor and use this to attack a non-retpolined kernel.