On Mon, Jul 23, 2018 at 12:25 AM, Greg KH gregkh@linuxfoundation.org wrote:
On Sun, Jul 22, 2018 at 11:05:09AM -0700, Andy Lutomirski wrote:
error_entry and error_exit communicate the user vs kernel status of the frame using %ebx. This is unnecessary -- the information is in regs->cs. Just use regs->cs.
This makes error_entry simpler and makes error_exit more robust.
It also fixes a nasty bug. Before all the Spectre nonsense, The xen_failsafe_callback entry point returned like this:
ALLOC_PT_GPREGS_ON_STACK SAVE_C_REGS SAVE_EXTRA_REGS ENCODE_FRAME_POINTER jmp error_exit
And it did not go through error_entry. This was bogus: RBX contained garbage, and error_exit expected a flag in RBX. Fortunately, it generally contained *nonzero* garbage, so the correct code path was used. As part of the Spectre fixes, code was added to clear RBX to mitigate certain speculation attacks. Now, depending on kernel configuration, RBX got zeroed and, when running some Wine workloads, the kernel crashes. This was introduced by:
commit 3ac6d8c787b8 ("x86/entry/64: Clear registers for exceptions/interrupts, to reduce speculation attack surface")
With this patch applied, RBX is no longer needed as a flag, and the problem goes away.
I suspect that malicious userspace could use this bug to crash the kernel even without the offending patch applied, though.
[Historical note: I wrote this patch as a cleanup before I was aware of the bug it fixed.]
[Note to stable maintainers: this should probably get applied to all kernels. If you're nervous about that, a more conservative fix to add xorl %ebx,%ebx; incl %ebx before the jump to error_exit should also fix the problem.]
Cc: Brian Gerst brgerst@gmail.com Cc: Borislav Petkov bp@alien8.de Cc: Dominik Brodowski linux@dominikbrodowski.net Cc: Ingo Molnar mingo@redhat.com Cc: "H. Peter Anvin" hpa@zytor.com Cc: Thomas Gleixner tglx@linutronix.de Cc: Boris Ostrovsky boris.ostrovsky@oracle.com Cc: Juergen Gross jgross@suse.com Cc: xen-devel@lists.xenproject.org Cc: x86@kernel.org Cc: stable@vger.kernel.org Fixes: 3ac6d8c787b8 ("x86/entry/64: Clear registers for exceptions/interrupts, to reduce speculation attack surface") Reported-and-tested-by: "M. Vefa Bicakci" m.v.b@runbox.com Signed-off-by: Andy Lutomirski luto@kernel.org
I could also submit the conservative fix tagged for -stable and respin this on top of it. Ingo, Greg, what do you prefer?
I don't care, this patch looks good to me to take as-is for the stable trees. If you trust it in Linus's tree, it should be fine for others :)
My concern is more that something may work differently in older kernels and there might be some subtle issue. I'd be surprised, but still.