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.


Reply via email to