Re: For review: seccomp_user_notif(2) manual page

From: Tycho Andersen
Date: Wed Sep 30 2020 - 19:07:02 EST


On Wed, Sep 30, 2020 at 10:34:51PM +0200, Michael Kerrisk (man-pages) wrote:
> Hi Tycho,
>
> Thanks for taking time to look at the page!
>
> On 9/30/20 5:03 PM, Tycho Andersen wrote:
> > On Wed, Sep 30, 2020 at 01:07:38PM +0200, Michael Kerrisk (man-pages) wrote:
> >> 2. In order that the supervisor process can obtain notifications
> >> using the listening file descriptor, (a duplicate of) that
> >> file descriptor must be passed from the target process to the
> >> supervisor process. One way in which this could be done is by
> >> passing the file descriptor over a UNIX domain socket connec‐
> >> tion between the two processes (using the SCM_RIGHTS ancillary
> >> message type described in unix(7)). Another possibility is
> >> that the supervisor might inherit the file descriptor via
> >> fork(2).
> >
> > It is technically possible to inherit the fd via fork, but is it
> > really that useful? The child process wouldn't be able to actually do
> > the syscall in question, since it would have the same filter.
>
> D'oh! Yes, of course.
>
> I think I was reaching because in an earlier conversation
> you replied:
>
> [[
> > 3. The "target process" passes the "listening file descriptor"
> > to the "monitoring process" via the UNIX domain socket.
>
> or some other means, it doesn't have to be with SCM_RIGHTS.
> ]]
>
> So, what other means?
>
> Anyway, I removed the sentence mentioning fork().

Whatever means people want :). fork() could work (it's how some of the
tests for this feature work, but it's not particularly useful I don't
think), clone(CLONE_FILES) is similar, seccomp_putfd, or maybe even
cloning it via some pidfd interface that might be invented for
re-opening files.

> >> ┌─────────────────────────────────────────────────────┐
> >> │FIXME │
> >> ├─────────────────────────────────────────────────────┤
> >> │From my experiments, it appears that if a SEC‐ │
> >> │COMP_IOCTL_NOTIF_RECV is done after the target │
> >> │process terminates, then the ioctl() simply blocks │
> >> │(rather than returning an error to indicate that the │
> >> │target process no longer exists). │
> >
> > Yeah, I think Christian wanted to fix this at some point,
>
> Do you have a pointer that discussion? I could not find it with a
> quick search.
>
> > but it's a
> > bit sticky to do.
>
> Can you say a few words about the nature of the problem?

I remembered wrong, it's actually in the tree: 99cdb8b9a573 ("seccomp:
notify about unused filter"). So maybe there's a bug here?

> >> ┌─────────────────────────────────────────────────────┐
> >> │FIXME │
> >> ├─────────────────────────────────────────────────────┤
> >> │Interestingly, after the event had been received, │
> >> │the file descriptor indicates as writable (verified │
> >> │from the source code and by experiment). How is this │
> >> │useful? │
> >
> > You're saying it should just do EPOLLOUT and not EPOLLWRNORM? Seems
> > reasonable.
>
> No, I'm saying something more fundamental: why is the FD indicating as
> writable? Can you write something to it? If yes, what? If not, then
> why do these APIs want to say that the FD is writable?

You can't via read(2) or write(2), but conceptually NOTIFY_RECV and
NOTIFY_SEND are reading and writing events from the fd. I don't know
that much about the poll interface though -- is it possible to
indicate "here's a pseudo-read event"? It didn't look like it, so I
just (ab-)used POLLIN and POLLOUT, but probably that's wrong.

Tycho