mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "Arnd Bergmann" <arnd@arndb.de>
To: "James Houghton" <jthoughton@google.com>
Cc: "James E . J . Bottomley" <James.Bottomley@hansenpartnership.com>,
	"Arnaldo Carvalho de Melo" <acme@kernel.org>,
	"Andrew Morton" <akpm@linux-foundation.org>,
	"Pavel Begunkov" <asml.silence@gmail.com>,
	"Alexei Starovoitov" <ast@kernel.org>,
	"Jens Axboe" <axboe@kernel.dk>,
	bpf@vger.kernel.org, "Daniel Borkmann" <daniel@iogearbox.net>,
	"David Hildenbrand (Red Hat)" <david@kernel.org>,
	"David Sterba" <dsterba@suse.com>,
	io-uring@vger.kernel.org, "Jim Mattson" <jmattson@google.com>,
	"John Fastabend" <john.fastabend@gmail.com>,
	"Josh Poimboeuf" <jpoimboe@kernel.org>,
	"Kees Cook" <kees@kernel.org>,
	kvm@vger.kernel.org, "Liam R. Howlett" <liam@infradead.org>,
	linux-btrfs@vger.kernel.org, linux-fsdevel@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-mm@kvack.org,
	linux-perf-users@vger.kernel.org, linux-scsi@vger.kernel.org,
	linux-trace-kernel@vger.kernel.org,
	"Lorenzo Stoakes" <ljs@kernel.org>,
	"Chris Mason" <mason@kernel.org>,
	"Mathieu Desnoyers" <mathieu.desnoyers@efficios.com>,
	"Masami Hiramatsu" <mhiramat@kernel.org>,
	"Michal Hocko" <mhocko@suse.com>,
	"Ingo Molnar" <mingo@redhat.com>,
	"Martin K. Petersen" <mkp@kernel.org>,
	"Namhyung Kim" <namhyung@kernel.org>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Peter Zijlstra" <peterz@infradead.org>,
	"Steven Rostedt" <rostedt@goodmis.org>,
	"Mike Rapoport" <rppt@kernel.org>,
	"Sean Christopherson" <seanjc@google.com>,
	"Suren Baghdasaryan" <surenb@google.com>,
	"Thomas Gleixner" <tglx@kernel.org>,
	"Vlastimil Babka (SUSE)" <vbabka@kernel.org>,
	"Alexander Viro" <viro@zeniv.linux.org.uk>
Subject: Re: [RFC PATCH 00/10] uaccess: Refuse and warn on user accesses when current->mm is NULL
Date: Thu, 29 Oct 2026 00:13:29 +0100	[thread overview]
Message-ID: <32fad21b-5bad-4640-97df-ef0f638cd9e9@app.fastmail.com> (raw)
In-Reply-To: <20261027231728.1466446-1-jthoughton@google.com>

On Wed, Oct 28, 2026, at 00:17, James Houghton wrote:
>>
>>  - does there need to be any compile-time configuration to skip
>>    the extra checks and/or the warnings?
>
> Since patch 10 moves the warning out of line, it costs nothing on the
> fast path, so making the WARN configurable wouldn't save anything. The
> question is really whether the mm check itself should be configurable,
> and that check is also what makes the access safe.

Right, makes sense.

> The text size increase seems manageable[1], but it would be great to
> hear other people's thoughts. For the runtime cost, I'll do some
> performance testing. My guess is that a load of current->mm and a
> well-predicted branch per user access will be negligible, but I'll get
> numbers.

Sounds good. I agree this should not have much of a performance
impact, and for the size it is probably as good as it gets without
a major rework of the lazy mm switch.

>>  - are there any cheaper ways to make it safe than to add a
>>    condition on each user access?
>>    E.g. the original lazy mm switch was intended to avoid
>>    expensive TLB flushes when switching to a kernel thread and
>>    back to the original task on 32-bit x86. On modern CPUs,
>>    the MMU can deal with multiple ASIDs cheaply, so turning
>>    off user access in a kernel thread may be cheaper than
>>    adding code to uaccess depending on the architecture.
>
> That's a fair point. If user memory were inaccessible in kernel threads
> and after exit_mm(), every such access would fault, and the fault
> handler could WARN about it (x86's do_user_addr_fault() already has a
> !mm branch), so it could still be loud without a check on every access.
>
> I'll look into disabling lazy mm switching on x86 and doing some
> performance testing with that (like comparing the per-uaccess check
> with the added cost of non-lazy mm switching).
>
> Other than the performance difference, I see these issues with making
> uaccess safe entirely with the mm switch mechanics:
>
>  - It only helps on architectures (and configs) that implement it,
>    while the common check works everywhere today.

