<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Jun 22, 2019 at 9:15 PM Dmitry V. Levin <<a href="mailto:ldv@altlinux.org">ldv@altlinux.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On Sat, Jun 22, 2019 at 07:00:55PM +0800, Zhibin Li wrote:<br>
> On Fri, Jun 21, 2019 at 7:13 PM Dmitry V. Levin <<a href="mailto:ldv@altlinux.org" target="_blank">ldv@altlinux.org</a>> wrote:<br>
> <br>
> > On Wed, Jun 19, 2019 at 09:31:25AM +0800, Zhibin Li wrote:<br>
> > > Just FYI I write a demo[1] of priv qualifier for -e inject.<br>
> > > It can be used like:<br>
> > > # strace -eioctl -e inject=ioctl:retval=42:priv=i915 ./a.out<br>
> > > Basically it works as I expect but this is a experimental patch.<br>
> > > The way it makes things work may be ugly so any commnets/suggestions are<br>
> > > welcomed :).<br>
> > ><br>
> > > [1]<br>
> > ><br>
> > <a href="https://github.com/haoyouab/strace/commit/9c915fe7ed66f08b41b5d9c72e3d03b09c8ca9a3" rel="noreferrer" target="_blank">https://github.com/haoyouab/strace/commit/9c915fe7ed66f08b41b5d9c72e3d03b09c8ca9a3</a><br>
> ><br>
> > Well, this is not even an injection into the tracee, it's an overwriting<br>
> > of strace internal tcp->_priv_data with arbitrary data.<br>
> ><br>
> > Yes, it's actually an overwriting.<br>
> <br>
> > Yes, it's notoriously difficult to implement a positive testing of ioctl<br>
> > decoders.  In this case you need to convince strace to enable i915-specific<br>
> > decoder.<br>
> <br>
> If you could subvert e.g. readlink("/sys/class/drm/null/device/driver", ...)<br>
> > to return something that ends with /i915, this would be enough for<br>
> > drm_is_driver(tcp, "i915") to return true.<br>
> ><br>
> Currently in drm.c[1] the execution sequence is:<br>
> getfdpath(...);<br>
> readlink(...);<br>
> The key point to enable i915-specifc decoder is to obtain a valid device<br>
> path<br>
> from the fd by calling getfdpath. In this case it's /dev/dri/card0. Only<br>
> after that<br>
> readlink() will try to read the driver name which links to that device,<br>
> which is<br>
> readlink("/sys/class/drm/card0/device/driver", ...). So if we use fd = -1<br>
> like we<br>
> usually do, getfdpath will fail and the decoder will return before readlink<br>
> is<br>
> executed. Should we consider subverting getfdpath instead?<br>
> <br>
> [1] <a href="https://github.com/haoyouab/strace/blob/stuff/drm.c#L33" rel="noreferrer" target="_blank">https://github.com/haoyouab/strace/blob/stuff/drm.c#L33</a><br>
> <br>
> My question here is that in order to convince strace when we run tests, a<br>
> string that explicitly specifies the device name (e.g. "i915", "nouveau")<br>
> has to be used along with an option and passed to strace, right? Because<br>
> there are many other device specific ioctls like amdgpu, nouveau. When the<br>
> tests are running, strace has to know which device specific decoder to<br>
> enable.</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
We are not bound to use fd == -1, we can use any descriptor in our reach,<br>
e.g. we can open /dev/null and use it instead.<br></blockquote><div>Oh I see. </div><div>BTW may I ask what's the problem/concern of convincing strace to call device</div><div>specific decoders by overwriting the internal tcp->_priv_data? It is no injection</div><div>but what about adding another option, may be something like -e priv=i915. I am</div><div>not sure what the option should look like, but there should be a way to specify a</div><div>specific device when running strace command, right? Any thoughts?</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
-- <br>
ldv<br>
-- <br>
Strace-devel mailing list<br>
<a href="mailto:Strace-devel@lists.strace.io" target="_blank">Strace-devel@lists.strace.io</a><br>
<a href="https://lists.strace.io/mailman/listinfo/strace-devel" rel="noreferrer" target="_blank">https://lists.strace.io/mailman/listinfo/strace-devel</a><br>
</blockquote></div></div>