Messages in this thread | | | Date | Tue, 1 Sep 2020 15:02:08 +0100 | From | Mark Rutland <> | Subject | Re: [PATCH] x86/uaccess: Use pointer masking to limit uaccess speculation |
| |
On Wed, Aug 19, 2020 at 09:50:06AM -0500, Josh Poimboeuf wrote: > The x86 uaccess code uses barrier_nospec() in various places to prevent > speculative dereferencing of user-controlled pointers (which might be > combined with further gadgets or CPU bugs to leak data). > > There are some issues with the current implementation: > > - The barrier_nospec() in copy_from_user() was inadvertently removed > with: 4b842e4e25b1 ("x86: get rid of small constant size cases in > raw_copy_{to,from}_user()") > > - copy_to_user() and friends should also have a speculation barrier, > because a speculative write to a user-controlled address can still > populate the cache line with the original data. > > - The LFENCE in barrier_nospec() is overkill, when more lightweight user > pointer masking can be used instead. > > Remove all existing barrier_nospec() usage, and instead do user pointer > masking, throughout the x86 uaccess code. This is similar to what arm64 > is already doing. > > barrier_nospec() is now unused, and can be removed.
One thing to consider is whether you need a speculation barrier after set_fs(). Otherwise for code like:
| fs = get_fs(); | if (cond) | set_fs(KERNEL_DS); | copy_to_user(...) | set_fs(fs)
... the set_fs() can occur speculatively, and may be able to satisfy the masking logic if forwarded within the cpu.
See arm64 commit:
c2f0ad4fc089cff8 ("arm64: uaccess: Prevent speculative use of the current addr_limit")
Thanks, Mark.
| |