Yes, this would probably be opt-in by architecture, unless we decide
to give up on lazy mm switch altogether and pay the performance
penalty for that on CPUs without ASID support. Either way it is not
be something we can do right away but that we can still consider
in the future.

>  - The fault handler would need to tell legitimate faults apart from
>    bugs, e.g. copy_from_user_nofault() from BPF or perf in a kernel
>    thread is fine and must stay quiet.

Would it be possible to move those checks into the individual
callers that want to avoid the WARN_ON(), with a comment on
each one explaining why they do that? It feels more consistent
to always warn here, and I would expect that for most of the
_nofault() users we do want the warning, and I'm still unsure
what is special about these.

> The series handles that today by
>    checking current->mm in the nofault helpers (patch 6).
>
> The two approaches are mostly complementary: if non-lazy switching
> turns out to be cheap enough, an architecture that does this will have
> better defense against uaccess bugs. But I'd still like the common
> check so that these bugs are reported on every architecture.

Agreed. My main remaining concern is about the number of functions
that need the additional check, if we want to avoid missing
any of them. If we can have the check in access_ok(), that would
cover the majority of the functions you are changing right now,
and it looks like we can deal with the corner cases individually.

Since in principle every user access should go through both
access_ok/mask_user_address and current->mm check at some point,
so combining the two as much as possible should help long-term
maintainability.

>> There are of course few enough of these left that I think
>> we can consider doing the same thing here and turn them all
>> into the checking version:
>>
>> $ git grep -wl __copy_'\(from\|to\)'_user  drivers mm virt
>> drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
>> drivers/gpu/drm/i915/i915_gem.c
>> drivers/gpu/drm/i915/i915_query.c
>> drivers/usb/gadget/udc/atmel_usba_udc.c
>> drivers/vhost/scsi.c
>> drivers/vhost/vhost.c
>> mm/kasan/kasan_test_c.c
>> virt/kvm/kvm_main.c
>
> Agreed, I think we should clean those up, but that can be done
> separately. This series already adds the check to the common
> __copy_{from,to}_user() and __copy_{from,to}_user_inatomic() wrappers
> in include/linux/uaccess.h (patches 7 and 8), so the KVM path is
> covered without converting the callers first.

Right, if dropping __copy_{from,to}_user() as global interfaces does
not help add the check in a consistent way, that can wait as well.
It looks like we are very slowly converting away from them already,
as we have about half the call sites left compared to v5.0.

There are probably few enough of these that we could address them
by either adding current->mm checks or converting them to use
the full versions instead where that is an obvious change like
that usb gadget driver.

>> As a quick fix I would probably start with just the 'if (!mm) return false'
>> bit here to get something merged while we still discuss the other
>> details.
>
> Making the same point as Sean[2] but with a little more detail, I had
> thought about making the change in access_ok(), but:
>
>  - On x86-64 and powerpc, the masked user access paths don't call
>    access_ok() at all. That includes copy_from_user(),
>    strncpy_from_user(), strnlen_user() and every scoped_user_*_access()
>    block, which is where many of the converted __get_user() users ended
>    up.

Ok. Apparently there is some of this on arm64 as well, using
__uaccess_mask_ptr() instead of mask_user_address().

>  - __copy_{from,to}_user() and __copy_from_user_inatomic() skip it too,
>    and the KVM bug followed exactly that pattern: the range was checked
>    once up front, and the access came much later from a different
>    context.

Arguably this is itself a TOCTOU issue and replacing
all __copy_{from,to}_user() with copy_{from,to}_user() would be a better
solution long-term, if we can do that.

>  - access_ok() is also used as a plain range check where having no mm
>    is fine. For example, copy_{from,to}_user_nofault() call
>    __access_ok()/access_ok(), and BPF and perf legitimately call those
>    from kernel threads, so a WARN there would fire on valid tracing.

