lkml.org 
[lkml]   [2020]   [Aug]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Date
    SubjectRe: KMSAN: kernel-infoleak in raw_ioctl
    On Mon, Aug 10, 2020 at 4:07 PM 'Andrey Konovalov' via syzkaller-bugs
    <syzkaller-bugs@googlegroups.com> wrote:
    > > > On Mon, Aug 10, 2020 at 11:15:38AM +0200, Greg KH wrote:
    > > > > On Mon, Aug 10, 2020 at 11:08:33AM +0200, Greg KH wrote:
    > > > > > On Mon, Aug 10, 2020 at 11:00:07AM +0200, Dmitry Vyukov wrote:
    > > > > > > On Mon, Aug 10, 2020 at 9:46 AM Greg KH <gregkh@linuxfoundation.org> wrote:
    > > > > > > >
    > > > > > > > On Sun, Aug 09, 2020 at 09:27:18AM -0700, syzbot wrote:
    > > > > > > > > Hello,
    > > > > > > > >
    > > > > > > > > syzbot found the following issue on:
    > > > > > > > >
    > > > > > > > > HEAD commit: ce8056d1 wip: changed copy_from_user where instrumented
    > > > > > > > > git tree: https://github.com/google/kmsan.git master
    > > > > > > > > console output: https://syzkaller.appspot.com/x/log.txt?x=141eb8b2900000
    > > > > > > > > kernel config: https://syzkaller.appspot.com/x/.config?x=3afe005fb99591f
    > > > > > > > > dashboard link: https://syzkaller.appspot.com/bug?extid=a7e220df5a81d1ab400e
    > > > > > > > > compiler: clang version 10.0.0 (https://github.com/llvm/llvm-project/ c2443155a0fb245c8f17f2c1c72b6ea391e86e81)
    > > > > > > > > userspace arch: i386
    > > > > > > > >
    > > > > > > > > Unfortunately, I don't have any reproducer for this issue yet.
    > > > > > > >
    > > > > > > > The irony of a kernel module written for syzbot testing, causing syzbot
    > > > > > > > reports....
    > > > > > >
    > > > > > > The raw gadget and KCOV are also kernel code and subject to all the
    > > > > > > same rules as any other kernel code from syzkaller point of view.
    > > > > > >
    > > > > > > But I think the root cause of this bug is the origin of the uninitialized-ness:
    > > > > > >
    > > > > > > Local variable ----buf.i@asix_get_phy_addr created at:
    > > > > > > asix_read_cmd drivers/net/usb/asix_common.c:312 [inline]
    > > > > > > asix_read_phy_addr drivers/net/usb/asix_common.c:295 [inline]
    > > > > > > asix_get_phy_addr+0x4d/0x290 drivers/net/usb/asix_common.c:314
    > > > > > > asix_read_cmd drivers/net/usb/asix_common.c:312 [inline]
    > > > > > > asix_read_phy_addr drivers/net/usb/asix_common.c:295 [inline]
    > > > > > > asix_get_phy_addr+0x4d/0x290 drivers/net/usb/asix_common.c:314
    > > > > >
    > > > > > read buffers sent to USB hardware are ment to be filled in by the
    > > > > > hardware with the data received from it, we do not zero-out those
    > > > > > buffers before passing the pointer there.
    > > > > >
    > > > > > Perhaps with testing frameworks like the raw usb controller, that might
    > > > > > cause a number of false-positives to happen?
    > > > >
    > > > > Ah, wait, that buffer is coming from the stack, which isn't allowed in
    > > > > the first place :(
    > > > >
    > > > > So that should be changed anyway to a dynamic allocation, I'll go write
    > > > > up a patch...
    > > >
    > > > Nope, my fault, the data is not coming from the stack, so all is good.
    > >
    > > My reading of the code is that asix_read_cmd returns the number of
    > > bytes actually read, which may be less than requested.
    > > This happens in __usbnet_read_cmd:
    > > https://elixir.bootlin.com/linux/latest/source/drivers/net/usb/usbnet.c#L2002
    > > So this code in asix_read_phy_addr will need produce an uninit value
    > > for result if <2 bytes read:
    > >
    > > u8 buf[2];
    > > int ret = asix_read_cmd(dev, AX_CMD_READ_PHY_ID, 0, 0, 2, buf, 0);
    > > if (ret < 0)
    > > netdev_err(dev->net, "Error reading PHYID register: %02x\n", ret);
    > > ret = buf[offset];
    > > return ret;
    > >
    > > And it looks like all of 13 uses of asix_read_cmd in
    > > drivers/net/usb/asix_common.c are subject to this bug as well.
    >
    > Yeah, such issues are unfortunately currently getting attributed to
    > raw-gadget. I wonder if we can improve crash parsing code to cover
    > this kind of cases... We would need to skip the first few
    > raw-gadget/USB-related stack traces, and only take one of the "Uninit
    > was stored to memory at" ones.

    Looking at some other reports in the past I considered if we should
    attribute uninit's to the _origin_ stack rather than all places the
    origin may end up being used. But I don't have quantitative data on if
    it will improve quality overall or not. There are definitely cases
    where it will be wrong as well -- in particular allocation of skb's in
    sendmsg.

    \
     
     \ /
      Last update: 2020-08-10 16:18    [W:6.668 / U:0.548 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site