Re: [PATCH] uprobes: use vm_special_mapping close() functionality

From: Oleg Nesterov
Date: Wed Sep 11 2024 - 05:45:09 EST


On 09/03, Sven Schnelle wrote:
>
> +static void uprobe_clear_state(const struct vm_special_mapping *sm, struct vm_area_struct *vma)
> +{
> + struct xol_area *area = container_of(vma->vm_private_data, struct xol_area, xol_mapping);
> +
> + mutex_lock(&delayed_uprobe_lock);
> + delayed_uprobe_remove(NULL, vma->vm_mm);
> + mutex_unlock(&delayed_uprobe_lock);
> +
> + if (!area)
> + return;
> +
> + put_page(area->pages[0]);
> + kfree(area->bitmap);
> + kfree(area);
> +}
> +
> static struct xol_area *__create_xol_area(unsigned long vaddr)
> {
> struct mm_struct *mm = current->mm;
> @@ -1481,6 +1500,7 @@ static struct xol_area *__create_xol_area(unsigned long vaddr)
>
> area->xol_mapping.name = "[uprobes]";
> area->xol_mapping.fault = NULL;
> + area->xol_mapping.close = uprobe_clear_state;

Ah, no, we can't do this :/

A malicious application can munmap() its "[uprobes]" vma and free
area/pages/bitmap. If this application hits the uprobe breakpoint after
that it will use the freed memory.

And no, "mm->uprobes_state.xol_area = NULL" in uprobe_clear_state() won't
help. Say, another thread can sleep on area.wq when munmap() is called.

Sorry, I should have realized that immediately, but I didn't :/

Andrew, this is uprobes-use-vm_special_mapping-close-functionality.patch
in mm-stable

Oleg.