• Jann Horn's avatar
    mm/mempolicy: Take VMA lock before replacing policy · 6c21e066
    Jann Horn authored
    mbind() calls down into vma_replace_policy() without taking the per-VMA
    locks, replaces the VMA's vma->vm_policy pointer, and frees the old
    policy.  That's bad; a concurrent page fault might still be using the
    old policy (in vma_alloc_folio()), resulting in use-after-free.
    
    Normally this will manifest as a use-after-free read first, but it can
    result in memory corruption, including because vma_alloc_folio() can
    call mpol_cond_put() on the freed policy, which conditionally changes
    the policy's refcount member.
    
    This bug is specific to CONFIG_NUMA, but it does also affect non-NUMA
    systems as long as the kernel was built with CONFIG_NUMA.
    Signed-off-by: default avatarJann Horn <jannh@google.com>
    Reviewed-by: default avatarSuren Baghdasaryan <surenb@google.com>
    Fixes: 5e31275c ("mm: add per-VMA lock and helper functions to control it")
    Cc: stable@kernel.org
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    6c21e066
mempolicy.c 78.7 KB