These at least could be easily worked around by just skipping the
calls to copy_{from,to}_user_nofault() as mentioned above.

      Arnd

      reply	other threads:[~2026-10-28 23:14 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-26 21:52 James Houghton
2026-10-26 21:52 ` [RFC PATCH 01/10] scsi: bsg: Don't copy sense data to user memory when canceled James Houghton
2026-10-27  2:41   ` Jens Axboe
2026-10-27 17:52     ` James Houghton
2026-10-26 21:52 ` [RFC PATCH 02/10] btrfs: Don't copy encoded read " James Houghton
2026-10-27  2:42   ` Jens Axboe
2026-10-26 21:52 ` [RFC PATCH 03/10] bpf: Fail sleepable user copy helpers when current->mm is NULL James Houghton
2026-10-26 22:30   ` bot+bpf-ci
2026-10-27 18:50     ` James Houghton
2026-10-26 21:52 ` [RFC PATCH 04/10] stacktrace: Don't unwind the user stack without an mm James Houghton
2026-10-26 22:30   ` bot+bpf-ci
2026-10-26 22:55     ` James Houghton
2026-10-26 21:52 ` [RFC PATCH 05/10] perf/core: " James Houghton
2026-10-27 11:09   ` Peter Zijlstra
2026-10-27 17:45     ` James Houghton
2026-10-26 21:52 ` [RFC PATCH 06/10] uaccess: Refuse and warn on user copies when current->mm is NULL James Houghton
2026-10-26 22:42   ` bot+bpf-ci
2026-10-26 23:41     ` James Houghton
2026-10-26 21:52 ` [RFC PATCH 07/10] uaccess: Fail user nofault helpers quietly " James Houghton
2026-10-26 21:52 ` [RFC PATCH 08/10] uaccess: Refuse and warn on __copy_from_user_inatomic() without an mm James Houghton
2026-10-26 22:30   ` bot+bpf-ci
2026-10-26 22:41     ` James Houghton
2026-10-26 21:52 ` [RFC PATCH 09/10] uaccess: Refuse and warn on more user accesses " James Houghton
2026-10-26 21:52 ` [RFC PATCH 10/10] uaccess: Move the NULL mm warning out of line James Houghton
2026-10-26 23:02   ` Arnd Bergmann
2026-10-26 23:51     ` James Houghton
2026-10-27  0:12 ` [RFC PATCH 00/10] uaccess: Refuse and warn on user accesses when current->mm is NULL Arnd Bergmann
2026-10-27 10:33   ` Arnd Bergmann
2026-10-27 17:29   ` James Houghton
2026-10-27 18:32     ` Arnd Bergmann
2026-10-27 21:18       ` Sean Christopherson
2026-10-27 23:17       ` James Houghton
2026-10-28 23:13         ` Arnd Bergmann [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=32fad21b-5bad-4640-97df-ef0f638cd9e9@app.fastmail.com \
    --to=arnd@arndb.de \
    --cc=James.Bottomley@hansenpartnership.com \
    --cc=acme@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=asml.silence@gmail.com \
    --cc=ast@kernel.org \
    --cc=axboe@kernel.dk \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=david@kernel.org \
    --cc=dsterba@suse.com \
    --cc=io-uring@vger.kernel.org \
    --cc=jmattson@google.com \
    --cc=john.fastabend@gmail.com \
    --cc=jpoimboe@kernel.org \
    --cc=jthoughton@google.com \
    --cc=kees@kernel.org \
    --cc=kvm@vger.kernel.org \
    --cc=liam@infradead.org \
    --cc=linux-btrfs@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=linux-trace-kernel@vger.kernel.org \
    --cc=ljs@kernel.org \
    --cc=mason@kernel.org \
    --cc=mathieu.desnoyers@efficios.com \
    --cc=mhiramat@kernel.org \
    --cc=mhocko@suse.com \
    --cc=mingo@redhat.com \
    --cc=mkp@kernel.org \
    --cc=namhyung@kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=rppt@kernel.org \
    --cc=seanjc@google.com \
    --cc=surenb@google.com \
    --cc=tglx@kernel.org \
    --cc=vbabka@kernel.org \
    --cc=viro@zeniv.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®