public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] x86: Allow user accesses to the base of the guard page
@ 2024-11-23 18:48 David Laight
  2024-11-23 19:02 ` Linus Torvalds
  0 siblings, 1 reply; 8+ messages in thread
From: David Laight @ 2024-11-23 18:48 UTC (permalink / raw)
  To: 'Linus Torvalds', Andrew Cooper, bp@alien8.de,
	Josh Poimboeuf
  Cc: x86@kernel.org, linux-kernel@vger.kernel.org,
	'Arnd Bergmann', 'Mikel Rychliski',
	'Thomas Gleixner', 'Ingo Molnar',
	'Borislav Petkov', 'Dave Hansen',
	'H. Peter Anvin'

A user buffer can validly end with the last valid user address.
In that case access_ok(ptr, size) will check that 'ptr + size'
is a valid user address - and it needs to succeed.
access_ok() can't decrement the length because access_ok(ptr, 0)
also has to be valid.
Any actual access will fault.

Fixes: 86e6b1547b3d0 ("x86: fix user address masking non-canonical speculation issue")
Signed-off-by: David Laight <david.laight@aculab.com>
---
 arch/x86/kernel/cpu/common.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index 06a516f6795b..ca327cfa42ae 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -2389,12 +2389,12 @@ void __init arch_cpu_finalize_init(void)
 	alternative_instructions();
 
 	if (IS_ENABLED(CONFIG_X86_64)) {
-		unsigned long USER_PTR_MAX = TASK_SIZE_MAX-1;
+		unsigned long USER_PTR_MAX = TASK_SIZE_MAX;
 
 		/*
 		 * Enable this when LAM is gated on LASS support
 		if (cpu_feature_enabled(X86_FEATURE_LAM))
-			USER_PTR_MAX = (1ul << 63) - PAGE_SIZE - 1;
+			USER_PTR_MAX = (1ul << 63) - PAGE_SIZE;
 		 */
 		runtime_const_init(ptr, USER_PTR_MAX);
 
-- 
2.17.1

-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH] x86: Allow user accesses to the base of the guard page
  2024-11-23 18:48 [PATCH] x86: Allow user accesses to the base of the guard page David Laight
@ 2024-11-23 19:02 ` Linus Torvalds
  2024-11-23 22:36   ` David Laight
  0 siblings, 1 reply; 8+ messages in thread
From: Linus Torvalds @ 2024-11-23 19:02 UTC (permalink / raw)
  To: David Laight
  Cc: Andrew Cooper, bp@alien8.de, Josh Poimboeuf, x86@kernel.org,
	linux-kernel@vger.kernel.org, Arnd Bergmann, Mikel Rychliski,
	Thomas Gleixner, Ingo Molnar, Dave Hansen, H. Peter Anvin

On Sat, 23 Nov 2024 at 10:48, David Laight <David.Laight@aculab.com> wrote:
>
> In that case access_ok(ptr, size) will check that 'ptr + size'
> is a valid user address -

The point of USER_PTR_MAX is that the size never matters and we never
check it. So the "-1" is basically just the minimal size.

And the code does actually depend on the fact that the access has to
start *before* the boundary to work.

Now, we do have that whole "at least PAGE_SIZE of guard page", and so
the 1-byte minimal size doesn't actually matter, but I don't see the
point of the change.

In particular, I don't see when it would matter to do access_ok(ptr,
0) in the first place. Who does that, and why would it make any sense?

               Linus

^ permalink raw reply	[flat|nested] 8+ messages in thread

* RE: [PATCH] x86: Allow user accesses to the base of the guard page
  2024-11-23 19:02 ` Linus Torvalds
@ 2024-11-23 22:36   ` David Laight
  2024-11-23 23:44     ` Linus Torvalds
  0 siblings, 1 reply; 8+ messages in thread
From: David Laight @ 2024-11-23 22:36 UTC (permalink / raw)
  To: 'Linus Torvalds'
  Cc: Andrew Cooper, bp@alien8.de, Josh Poimboeuf, x86@kernel.org,
	linux-kernel@vger.kernel.org, Arnd Bergmann, Mikel Rychliski,
	Thomas Gleixner, Ingo Molnar, Dave Hansen, H. Peter Anvin

