lkml.org 
[lkml]   [2013]   [Dec]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: Re: Re: [PATCH -tip v4 0/6] kprobes: introduce NOKPROBE_SYMBOL() and fixes crash bugs
    Hi Ingo,

    (2013/12/13 14:34), Masami Hiramatsu wrote:
    >>>>> And also, even if we can detect the recursion, we can't stop the
    >>>>> kernel, we need to skip the probe. This means that we need to
    >>>>> recover to the main execution path by doing single step. As you
    >>>>> may know, since the single stepping involves the debug exception,
    >>>>> we have to avoid proving on that path too. Or we'll have an
    >>>>> infinite recursion again.
    >>>>
    >>>> I don't see why this is needed: if a "probing is disabled"
    >>>> recursion flag is set the moment the first probe fires, and if
    >>>> it's only cleared once all processing is finished, then any
    >>>> intermediate probes should simply return early from int3 and not
    >>>> fire.
    >>>
    >>> No, because the int3 already changes the original instruction.
    >>> This means that you cannot skip singlestep(or emulate) the
    >>> instruction which is copied to execution buffer (ainsn->insn),
    >>> even if you have such the flag.
    >>> So, kprobe requires the annotations on the singlestep path.
    >>
    >> I don't understand this reasoning.
    >>
    >> Lets assume we allow a probe to be inserted in the single-step path.
    >> Such a probe will be an INT3 instruction and if it hits we get a
    >> recursive INT3 invocation. In that case the INT3 handler should simply
    >> restore the original instruction and _leave it so_. There's no
    >> single-stepping needed - the probe is confused and must be discarded.
    >
    > But how can we restore the protected kernel text?
    > If we use text_poke, we also need to prohibit probing on the text_poke
    > and functions called in the text_poke too. That just shifts the annotated
    > area to the text_poke. :(


    OK, I've checked current text_poke() and thought how we can do that.
    The current text_poke() uses special fixmap to make alias pages for
    avoiding kernel-text readonly protection. For protecting the fixmap
    pages, we are currently using text_mutex and this is why we can't use
    it in exception path. There are other minor issues, but it seems to
    be fixed easily. :)

    Thus, for recovering original instruction in the int3 handler,
    I'd like to propose adding another text_poke like function, which
    requires another fixmap page and protects it by using raw_spinlock
    (to avoid tracing), and just support one-byte poke (this means it
    never across the page boundary).

    Perhaps, it can be implemented inside kprobes, because it is not
    useful for other subsystems.

    Thank you!


    --
    Masami HIRAMATSU
    IT Management Research Dept. Linux Technology Center
    Hitachi, Ltd., Yokohama Research Laboratory
    E-mail: masami.hiramatsu.pt@hitachi.com




    \
     
     \ /
      Last update: 2013-12-16 12:41    [W:4.092 / U:0.348 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site