[lkml]   [2018]   [Mar]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
SubjectRe: uprobes misses breakpoint insertion into VM_WRITE mappings
On 03/15, Mathieu Desnoyers wrote:
> Hi,
> Erica has been working on extending test-cases for uprobes, and found
> something unexpected:
> Since commit e40cfce626a5 "uprobes: Restrict valid_vma(false) to skip VM_SHARED vmas"
> uprobes does not insert breakpoints into mappings mprotect'd as writeable.

Not really, VM_WRITE was illegal from the very beginning, this commit only
affects the "is_register == false" case.

> This issue can be reproduced by compiling a library without PIC (not using GOT),
> and then concurrently:
> A) Load the library (dynamic loader mprotect the code as writeable to do
> the relocations, and then mprotect as executable),
> B) Enable a uprobe through perf.
> (it is a race window between the two mprotect syscalls)
> It appears that the following restriction in valid_vma() is responsible
> for this behavior:
> if (is_register)
> flags |= VM_WRITE;
> I don't figure a clear explanation for this flag based on the function
> comment nor the commit changelog. Any idea on whether this is really
> needed ?

Because we do not want to modify the writable area. If nothing else, this
can break the application which writes to the page we are going to replace.

> Note that on uprobes unregister, it allows removing a breakpoint event
> on a writeable mapping,

Yes. Because a probed apllication can do mprotect() after the kernel installs
the breakpoint. And we have to remove this breakpoint in any case, even if
this is unsafe too.


 \ /
  Last update: 2018-03-16 17:53    [W:0.051 / U:3.808 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site