From: Li Chen <me@linux.beauty>
To: "Andy Lutomirski" <luto@kernel.org>
Cc: "Christian Brauner" <brauner@kernel.org>,
"Kees Cook" <kees@kernel.org>,
"Gabriel Krisman Bertazi" <krisman@kernel.org>,
"Josh Triplett" <josh@joshtriplett.org>,
"Mateusz Guzik" <mjguzik@gmail.com>,
"John Ericson" <mail@johnericson.me>,
"Jonathan Corbet" <corbet@lwn.net>,
"Shuah Khan" <shuah@kernel.org>, "Arnd Bergmann" <arnd@arndb.de>,
"Oleg Nesterov" <oleg@redhat.com>,
"Andrew Morton" <akpm@linux-foundation.org>,
"Paul Moore" <paul@paul-moore.com>,
"Eric Paris" <eparis@redhat.com>,
"\"Mickaël Salaün\"" <mic@digikod.net>,
"\"Günther Noack\"" <gnoack@google.com>,
"Alexander Viro" <viro@zeniv.linux.org.uk>,
"Jan Kara" <jack@suse.cz>, linux-api <linux-api@vger.kernel.org>,
linux-fsdevel <linux-fsdevel@vger.kernel.org>,
linux-kernel <linux-kernel@vger.kernel.org>,
linux-kselftest <linux-kselftest@vger.kernel.org>,
linux-doc <linux-doc@vger.kernel.org>,
audit <audit@vger.kernel.org>,
linux-security-module <linux-security-module@vger.kernel.org>,
linux-arch <linux-arch@vger.kernel.org>,
linux-mm <linux-mm@kvack.org>
Subject: Re: [RFC PATCH 12/24] fork: let kernel callers create embryonic tasks
Date: Wed, 19 Aug 2026 18:19:51 +0800 [thread overview]
Message-ID: <1a01988cfb7.7f8bf9df842660.5856426206659756785@linux.beauty> (raw)
In-Reply-To: <CALCETrU2sCf_Ab2oDcUuJV53mhaDHTtf7QNqPJuFxV_ESHkbtg@mail.gmail.com>
Hi Andy,
---- On Thu, 16 Jul 2026 23:57:58 +0800 Andy Lutomirski <luto@kernel.org> wrote ---
> On Thu, Jul 16, 2026 at 8:52 AM Li Chen <me@linux.beauty> wrote:
> >
> > A kernel-created task can become visible before it has installed a new
> > executable image or a valid userspace register frame. Exposing such a task
> > through ptrace can disclose kernel setup state.
> >
> > Add a task-local embryonic flag and an internal clone argument for callers
> > that need this lifecycle. Reject ptrace access until the creator clears the
> > flag. Clear it with release ordering and observe it with acquire ordering.
> > This orders visibility of the completed exec state with the transition.
> >
> > Existing fork, vfork, clone, and kernel-thread callers leave the argument
> > unset and retain their current behavior.
> >
>
> > --- a/kernel/ptrace.c
> > +++ b/kernel/ptrace.c
> > @@ -56,6 +56,8 @@ bool ptracer_access_allowed(struct task_struct *tsk)
> > guard(rcu)();
> > if (ptrace_parent(tsk) != current)
> > return false;
> > + if (task_is_embryonic_exec(tsk))
> > + return false;
> > es = task_exec_state_rcu(tsk);
> > return READ_ONCE(es->dumpable) == TASK_DUMPABLE_OWNER ||
> > ptracer_capable(tsk, es->user_ns);
> > @@ -312,6 +314,8 @@ static int __ptrace_may_access(struct task_struct *task, unsigned int mode)
> > WARN(1, "denying ptrace access check without PTRACE_MODE_*CREDS\n");
> > return -EPERM;
> > }
> > + if (task_is_embryonic_exec(task))
> > + return -EPERM;
>
> Would it be better to use a different error code? -ECONNREFUSED?
> After all, this isn't a permission failure per se.
Good point. I'm not sure ECONNREFUSED fits outside connection setup,
though. ESRCH may make more sense if the task is meant to appear hidden.
I'll think about this some more.
> There's a not-locally-obvious gotcha here: reading other process
> attributes prior to calling task_is_embryonic_exec may result in
> (security-relevant!) data races. This should at least be documented
> -- it's critical to check task_is_embryonic_exec *before* trying to
> read credentials. Also, I think /proc and many pidfd APIs have the
> same issue.
Agreed. Patch 15 later in the series already applies this ordering to procfs,
including cached dentry revalidation, and to PIDFD_GET_INFO.
The ordering requirement still needs to be made more explicit. I'll
document it, move the check ahead of ptrace_parent() in
ptracer_access_allowed(), and audit the remaining pidfd users before the
next version.
Regards,
Li
next prev parent reply other threads:[~2026-08-19 10:20 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-16 14:31 [RFC PATCH 00/24] pidfd: add a minimal process spawn builder Li Chen
2026-07-16 14:31 ` [RFC PATCH 01/24] pidfd: add spawn builder uapi Li Chen
2026-07-16 14:31 ` [RFC PATCH 02/24] libfs: allow custom validation of stashed inode data Li Chen
2026-07-16 14:31 ` [RFC PATCH 03/24] pidfs: add taskless future pidfd inodes Li Chen
2026-07-16 14:31 ` [RFC PATCH 04/24] pidfd: create taskless spawn builders Li Chen
2026-07-16 14:31 ` [RFC PATCH 05/24] pidfd: add spawn builder path configuration Li Chen
2026-07-16 14:31 ` [RFC PATCH 06/24] exec: expose execveat internals to process builders Li Chen
2026-07-16 14:31 ` [RFC PATCH 07/24] fork: expose vfork completion helper Li Chen
2026-07-16 14:31 ` [RFC PATCH 08/24] pidfs: attach pids to future pidfd files Li Chen
2026-07-16 14:31 ` [RFC PATCH 09/24] fork: let process builders supply preallocated pids Li Chen
2026-07-16 14:31 ` [RFC PATCH 10/24] pidfs: publish future pidfd files Li Chen
2026-07-16 14:31 ` [RFC PATCH 11/24] pidfd: add spawn builder state tracking Li Chen
2026-07-16 14:31 ` [RFC PATCH 12/24] fork: let kernel callers create embryonic tasks Li Chen
2026-07-16 15:57 ` Andy Lutomirski
2026-08-19 10:19 ` Li Chen [this message]
2026-07-16 14:31 ` [RFC PATCH 13/24] fork: let new tasks start with task work Li Chen
2026-07-16 14:31 ` [RFC PATCH 14/24] pidfd: create and execute spawn builder tasks Li Chen
2026-07-16 14:31 ` [RFC PATCH 15/24] fork: keep embryonic tasks hidden until exec completes Li Chen
2026-07-16 14:31 ` [RFC PATCH 16/24] audit: add pidfd spawn child contexts Li Chen
2026-07-16 14:31 ` [RFC PATCH 17/24] pidfd: audit child spawn execution Li Chen
2026-07-16 14:31 ` [RFC PATCH 18/24] pidfd: make spawn builder execution signal-safe Li Chen
2026-07-16 14:31 ` [RFC PATCH 19/24] file: expose spawn file-action helpers Li Chen
2026-07-16 14:31 ` [RFC PATCH 20/24] pidfd: add initial spawn file actions Li Chen
2026-07-16 14:31 ` [RFC PATCH 21/24] pidfd: consume spawn builders on the first run attempt Li Chen
2026-07-16 14:31 ` [RFC PATCH 22/24] pidfd: expose spawn builder system calls Li Chen
2026-07-16 14:31 ` [RFC PATCH 23/24] selftests/pidfd: cover pidfd spawn builders Li Chen
2026-07-16 14:31 ` [RFC PATCH 24/24] Documentation: describe " Li Chen
2026-08-04 20:25 ` [RFC PATCH 00/24] pidfd: add a minimal process spawn builder Justin Suess
2026-08-19 1:14 ` Li Chen
2026-08-25 21:27 ` Mateusz Guzik
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=1a01988cfb7.7f8bf9df842660.5856426206659756785@linux.beauty \
--to=me@linux.beauty \
--cc=akpm@linux-foundation.org \
--cc=arnd@arndb.de \
--cc=audit@vger.kernel.org \
--cc=brauner@kernel.org \
--cc=corbet@lwn.net \
--cc=eparis@redhat.com \
--cc=gnoack@google.com \
--cc=jack@suse.cz \
--cc=josh@joshtriplett.org \
--cc=kees@kernel.org \
--cc=krisman@kernel.org \
--cc=linux-api@vger.kernel.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-security-module@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mail@johnericson.me \
--cc=mic@digikod.net \
--cc=mjguzik@gmail.com \
--cc=oleg@redhat.com \
--cc=paul@paul-moore.com \
--cc=shuah@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