Re: [RFC PATCH] seccomp: Add extensibility mechanism to read notifications
From: Jann Horn <jannh@google.com>
Date: 2020-06-15 09:36:52
Also in:
lkml
On Sat, Jun 13, 2020 at 9:26 AM Sargun Dhillon [off-list ref] wrote:
This introduces an extensibility mechanism to receive seccomp notifications. It uses read(2), as opposed to using an ioctl. The listener must be first configured to write the notification via the SECCOMP_IOCTL_NOTIF_CONFIG ioctl with the fields that the user is interested in. This is different than the old SECCOMP_IOCTL_NOTIF_RECV method as it allows for more flexibility. It allows the user to opt into certain fields, and not others. This is nice for users who want to opt into some fields like thread group leader. In the future, this mechanism can be used to expose file descriptors to users,
Please don't touch the caller's file descriptor table from read/write handlers, only from ioctl handlers. A process should always be able to read from files supplied by an untrusted user without having to worry about new entries mysteriously popping up in its fd table.
such as a representation of the process's memory. It also has good forwards and backwards compatibility guarantees. Users with programs compiled against newer headers will work fine on older kernels as long as they don't opt into any sizes, or optional fields that are only available on newer kernels. The ioctl method relies on an extensible struct[1]. This extensible struct is slightly misleading[2] as the ioctl number changes when we extend it. This breaks backwards compatibility with older kernels even if we're not asking for any fields that we do not need. In order to deal with this, the ioctl number would need to be dynamic, or the user would need to pass the size they're expecting, and we would need to implemented "extended syscall" semantics in ioctl. This potentially causes issue to future work of kernel-assisted copying for ioctl user buffers.
I don't see the issue. Can't you replace "switch (cmd)" with "switch (cmd & ~IOCSIZE_MASK)" and then check the size separately?