From: Andrey Konovalov <firstname.lastname@example.org> To: Alan Stern <email@example.com> Cc: Greg Kroah-Hartman <firstname.lastname@example.org>, Andrey Konovalov <email@example.com>, "Gustavo A. R. Silva" <firstname.lastname@example.org>, USB list <email@example.com>, Dmitry Vyukov <firstname.lastname@example.org>, Kostya Serebryany <email@example.com>, Alexander Potapenko <firstname.lastname@example.org> Subject: Re: USB fuzzing with syzbot Date: Wed, 24 Apr 2019 18:09:12 +0200 Message-ID: <CAAeHK+yqq--nd0Aic36zHwjNXQjT=hg50VyoV2Y=oVh2Eb6_2Q@mail.gmail.com> (raw) In-Reply-To: <Pine.LNX.4.44L0.email@example.com> On Fri, Apr 19, 2019 at 4:39 PM Alan Stern <firstname.lastname@example.org> wrote: > > On Fri, 19 Apr 2019, Greg Kroah-Hartman wrote: > > > > 3. Regarding that GadgetFS-like interface. > > > > > > Initially I was using GadgetFS (together with the Dummy HCD/UDC > > > module) to perform emulation of USB devices for fuzzing, but later > > > switched to a custom written interface. This interface is essentially > > > implemented in the following patch . An example that emulates a USB > > > keyboard through this interface can be found here . And the > > > syzkaller parts responsible for USB fuzzing are here , . The > > > incentive to implement a different interface was to provide a somewhat > > > raw and direct access to the USB Gadget layer for the userspace, where > > > every USB request is passed to the userspace to get a response. > > > > > > The main differences between this interface (referred to as usb-fuzzer > > > for now) and GadgetFS are: > > > > > > 1) GadgetFS does some sanity checks on the provided USB descriptors, > > > which is something we don't want for fuzzing. We want the descriptors > > > to be as corrupted as they can. > > > > > > 2) GadgetFS handles some of the USB requests internally based on the > > > provided device descriptor, which is also something we don't want. For > > > example we may want to be able to provide differently corrupted > > > responses to the same request. > > > > > > 3) usb-fuzzer has ioctl-based interface instead of a filesystem-based > > > one. I wouldn't say it's that big of a deal, but it makes it somewhat > > > easier to incorporate into a fuzzer. > > > > > > 4) Somewhat related to the previous point: usb-fuzzer uses predictable > > > endpoint names across different UDCs. > > > > > > Right now each UDC driver defines endpoint names via EP_INFO() as it > > > pleases. And GadgetFS uses those names to create file entries for each > > > of the endpoints. As a result, endpoint names for different UDCs will > > > be different and it requires more work to write a portable userspace > > > gadget. The usb-fuzzer interface auto selects and assigns an endpoint > > > based on the required features like the transfer type. > > > > > > 5) GadgetFS binds to the first available UDC, usb-fuzzer provides a > > > way to select a UDC to bind to. > > > > > > Since the fuzzing happens in multiple processes each of which has its > > > own Dummy UDC assigned, we want to have control over which UDC we bind > > > to. This part is a bit confusing, but what I found out is that a UDC > > > is selected based on two different identifying names. I call the first > > > one "udc_device_name" and the second one "udc_driver_name". > > > "udc_device_name" has to be assigned to usb_gadget_driver->udc_name > > > when usb_gadget_probe_driver() is called, and "udc_driver_name" is > > > what we have to compare usb_gadget->name with inside of the > > > usb_gadget_driver->bind() callback. For example, Dummy UDC has > > > "dummy_udc" as its "udc_driver_name" and "dummy_udc.N" as its > > > "udc_device_name". At the same time the dwc2 driver that is used on > > > Raspberry Pi Zero, has "20980000.usb" as both "udc_driver_name" and > > > "udc_device_name". > > > > > > Overall, the usb-fuzzer interface implementation has a similar > > > structure to that of GadgetFS, but looks way simpler (although that > > > might be because I've missed to implement some functionality :). > > > > > > We'd like to get this upstreamed, but I'm not sure whether this should > > > be a separate interface (which we can rebrand as a raw usb gadget > > > interface or something like that) or we should try to make it a > > > special mode of GadgetFS. I like the former approach more, as GadgetFS > > > looks quite complicated from my point of view and making fundamental > > > changes to it doesn't seem like an easy task. This is where we'd like > > > to get your input. > > > > I'll leave the gadgetfs questions to others that know that api better > > than I do :) > > Assuming the usb-fuzzer implementation gets merged, I think it > definitely should be kept separate from gadgetfs. The differences in > functionality are too great; it doesn't make sense to combine them in > a single driver. > > Also, while it often is reasonable for people to build gadgetfs for > production use, usb-fuzzer is very much more of a developer/debugger > type of thing. OK, I'll clean up the patches and send them as an RFC. Thanks!
next prev parent reply index Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-04-17 16:33 Andrey Konovalov 2019-04-19 8:35 ` Greg Kroah-Hartman 2019-04-19 14:39 ` Alan Stern 2019-04-24 16:09 ` Andrey Konovalov [this message] 2019-04-24 16:05 ` Andrey Konovalov 2019-04-25 12:44 ` Andrey Konovalov 2019-04-25 14:25 ` Greg Kroah-Hartman 2019-05-14 12:43 ` Andrey Konovalov 2019-08-13 13:06 ` Andrey Konovalov
Reply instructions: You may reply publically to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to='CAAeHK+yqq--nd0Aic36zHwjNXQjT=hg50VyoV2Y=oVh2Eb6_2Q@mail.gmail.com' \ --email@example.com \ --firstname.lastname@example.org \ --email@example.com \ --firstname.lastname@example.org \ --email@example.com \ --firstname.lastname@example.org \ --email@example.com \ --firstname.lastname@example.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Linux-USB Archive on lore.kernel.org Archives are clonable: git clone --mirror https://lore.kernel.org/linux-usb/0 linux-usb/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 linux-usb linux-usb/ https://lore.kernel.org/linux-usb \ email@example.com firstname.lastname@example.org public-inbox-index linux-usb Newsgroup available over NNTP: nntp://nntp.lore.kernel.org/org.kernel.vger.linux-usb AGPL code for this site: git clone https://public-inbox.org/ public-inbox