KASAN: stack-out-of-bounds Read in string

77 views
Skip to first unread message

syzbot

unread,
Apr 12, 2019, 7:46:13 AM4/12/19
to andre...@google.com, gre...@linuxfoundation.org, linux-...@vger.kernel.org, linu...@vger.kernel.org, raf...@kernel.org, syzkall...@googlegroups.com
Hello,

syzbot found the following crash on:

HEAD commit: 9a33b369 usb-fuzzer: main usb gadget fuzzer driver
git tree: https://github.com/google/kasan/tree/usb-fuzzer
console output: https://syzkaller.appspot.com/x/log.txt?x=116f9cd3200000
kernel config: https://syzkaller.appspot.com/x/.config?x=23e37f59d94ddd15
dashboard link: https://syzkaller.appspot.com/bug?extid=b75b85111c10b8d680f1
compiler: gcc (GCC) 9.0.0 20181231 (experimental)
syz repro: https://syzkaller.appspot.com/x/repro.syz?x=161ebce3200000
C reproducer: https://syzkaller.appspot.com/x/repro.c?x=16fd974b200000

IMPORTANT: if you fix the bug, please add the following tag to the commit:
Reported-by: syzbot+b75b85...@syzkaller.appspotmail.com

usb 1-1: config 0 has no interface number 0
usb 1-1: New USB device found, idVendor=0424, idProduct=012c,
bcdDevice=1a.78
usb 1-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
usb 1-1: config 0 descriptor??
==================================================================
BUG: KASAN: stack-out-of-bounds in string+0x1f6/0x220 lib/vsprintf.c:606
Read of size 1 at addr ffff88809ee2f260 by task kworker/0:2/539

CPU: 0 PID: 539 Comm: kworker/0:2 Not tainted 5.1.0-rc4-319354-g9a33b36 #3
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS
Google 01/01/2011
Workqueue: usb_hub_wq hub_event
Call Trace:
__dump_stack lib/dump_stack.c:77 [inline]
dump_stack+0xe8/0x16e lib/dump_stack.c:113
print_address_description+0x6c/0x236 mm/kasan/report.c:187
kasan_report.cold+0x1a/0x3c mm/kasan/report.c:317
string+0x1f6/0x220 lib/vsprintf.c:606
vsnprintf+0xa14/0x16b0 lib/vsprintf.c:2396
pointer+0x60b/0x910 lib/vsprintf.c:2038
vsnprintf+0x5a0/0x16b0 lib/vsprintf.c:2400
vscnprintf+0x29/0x80 lib/vsprintf.c:2499
vprintk_store+0x45/0x4a0 kernel/printk/printk.c:1900
vprintk_emit+0x210/0x5a0 kernel/printk/printk.c:1957
dev_vprintk_emit+0x50e/0x553 drivers/base/core.c:3185
dev_printk_emit+0xbf/0xf6 drivers/base/core.c:3196
__dev_printk+0x1ed/0x215 drivers/base/core.c:3208
_dev_info+0xdc/0x10e drivers/base/core.c:3254
vub300_probe+0x25e/0xd80 drivers/mmc/host/vub300.c:2109
usb_probe_interface+0x31d/0x820 drivers/usb/core/driver.c:361
really_probe+0x2da/0xb10 drivers/base/dd.c:509
driver_probe_device+0x21d/0x350 drivers/base/dd.c:671
__device_attach_driver+0x1d8/0x290 drivers/base/dd.c:778
bus_for_each_drv+0x163/0x1e0 drivers/base/bus.c:454
__device_attach+0x223/0x3a0 drivers/base/dd.c:844
bus_probe_device+0x1f1/0x2a0 drivers/base/bus.c:514
device_add+0xad2/0x16e0 drivers/base/core.c:2106
usb_set_configuration+0xdf7/0x1740 drivers/usb/core/message.c:2021
generic_probe+0xa2/0xda drivers/usb/core/generic.c:210
usb_probe_device+0xc0/0x150 drivers/usb/core/driver.c:266
really_probe+0x2da/0xb10 drivers/base/dd.c:509
driver_probe_device+0x21d/0x350 drivers/base/dd.c:671
__device_attach_driver+0x1d8/0x290 drivers/base/dd.c:778
bus_for_each_drv+0x163/0x1e0 drivers/base/bus.c:454
__device_attach+0x223/0x3a0 drivers/base/dd.c:844
bus_probe_device+0x1f1/0x2a0 drivers/base/bus.c:514
device_add+0xad2/0x16e0 drivers/base/core.c:2106
usb_new_device.cold+0x537/0xccf drivers/usb/core/hub.c:2534
hub_port_connect drivers/usb/core/hub.c:5089 [inline]
hub_port_connect_change drivers/usb/core/hub.c:5204 [inline]
port_event drivers/usb/core/hub.c:5350 [inline]
hub_event+0x138e/0x3b00 drivers/usb/core/hub.c:5432
process_one_work+0x90f/0x1580 kernel/workqueue.c:2269
worker_thread+0x9b/0xe20 kernel/workqueue.c:2415
kthread+0x313/0x420 kernel/kthread.c:253
ret_from_fork+0x3a/0x50 arch/x86/entry/entry_64.S:352