From: Linus Torvalds
> Sent: 23 November 2024 19:03
> 
> On Sat, 23 Nov 2024 at 10:48, David Laight <David.Laight@aculab.com> wrote:
> >
> > In that case access_ok(ptr, size) will check that 'ptr + size'
> > is a valid user address -
> 
> The point of USER_PTR_MAX is that the size never matters and we never
> check it. So the "-1" is basically just the minimal size.
> 
> And the code does actually depend on the fact that the access has to
> start *before* the boundary to work.

That is the boundary at the end of the guard page.

> Now, we do have that whole "at least PAGE_SIZE of guard page", and so
> the 1-byte minimal size doesn't actually matter, but I don't see the
> point of the change.
> 
> In particular, I don't see when it would matter to do access_ok(ptr,
> 0) in the first place. Who does that, and why would it make any sense?

The problem is that it is valid to pass a buffer that ends right
at the end of valid user memory.
In that case the 'ptr + size' that access_ok() checks is equal to
'TASK_SIZE_MAX' - and currently fails.

There is also an access_ok() check in iovec_import (or is it
import_iovec) that does a check on every fragment.
It is definitely valid to pass a zero length buffer there.
(That check is probably redundant.)

So access_ok() can't check 'ptr + size - 1' without an extra check
for zero length.
And, in any case, you wouldn't want to subtract one in every access_ok()
call.

	David

-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] x86: Allow user accesses to the base of the guard page
  2024-11-23 22:36   ` David Laight
@ 2024-11-23 23:44     ` Linus Torvalds
  2024-11-24  0:24       ` Mikel Rychliski
  2024-11-24 10:28       ` David Laight
  0 siblings, 2 replies; 8+ messages in thread
From: Linus Torvalds @ 2024-11-23 23:44 UTC (permalink / raw)
  To: David Laight
  Cc: Andrew Cooper, bp@alien8.de, Josh Poimboeuf, x86@kernel.org,
	linux-kernel@vger.kernel.org, Arnd Bergmann, Mikel Rychliski,
	Thomas Gleixner, Ingo Molnar, Dave Hansen, H. Peter Anvin

On Sat, 23 Nov 2024 at 14:36, David Laight <David.Laight@aculab.com> wrote:
>
> The problem is that it is valid to pass a buffer that ends right
> at the end of valid user memory.

There's a difference between "valid" and "we care".

This is way past that case. The only possible reason for that
zero-byte thing at the end of the address space is somebody actively
looking for some edge case, not a real use.

               Linus

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] x86: Allow user accesses to the base of the guard page
  2024-11-23 23:44     ` Linus Torvalds
@ 2024-11-24  0:24       ` Mikel Rychliski
  2024-11-24  0:30         ` Linus Torvalds
  2024-11-24 10:28       ` David Laight
  1 sibling, 1 reply; 8+ messages in thread
From: Mikel Rychliski @ 2024-11-24  0:24 UTC (permalink / raw)
  To: David Laight, Linus Torvalds
  Cc: Andrew Cooper, bp@alien8.de, Josh Poimboeuf, x86@kernel.org,
	linux-kernel@vger.kernel.org, Arnd Bergmann, Thomas Gleixner,
	Ingo Molnar, Dave Hansen, H. Peter Anvin

On Saturday, November 23, 2024 6:44:34 P.M. EST you wrote:
> There's a difference between "valid" and "we care".
> 
> This is way past that case. The only possible reason for that
> zero-byte thing at the end of the address space is somebody actively
> looking for some edge case, not a real use.

access_ok() for x86_64 checks the validity of the byte one past the end of the 
requested buffer, even if that buffer is non-zero.

I ran into this in kernels that include 86e6b1547b3d0 with a BPF program that 
grabs the bottom of the user stack in PAGE_SIZE chunks. Reading the final page 
of user space returns -EFAULT now because the access_ok() check fails.

