linux/Documentation
Rodrigo Campos 0ae71c7720 seccomp: Support atomic "addfd + send reply"
Alban Crequy reported a race condition userspace faces when we want to
add some fds and make the syscall return them[1] using seccomp notify.

The problem is that currently two different ioctl() calls are needed by
the process handling the syscalls (agent) for another userspace process
(target): SECCOMP_IOCTL_NOTIF_ADDFD to allocate the fd and
SECCOMP_IOCTL_NOTIF_SEND to return that value. Therefore, it is possible
for the agent to do the first ioctl to add a file descriptor but the
target is interrupted (EINTR) before the agent does the second ioctl()
call.

This patch adds a flag to the ADDFD ioctl() so it adds the fd and
returns that value atomically to the target program, as suggested by
Kees Cook[2]. This is done by simply allowing
seccomp_do_user_notification() to add the fd and return it in this case.
Therefore, in this case the target wakes up from the wait in
seccomp_do_user_notification() either to interrupt the syscall or to add
the fd and return it.

This "allocate an fd and return" functionality is useful for syscalls
that return a file descriptor only, like connect(2). Other syscalls that
return a file descriptor but not as return value (or return more than
one fd), like socketpair(), pipe(), recvmsg with SCM_RIGHTs, will not
work with this flag.

This effectively combines SECCOMP_IOCTL_NOTIF_ADDFD and
SECCOMP_IOCTL_NOTIF_SEND into an atomic opteration. The notification's
return value, nor error can be set by the user. Upon successful invocation
of the SECCOMP_IOCTL_NOTIF_ADDFD ioctl with the SECCOMP_ADDFD_FLAG_SEND
flag, the notifying process's errno will be 0, and the return value will
be the file descriptor number that was installed.

[1]: https://lore.kernel.org/lkml/CADZs7q4sw71iNHmV8EOOXhUKJMORPzF7thraxZYddTZsxta-KQ@mail.gmail.com/
[2]: https://lore.kernel.org/lkml/202012011322.26DCBC64F2@keescook/

Signed-off-by: Rodrigo Campos <rodrigo@kinvolk.io>
Signed-off-by: Sargun Dhillon <sargun@sargun.me>
Acked-by: Tycho Andersen <tycho@tycho.pizza>
Acked-by: Christian Brauner <christian.brauner@ubuntu.com>
Signed-off-by: Kees Cook <keescook@chromium.org>
Link: https://lore.kernel.org/r/20210517193908.3113-4-sargun@sargun.me
2021-06-28 12:49:52 -07:00
..
ABI libnvdimm fixes for 5.13-rc2 2021-05-15 08:32:51 -07:00
accounting
admin-guide docs: admin-guide: update description for kernel.modprobe sysctl 2021-05-14 19:41:32 -07:00
arm
arm64 Assorted arm64 fixes and clean-ups, the most important: 2021-05-07 12:11:05 -07:00
block Documentation: drop optional BOMs 2021-05-10 15:17:34 -06:00
bpf
cdrom docs: cdrom-standard.rst: get rid of uneeded UTF-8 chars 2021-05-11 11:00:17 -06:00
core-api A few late-arriving documentation fixes, including some oprofile cleanup, a 2021-05-06 08:33:54 -07:00
cpu-freq
crypto
dev-tools scripts/gdb: add lx_current support for arm64 2021-05-07 00:26:33 -07:00
devicetree Kbuild updates for v5.13 (2nd) 2021-05-08 10:00:11 -07:00
doc-guide
driver-api USB fixes for 5.13-rc2 2021-05-16 09:55:05 -07:00
fault-injection
fb
features powerpc updates for 5.13 2021-04-30 12:22:28 -07:00
filesystems erofs: update documentation about data compression 2021-05-11 16:47:15 +08:00
firmware-guide
firmware_class
fpga
gpu
hid
hwmon docs: hwmon: tmp103.rst: fix bad usage of UTF-8 chars 2021-05-11 11:00:18 -06:00
i2c
ia64
ide
iio
infiniband
input Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input 2021-05-06 23:37:55 -07:00
isdn
kbuild Kconfig updates for v5.13 2021-04-29 14:32:00 -07:00
kernel-hacking
leds
litmus-tests
livepatch
locking
m68k
maintainer
mhi
mips
misc-devices
netlabel
networking docs: networking: device_drivers: fix bad usage of UTF-8 chars 2021-05-11 11:00:18 -06:00
nios2
nvdimm
openrisc
parisc
PCI
pcmcia
power
powerpc powerpc updates for 5.13 2021-04-30 12:22:28 -07:00
process Documentation: drop optional BOMs 2021-05-10 15:17:34 -06:00
RCU
riscv
s390
scheduler sched,doc: sched_debug_verbose cmdline should be sched_verbose 2021-05-06 15:33:26 +02:00
scsi
security Documentation: drop optional BOMs 2021-05-10 15:17:34 -06:00
sh
sound
sparc
sphinx
sphinx-static
spi
staging
target
timers Documentation: drop optional BOMs 2021-05-10 15:17:34 -06:00
trace
translations docs/zh_CN: Remove obsolete translation file 2021-05-10 15:14:31 -06:00
usb USB fixes for 5.13-rc2 2021-05-16 09:55:05 -07:00
userspace-api seccomp: Support atomic "addfd + send reply" 2021-06-28 12:49:52 -07:00
virt - Enable -Wundef for the compressed kernel build stage 2021-05-16 09:31:06 -07:00
vm mm: gup: remove FOLL_SPLIT 2021-04-30 11:20:37 -07:00
w1
watchdog
x86 x86/msr: Rename MSR_K8_SYSCFG to MSR_AMD64_SYSCFG 2021-05-10 07:51:38 +02:00
xtensa
.gitignore
arch.rst
asm-annotations.rst
atomic_bitops.txt
atomic_t.txt
Changes
CodingStyle
conf.py
COPYING-logo
docutils.conf
dontdiff
index.rst
Kconfig
logo.gif
Makefile
memory-barriers.txt
SubmittingPatches
watch_queue.rst