During futex_key_to_node_opt() execution, vma->vm_policy is read under speculative mmap lock and RCU. Concurrently, mbind() may call vma_replace_policy() which frees the old mempolicy immediately via kmem_cache_free(). This creates a race where __futex_key_to_node() dereferences a freed mempolicy pointer, causing a use-after-free read of mpol->mode. [ 151.412631] BUG: KASAN: slab-use-after-free in __futex_key_to_node (kernel/futex/core.c:349) [ 151.414046] Read of size 2 at addr ffff888001c49634 by task e/87 [ 151.415969] Call Trace: [ 151.416732] __asan_load2 (mm/kasan/generic.c:271) [ 151.416777] __futex_key_to_node (kernel/futex/core.c:349) [ 151.416822] get_futex_key (kernel/futex/core.c:374 kernel/futex/core.c:386 kernel/futex/core.c:593) Fix by adding rcu to __mpol_put().
Showing the changes to kernel (1 of 3 files). Show all
Unified · Split
| @@ -342,7 +342,7 @@ static int __futex_key_to_node(struct mm_struct *mm, unsigned long addr) · 341 unmodified lines | |||
| 342 | if (!vma) | 342 | if (!vma) |
| 343 | return FUTEX_NO_NODE; | 343 | return FUTEX_NO_NODE; |
| 344 | 344 | ||
| 345 | mpol = vma_policy(vma); | 345 | mpol = READ_ONCE(vma->vm_policy); |
| 346 | if (!mpol) | 346 | if (!mpol) |
| 347 | return FUTEX_NO_NODE; | 347 | return FUTEX_NO_NODE; |
| 348 | 348 | ||