I've been working around with this:
https://lore.kernel.org/lkml/20241109210313.440495-1-mikel@mikelr.com/



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] x86: Allow user accesses to the base of the guard page
  2024-11-24  0:24       ` Mikel Rychliski
@ 2024-11-24  0:30         ` Linus Torvalds
  2024-11-24  3:10           ` Mikel Rychliski
  0 siblings, 1 reply; 8+ messages in thread
From: Linus Torvalds @ 2024-11-24  0:30 UTC (permalink / raw)
  To: Mikel Rychliski
  Cc: David Laight, Andrew Cooper, bp@alien8.de, Josh Poimboeuf,
	x86@kernel.org, linux-kernel@vger.kernel.org, Arnd Bergmann,
	Thomas Gleixner, Ingo Molnar, Dave Hansen, H. Peter Anvin

On Sat, 23 Nov 2024 at 16:24, Mikel Rychliski <mikel@mikelr.com> wrote:
>
> access_ok() for x86_64 checks the validity of the byte one past the end of the
> requested buffer, even if that buffer is non-zero.

Ahh, the non-zero case does indeed look like a valid reason for fixing
this. I was just reacting to the stated zero-sized case that really
doesn't matter.

So if David's patch fixes your use case, I'm happy to apply it with a
fixed commit message.

           Linus

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] x86: Allow user accesses to the base of the guard page
  2024-11-24  0:30         ` Linus Torvalds
@ 2024-11-24  3:10           ` Mikel Rychliski
  0 siblings, 0 replies; 8+ messages in thread
From: Mikel Rychliski @ 2024-11-24  3:10 UTC (permalink / raw)
  To: Linus Torvalds
  Cc: David Laight, Andrew Cooper, bp@alien8.de, Josh Poimboeuf,
	x86@kernel.org, linux-kernel@vger.kernel.org, Arnd Bergmann,
	Thomas Gleixner, Ingo Molnar, Dave Hansen, H. Peter Anvin

On Saturday, November 23, 2024 7:30:06 P.M. EST Linus Torvalds wrote:
> So if David's patch fixes your use case, I'm happy to apply it with a
> fixed commit message.

Thanks, confirmed this case is fixed with David's patch:

Tested-by: Mikel Rychliski <mikel@mikelr.com>



^ permalink raw reply	[flat|nested] 8+ messages in thread

* RE: [PATCH] x86: Allow user accesses to the base of the guard page
  2024-11-23 23:44     ` Linus Torvalds
  2024-11-24  0:24       ` Mikel Rychliski
@ 2024-11-24 10:28       ` David Laight
  1 sibling, 0 replies; 8+ messages in thread
From: David Laight @ 2024-11-24 10:28 UTC (permalink / raw)
  To: 'Linus Torvalds'
  Cc: Andrew Cooper, bp@alien8.de, Josh Poimboeuf, x86@kernel.org,
	linux-kernel@vger.kernel.org, Arnd Bergmann, Mikel Rychliski,
	Thomas Gleixner, Ingo Molnar, Dave Hansen, H. Peter Anvin

From: Linus Torvalds
> Sent: 23 November 2024 23:45
> 
> On Sat, 23 Nov 2024 at 14:36, David Laight <David.Laight@aculab.com> wrote:
> >
> > The problem is that it is valid to pass a buffer that ends right
> > at the end of valid user memory.
> 
> There's a difference between "valid" and "we care".
> 
> This is way past that case. The only possible reason for that
> zero-byte thing at the end of the address space is somebody actively
> looking for some edge case, not a real use.

Mikel gave the exact test that was failing.

I should have been more clear that the issue is fixing valid transfers
that end at the end of valid memory without breaking zero length
transfers anywhere else.

	David

-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2024-11-24 10:28 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-23 18:48 [PATCH] x86: Allow user accesses to the base of the guard page David Laight
2024-11-23 19:02 ` Linus Torvalds
2024-11-23 22:36   ` David Laight
2024-11-23 23:44     ` Linus Torvalds
2024-11-24  0:24       ` Mikel Rychliski
2024-11-24  0:30         ` Linus Torvalds
2024-11-24  3:10           ` Mikel Rychliski
2024-11-24 10:28       ` David Laight

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox