Skip to content
  • David Hildenbrand's avatar
    binfmt: remove in-tree usage of MAP_DENYWRITE · 4589ff7c
    David Hildenbrand authored
    At exec time when we mmap the new executable via MAP_DENYWRITE we have it
    opened via do_open_execat() and already deny_write_access()'ed the file
    successfully. Once exec completes, we allow_write_acces(); however,
    we set mm->exe_file in begin_new_exec() via set_mm_exe_file() and
    also deny_write_access() as long as mm->exe_file remains set. We'll
    effectively deny write access to our executable via mm->exe_file
    until mm->exe_file is changed -- when the process is removed, on new
    exec, or via sys_prctl(PR_SET_MM_MAP/EXE_FILE).
    
    Let's remove all usage of MAP_DENYWRITE, it's no longer necessary for
    mm->exe_file.
    
    In case of an elf interpreter, we'll now only deny write access to the file
    during exec. This is somewhat okay, because the interpreter behaves
    (and sometime is) a shared library; all shared libraries, especially the
    ones loaded directly in user space like via dlopen() won't ever be mapped
    via MAP_DENYWRITE, because we ignore that from user space completely;
    these shared libraries can always be modified while mapped and executed.
    Let's only special-case the main executable, denying write access while
    being executed by a process. This can be considered a minor user space
    visible change.
    
    While this is a cleanup, it also fixes part of a problem reported with
    VM_DENYWRITE on overlayfs, as VM_DENYWRITE is effectively unused with
    this patch and will be removed next:
      "Overlayfs did not honor positive i_writecount on realfile for
       VM_DENYWRITE mappings." [1]
    
    [1] https://lore.kernel.org/r/YNHXzBgzRrZu1MrD@miu.piliscsaba.redhat.com/
    
    
    
    Reported-by: default avatarChengguang Xu <cgxu519@mykernel.net>
    Acked-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
    Acked-by: default avatarChristian König <christian.koenig@amd.com>
    Signed-off-by: default avatarDavid Hildenbrand <david@redhat.com>
    4589ff7c