The buggy address belongs to the page:
page:ffffea00027b8bc0 count:0 mapcount:0 mapping:0000000000000000 index:0x0
flags: 0xfff00000000000()
raw: 00fff00000000000 ffffea00027b8bc8 ffffea00027b8bc8 0000000000000000
raw: 0000000000000000 0000000000000000 00000000ffffffff 0000000000000000
page dumped because: kasan: bad access detected

Memory state around the buggy address:
ffff88809ee2f100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
ffff88809ee2f180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
> ffff88809ee2f200: 00 00 f1 f1 f1 f1 f1 f1 00 00 00 00 f2 f2 f2 f2
^
ffff88809ee2f280: 00 00 00 00 f2 f2 f2 f2 00 00 00 00 00 00 f3 f3
ffff88809ee2f300: f3 f3 00 00 00 00 00 00 00 00 00 00 00 00 00 00
==================================================================


---
This bug is generated by a bot. It may contain errors.
See https://goo.gl/tpsmEJ for more information about syzbot.
syzbot engineers can be reached at syzk...@googlegroups.com.

syzbot will keep track of this bug report. See:
https://goo.gl/tpsmEJ#status for how to communicate with syzbot.
syzbot can test patches for this bug, for details see:
https://goo.gl/tpsmEJ#testing-patches

Alan Stern

unread,
Apr 12, 2019, 4:33:16 PM4/12/19
to syzbot, syzkall...@googlegroups.com
#syz test: https://github.com/google/kasan/tree/usb-fuzzer 9a33b369


