From: Tycho Andersen <tycho@tycho.pizza>
To: Jann Horn <jannh@google.com>
Cc: Giuseppe Scrivano <gscrivan@redhat.com>,
Song Liu <songliubraving@fb.com>, Will Drewry <wad@chromium.org>,
Kees Cook <keescook@chromium.org>,
Daniel Borkmann <daniel@iogearbox.net>,
linux-man <linux-man@vger.kernel.org>,
Robert Sesek <rsesek@google.com>,
Containers <containers@lists.linux-foundation.org>,
lkml <linux-kernel@vger.kernel.org>,
Alexei Starovoitov <ast@kernel.org>,
"Michael Kerrisk \(man-pages\)" <mtk.manpages@gmail.com>,
bpf <bpf@vger.kernel.org>, Andy Lutomirski <luto@amacapital.net>,
Christian Brauner <christian@brauner.io>
Subject: Re: For review: seccomp_user_notif(2) manual page [v2]
Date: Thu, 29 Oct 2020 08:16:28 -0600 [thread overview]
Message-ID: <20201029141628.GC25673@cisco> (raw)
In-Reply-To: <CAG48ez1Jz5YqqEMFYoFhgSroHwMeiNqUU9i=QqLN2uLibKthDQ@mail.gmail.com>
On Thu, Oct 29, 2020 at 05:43:35AM +0100, Jann Horn wrote:
> On Thu, Oct 29, 2020 at 3:04 AM Tycho Andersen <tycho@tycho.pizza> wrote:
> > On Thu, Oct 29, 2020 at 02:42:58AM +0100, Jann Horn wrote:
> > > On Mon, Oct 26, 2020 at 10:55 AM Michael Kerrisk (man-pages)
> > > <mtk.manpages@gmail.com> wrote:
> > > > static bool
> > > > getTargetPathname(struct seccomp_notif *req, int notifyFd,
> > > > char *path, size_t len)
> > > > {
> > > > char procMemPath[PATH_MAX];
> > > >
> > > > snprintf(procMemPath, sizeof(procMemPath), "/proc/%d/mem", req->pid);
> > > >
> > > > int procMemFd = open(procMemPath, O_RDONLY);
> > > > if (procMemFd == -1)
> > > > errExit("\tS: open");
> > > >
> > > > /* Check that the process whose info we are accessing is still alive.
> > > > If the SECCOMP_IOCTL_NOTIF_ID_VALID operation (performed
> > > > in checkNotificationIdIsValid()) succeeds, we know that the
> > > > /proc/PID/mem file descriptor that we opened corresponds to the
> > > > process for which we received a notification. If that process
> > > > subsequently terminates, then read() on that file descriptor
> > > > will return 0 (EOF). */
> > > >
> > > > checkNotificationIdIsValid(notifyFd, req->id);
> > > >
> > > > /* Read bytes at the location containing the pathname argument
> > > > (i.e., the first argument) of the mkdir(2) call */
> > > >
> > > > ssize_t nread = pread(procMemFd, path, len, req->data.args[0]);
> > > > if (nread == -1)
> > > > errExit("pread");
> > >
> > > As discussed at
> > > <https://lore.kernel.org/r/CAG48ez0m4Y24ZBZCh+Tf4ORMm9_q4n7VOzpGjwGF7_Fe8EQH=Q@mail.gmail.com>,
> > > we need to re-check checkNotificationIdIsValid() after reading remote
> > > memory but before using the read value in any way. Otherwise, the
> > > syscall could in the meantime get interrupted by a signal handler, the
> > > signal handler could return, and then the function that performed the
> > > syscall could free() allocations or return (thereby freeing buffers on
> > > the stack).
> > >
> > > In essence, this pread() is (unavoidably) a potential use-after-free
> > > read; and to make that not have any security impact, we need to check
> > > whether UAF read occurred before using the read value. This should
> > > probably be called out elsewhere in the manpage, too...
> > >
> > > Now, of course, **reading** is the easy case. The difficult case is if
> > > we have to **write** to the remote process... because then we can't
> > > play games like that. If we write data to a freed pointer, we're
> > > screwed, that's it. (And for somewhat unrelated bonus fun, consider
> > > that /proc/$pid/mem is originally intended for process debugging,
> > > including installing breakpoints, and will therefore happily write
> > > over "readonly" private mappings, such as typical mappings of
> > > executable code.)
> > >
> > > So, uuuuh... I guess if anyone wants to actually write memory back to
> > > the target process, we'd better come up with some dedicated API for
> > > that, using an ioctl on the seccomp fd that magically freezes the
> >
> > By freeze here you mean a killable wait instead of an interruptible
> > wait, right?
>
> Nope, nonkillable.
>
> Consider the case of vfork(), where a target process does something like this:
>
> void spawn_executable(char **argv, char **envv) {
> pid_t child = vfork();
> if (child == 0) {
> char path[1000];
> sprintf(path, ...);
> execve(path, argv, envv);
> }
> }
>
> and the seccomp notifier wants to look at the execve() path (as a
> somewhat silly example). The child process is just borrowing the
> parent's stack, and as soon as the child either gets far enough into
> execve() or dies, the parent continues using that stack.
Ah ha, yes. Thanks for the explanation.
Tycho
_______________________________________________
Containers mailing list
Containers@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/containers
next prev parent reply other threads:[~2020-10-29 14:16 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-26 9:55 For review: seccomp_user_notif(2) manual page [v2] Michael Kerrisk (man-pages)
2020-10-26 9:55 ` Michael Kerrisk (man-pages)
2020-10-26 13:54 ` Tycho Andersen
2020-10-26 13:54 ` Tycho Andersen
2020-10-26 14:30 ` Michael Kerrisk (man-pages)
2020-10-26 14:30 ` Michael Kerrisk (man-pages)
2020-10-26 14:32 ` Tycho Andersen
2020-10-26 14:32 ` Tycho Andersen
2020-10-29 1:42 ` Jann Horn
2020-10-29 1:42 ` Jann Horn via Containers
2020-10-29 2:04 ` Tycho Andersen
2020-10-29 4:43 ` Jann Horn
2020-10-29 4:43 ` Jann Horn via Containers
2020-10-29 14:16 ` Tycho Andersen [this message]
2020-10-29 14:19 ` Michael Kerrisk (man-pages)
2020-10-29 14:19 ` Michael Kerrisk (man-pages)
2020-10-30 19:14 ` Jann Horn
2020-10-30 19:14 ` Jann Horn via Containers
2020-10-31 8:31 ` Michael Kerrisk (man-pages)
2020-10-31 8:31 ` Michael Kerrisk (man-pages)
2020-11-02 13:49 ` Jann Horn
2020-11-02 13:49 ` Jann Horn via Containers
2020-10-29 19:14 ` Michael Kerrisk (man-pages)
2020-10-29 19:14 ` Michael Kerrisk (man-pages)
2020-10-30 19:20 ` Jann Horn
2020-10-30 19:20 ` Jann Horn via Containers
2020-10-31 8:51 ` Michael Kerrisk (man-pages)
2020-10-31 8:51 ` Michael Kerrisk (man-pages)
2020-11-02 14:13 ` Jann Horn
2020-11-02 14:13 ` Jann Horn via Containers
2020-10-29 8:53 ` Sargun Dhillon
2020-10-29 8:53 ` Sargun Dhillon
2020-10-29 20:37 ` Michael Kerrisk (man-pages)
2020-10-29 20:37 ` Michael Kerrisk (man-pages)
2020-10-30 20:27 ` Sargun Dhillon
2020-10-30 20:27 ` Sargun Dhillon
2020-10-31 16:27 ` Michael Kerrisk (man-pages)
2020-10-31 16:27 ` Michael Kerrisk (man-pages)
2020-11-02 8:07 ` Sargun Dhillon
2020-11-02 8:07 ` Sargun Dhillon
2020-11-02 19:45 ` Michael Kerrisk (man-pages)
2020-11-02 19:45 ` Michael Kerrisk (man-pages)
2020-11-02 19:49 ` Sargun Dhillon
2020-11-02 19:49 ` Sargun Dhillon
2020-11-02 20:04 ` Jann Horn
2020-11-02 20:04 ` Jann Horn via Containers
2020-10-29 15:26 ` Christian Brauner
2020-10-29 15:26 ` Christian Brauner
2020-10-29 19:53 ` Michael Kerrisk (man-pages)
2020-10-29 19:53 ` Michael Kerrisk (man-pages)
2020-10-30 19:24 ` Jann Horn
2020-10-30 19:24 ` Jann Horn via Containers
2020-10-30 20:07 ` Michael Kerrisk (man-pages)
2020-10-30 20:07 ` Michael Kerrisk (man-pages)
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=20201029141628.GC25673@cisco \
--to=tycho@tycho.pizza \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=christian@brauner.io \
--cc=containers@lists.linux-foundation.org \
--cc=daniel@iogearbox.net \
--cc=gscrivan@redhat.com \
--cc=jannh@google.com \
--cc=keescook@chromium.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-man@vger.kernel.org \
--cc=luto@amacapital.net \
--cc=mtk.manpages@gmail.com \
--cc=rsesek@google.com \
--cc=songliubraving@fb.com \
--cc=wad@chromium.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.