On Wed, May 27, 2020 at 03:52:03PM -0600, Tycho Andersen wrote: > On Wed, May 27, 2020 at 02:43:49PM -0700, Kees Cook wrote: > > (While I'm here -- why can there be only one listener per task? The > > notifications are filter-specific, not task-specific?) > > Not sure what you mean here? tatic struct file *init_listener(struct seccomp_filter *filter) { struct file *ret = ERR_PTR(-EBUSY); struct seccomp_filter *cur; for (cur = current->seccomp.filter; cur; cur = cur->prev) { if (cur->notif) goto out; } ... /* Installing a second listener in the chain should EBUSY */ EXPECT_EQ(user_trap_syscall(__NR_getpid, SECCOMP_FILTER_FLAG_NEW_LISTENER), -1); EXPECT_EQ(errno, EBUSY); Why does this limit exist? Since the fd is tied to a specific filter, I don't see conflicts about having multiple USER_NOTIF filters on one task -- the monitor's response will either fake it or continue it, so there is no "composition" needed? I must be missing something. > Maybe it's best to decouple them entirely, and have usage go back to > just being the number of tasks, and introduce a new counter for > notification fds. But isn't that already tracked by the VFS? i.e. there is a one-to-one mapping from the "struct file *" returned by "anon_inode_getfile()" and the "struct filter" (though we do not presently save it in the filter) and the VFS tracks how many userspace fds are attached to that struct file via ->f_count (i.e. f_count reaching zero is what triggers calling seccomp_notify_release()). In trying to write up an example patch for this, though, yeah, I don't see how to do the locking. There is the "file" part, which is effectively held by both any task's fd table and by the seccomp filter. I suspect the issue is that the private_data can't be the seccomp_filter. The "validity" of the mapping between kernel and user needs to be tracked externally: struct seccomp_notification_pipe { struct filter *filter; struct file *file; }; But I still can't see where to put the lock or refcount.... -- Kees Cook _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/containers