• Jann Horn's avatar
    timers: Prevent union confusion from unexpected restart_syscall() · 9f76d591
    Jann Horn authored
    The nanosleep syscalls use the restart_block mechanism, with a quirk:
    The `type` and `rmtp`/`compat_rmtp` fields are set up unconditionally on
    syscall entry, while the rest of the restart_block is only set up in the
    unlikely case that the syscall is actually interrupted by a signal (or
    pseudo-signal) that doesn't have a signal handler.
    
    If the restart_block was set up by a previous syscall (futex(...,
    FUTEX_WAIT, ...) or poll()) and hasn't been invalidated somehow since then,
    this will clobber some of the union fields used by futex_wait_restart() and
    do_restart_poll().
    
    If userspace afterwards wrongly calls the restart_syscall syscall,
    futex_wait_restart()/do_restart_poll() will read struct fields that have
    been clobbered.
    
    This doesn't actually lead to anything particularly interesting because
    none of the union fields contain trusted kernel data, and
    futex(..., FUTEX_WAIT, ...) and poll() aren't syscalls where it makes much
    sense to apply seccomp filters to their arguments.
    
    So the current consequences are just of the "if userspace does bad stuff,
    it can damage itself, and that's not a problem" flavor.
    
    But still, it seems like a hazard for future developers, so invalidate the
    restart_block when partly setting it up in the nanosleep syscalls.
    Signed-off-by: default avatarJann Horn <jannh@google.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Link: https://lore.kernel.org/r/20230105134403.754986-1-jannh@google.com
    9f76d591
posix-timers.c 37.5 KB