Index: usb-devel/drivers/usb/core/message.c
===================================================================
--- usb-devel.orig/drivers/usb/core/message.c
+++ usb-devel/drivers/usb/core/message.c
@@ -820,9 +820,11 @@ int usb_string(struct usb_device *dev, i

if (dev->state == USB_STATE_SUSPENDED)
return -EHOSTUNREACH;
- if (size <= 0 || !buf || !index)
+ if (size <= 0 || !buf)
return -EINVAL;
buf[0] = 0;
+ if (index <= 0 || index >= 256)
+ return -EINVAL;
tbuf = kmalloc(256, GFP_NOIO);
if (!tbuf)
return -ENOMEM;

syzbot

unread,
Apr 13, 2019, 5:23:01 AM4/13/19
to st...@rowland.harvard.edu, syzkall...@googlegroups.com
Hello,

syzbot tried to test the proposed patch but build/boot failed:

failed to checkout kernel repo
https://github.com/google/kasan/tree/usb-fuzzer on commit 9a33b369: failed
to run ["git" "fetch" "--tags" "19fc69f02c557d9fdf4b108a6d444593e67b8503"]:
exit status 128
fatal: repository 'https://github.com/google/kasan/tree/usb-fuzzer/' not
found



Tested on:

commit: [unknown
git tree: https://github.com/google/kasan/tree/usb-fuzzer 9a33b369

Dmitry Vyukov

unread,
Apr 13, 2019, 5:33:49 AM4/13/19
to syzbot, Alan Stern, syzkaller-bugs, Andrey Konovalov
The git repo is https://github.com/google/kasan.git, let's try this:

#syz test: https://github.com/google/kasan.git usb-fuzzer

Is there a canonical way to point to a git repository and a branch
within that repository?
The https://github.com/google/kasan/tree/usb-fuzzer mentioned in the
report, just a github URL.
patch

syzbot

unread,
Apr 13, 2019, 6:10:01 AM4/13/19
to andre...@google.com, dvy...@google.com, st...@rowland.harvard.edu, syzkall...@googlegroups.com
Hello,

syzbot has tested the proposed patch but the reproducer still triggered
crash:
KASAN: stack-out-of-bounds Read in string

usb 2-1: config 0 has an invalid descriptor of length 0, skipping remainder
of the config
usb 2-1: config 0 has no interface number 0
usb 2-1: New USB device found, idVendor=0424, idProduct=012c,
bcdDevice=1a.78
usb 2-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
==================================================================
BUG: KASAN: stack-out-of-bounds in string+0x1f6/0x220 lib/vsprintf.c:606
Read of size 1 at addr ffff8880a8637260 by task kworker/1:1/21

CPU: 1 PID: 21 Comm: kworker/1:1 Not tainted 5.1.0-rc4-g9a33b36 #1
page:ffffea0002a18dc0 count:0 mapcount:0 mapping:0000000000000000 index:0x0
flags: 0xfff00000000000()
raw: 00fff00000000000 ffffea0002a18dc8 ffffea0002a18dc8 0000000000000000
raw: 0000000000000000 0000000000000000 00000000ffffffff 0000000000000000
page dumped because: kasan: bad access detected

Memory state around the buggy address:
ffff8880a8637100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
ffff8880a8637180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
> ffff8880a8637200: 00 00 f1 f1 f1 f1 f1 f1 00 00 00 00 f2 f2 f2 f2
^
ffff8880a8637280: 00 00 00 00 f2 f2 f2 f2 00 00 00 00 00 00 f3 f3
ffff8880a8637300: f3 f3 00 00 00 00 00 00 00 00 00 00 00 00 00 00
==================================================================


Tested on:

commit: 9a33b369 usb-fuzzer: main usb gadget fuzzer driver
git tree: https://github.com/google/kasan/tree/usb-fuzzer
console output: https://syzkaller.appspot.com/x/log.txt?x=11fe2ab7200000
kernel config: https://syzkaller.appspot.com/x/.config?x=23e37f59d94ddd15

Dmitry Vyukov

unread,
Apr 13, 2019, 10:32:15 AM4/13/19
to syzbot, Andrey Konovalov, Alan Stern, syzkaller-bugs
I think I see what happens with your patches. We currently look for
"--- a/" or "--- /dev/null":
https://github.com/google/syzkaller/blob/master/pkg/email/patch.go#L19

But your patch is the first to contain "--- usb-devel.orig/" :)
How do you do this? And what does this mean?
patch

Dmitry Vyukov

unread,
Apr 13, 2019, 10:34:44 AM4/13/19
to syzbot, Andrey Konovalov, Alan Stern, syzkaller-bugs
I've attached "--- usb-devel.orig/" again.
Let's try again:
patch

syzbot

unread,
Apr 13, 2019, 11:04:01 AM4/13/19
to andre...@google.com, dvy...@google.com, st...@rowland.harvard.edu, syzkall...@googlegroups.com
Hello,

syzbot has tested the proposed patch but the reproducer still triggered
crash:
KASAN: stack-out-of-bounds Read in string

usb 2-1: config 0 has no interface number 0
usb 2-1: New USB device found, idVendor=0424, idProduct=012c,
bcdDevice=1a.78
usb 2-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
usb 2-1: config 0 descriptor??
==================================================================
BUG: KASAN: stack-out-of-bounds in string+0x1f6/0x220 lib/vsprintf.c:606
Read of size 1 at addr ffff88809f017260 by task kworker/0:2/533

CPU: 0 PID: 533 Comm: kworker/0:2 Not tainted 5.1.0-rc4-g9a33b36 #1
page:ffffea00027c05c0 count:0 mapcount:0 mapping:0000000000000000 index:0x0
flags: 0xfff00000000000()
raw: 00fff00000000000 ffffea00027c05c8 ffffea00027c05c8 0000000000000000
raw: 0000000000000000 0000000000000000 00000000ffffffff 0000000000000000
page dumped because: kasan: bad access detected

Memory state around the buggy address:
ffff88809f017100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
ffff88809f017180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
> ffff88809f017200: 00 00 f1 f1 f1 f1 f1 f1 00 00 00 00 f2 f2 f2 f2
^
ffff88809f017280: 00 00 00 00 f2 f2 f2 f2 00 00 00 00 00 00 f3 f3
ffff88809f017300: f3 f3 00 00 00 00 00 00 00 00 00 00 00 00 00 00
==================================================================


Tested on:

commit: 9a33b369 usb-fuzzer: main usb gadget fuzzer driver
git tree: https://github.com/google/kasan/tree/usb-fuzzer
console output: https://syzkaller.appspot.com/x/log.txt?x=157cead3200000

Alan Stern

unread,
Apr 13, 2019, 11:18:40 AM4/13/19
to Dmitry Vyukov, Andrey Konovalov, syzkaller-bugs
Heh. I use quilt to keep track of my development patches, not git.
Quilt produces those header lines using the actual parent directory
name (and the name with ".orig" appended) instead of artificial names
"a" and "b". It doesn't mean anything at all.

I suppose the best thing to look for would be "--- " followed by any
non-whitespace characters.

Alan

Alan Stern

unread,
Apr 13, 2019, 11:29:11 AM4/13/19
to Dmitry Vyukov, syzkaller-bugs, Andrey Konovalov
On Sat, 13 Apr 2019, Dmitry Vyukov wrote:

I just copied the repository name and commit ID given in the original
bug report ("git tree:" and "HEAD commit" lines). Shouldn't they
always contain the actual names that were used during the trial?

Alan

Alan Stern

unread,
Apr 13, 2019, 11:36:10 AM4/13/19
to syzbot, andre...@google.com, dvy...@google.com, syzkall...@googlegroups.com
I'm pretty sure that patch should have fixed the problem. Just to
check, let's try it again but with a little debugging info added.

Alan
patch.patch

syzbot

unread,
Apr 13, 2019, 11:42:01 AM4/13/19
to andre...@google.com, dvy...@google.com, st...@rowland.harvard.edu, syzkall...@googlegroups.com
Hello,

syzbot has tested the proposed patch and the reproducer did not trigger
crash:

Reported-and-tested-by:
syzbot+b75b85...@syzkaller.appspotmail.com

Tested on:

commit: 9a33b369 usb-fuzzer: main usb gadget fuzzer driver
git tree: https://github.com/google/kasan/tree/usb-fuzzer
kernel config: https://syzkaller.appspot.com/x/.config?x=23e37f59d94ddd15
compiler: gcc (GCC) 9.0.0 20181231 (experimental)
patch: https://syzkaller.appspot.com/x/patch.diff?x=127a1f4b200000

Note: testing is done by a robot and is best-effort only.

syzbot

unread,
Apr 13, 2019, 12:18:01 PM4/13/19
to andre...@google.com, dvy...@google.com, st...@rowland.harvard.edu, syzkall...@googlegroups.com
Hello,

syzbot has tested the proposed patch and the reproducer did not trigger
crash:

Reported-and-tested-by:
syzbot+b75b85...@syzkaller.appspotmail.com

Tested on:

commit: 9a33b369 usb-fuzzer: main usb gadget fuzzer driver
git tree: https://github.com/google/kasan/tree/usb-fuzzer
kernel config: https://syzkaller.appspot.com/x/.config?x=23e37f59d94ddd15
compiler: gcc (GCC) 9.0.0 20181231 (experimental)
patch: https://syzkaller.appspot.com/x/patch.diff?x=179903ed200000

Andrey Konovalov

unread,
Apr 15, 2019, 10:49:13 AM4/15/19
to Alan Stern, Dmitry Vyukov, Andrey Konovalov, syzkaller-bugs
Hi Alan,

I've sent a pull request to syzkaller that adds support to this patch format:

https://github.com/google/syzkaller/pull/1128

I'll you know when it's merged. For now only the traditional git
diff/format-patch format is supported.

Thanks!

>
> Alan
>

Andrey Konovalov

unread,
Apr 15, 2019, 11:04:01 AM4/15/19
to Alan Stern, Dmitry Vyukov, syzkaller-bugs, Andrey Konovalov
Right now "git tree:" contains the name of the tree that is used for
testing. So instead of providing the full path the upstream linux
repo, it just says "upstream". For the tree with custom USB fuzzing
patches using just "usb-fuzzer" would be confusing, so the idea was to
use the link the the repo. Although it might be just more confusing.
So the right address to specify to "syz test" is
"https://github.com/google/kasan.git usb-fuzzer" as mentioned in the
doc [1].

Maybe we should use "https://github.com/google/kasan.git usb-fuzzer"
in the "git tree:"? Dmitry, what do you think?

[1] https://github.com/google/syzkaller/blob/master/docs/syzbot.md

Alan Stern

unread,
Apr 15, 2019, 11:21:56 AM4/15/19
to Andrey Konovalov, Dmitry Vyukov, syzkaller-bugs
It certainly would be less ambiguous to use the actual path instead of
some random name. This could be very important to a third party who
wants to verify the result of the test.

Alan

Andrey Konovalov

unread,
Apr 30, 2019, 10:13:37 AM4/30/19
to Alan Stern, Dmitry Vyukov, syzkaller-bugs
syzbot usb bug reports should be marked as
"https://github.com/google/kasan.git usb-fuzzer" from now on. Thanks!
Reply all
Reply to author
Forward
0 new messages