• Eric W. Biederman's avatar
    coredump: Limit coredumps to a single thread group · 0258b5fd
    Eric W. Biederman authored
    Today when a signal is delivered with a handler of SIG_DFL whose
    default behavior is to generate a core dump not only that process but
    every process that shares the mm is killed.
    
    In the case of vfork this looks like a real world problem.  Consider
    the following well defined sequence.
    
    	if (vfork() == 0) {
    		execve(...);
    		_exit(EXIT_FAILURE);
    	}
    
    If a signal that generates a core dump is received after vfork but
    before the execve changes the mm the process that called vfork will
    also be killed (as the mm is shared).
    
    Similarly if the execve fails after the point of no return the kernel
    delivers SIGSEGV which will kill both the exec'ing process and because
    the mm is shared the process that called vfork as well.
    
    As far as I can tell this behavior is a violation of people's
    reasonable expectations, POSIX, and is unnecessarily fragile when the
    system is low on memory.
    
    Solve this by making a userspace visible change to only kill a single
    process/thread group.  This is possible because Jann Horn recently
    modified[1] the coredump code so that the mm can safely be modified
    while the coredump is happening.  With LinuxThreads long gone I don't
    expect anyone to have a notice this behavior change in practice.
    
    To accomplish this move the core_state pointer from mm_struct to
    signal_struct, which allows different thread groups to coredump
    simultatenously.
    
    In zap_threads remove the work to kill anything except for the current
    thread group.
    
    v2: Remove core_state from the VM_BUG_ON_MM print to fix
        compile failure when CONFIG_DEBUG_VM is enabled.
    Reported-by: default avatarStephen Rothwell <sfr@canb.auug.org.au>
    
    [1] a07279c9 ("binfmt_elf, binfmt_elf_fdpic: use a VMA list snapshot")
    Fixes: d89f3847 ("[PATCH] thread-aware coredumps, 2.5.43-C3")
    History-tree: git://git.kernel.org/pub/scm/linux/kernel/git/tglx/history.git
    Link: https://lkml.kernel.org/r/87y27mvnke.fsf@disp2133
    Link: https://lkml.kernel.org/r/20211007144701.67592574@canb.auug.org.auReviewed-by: default avatarKees Cook <keescook@chromium.org>
    Signed-off-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
    0258b5fd
fork.c 77.6 KB