All of lore.kernel.org
 help / color / mirror / Atom feed
* [syzbot] WARNING in usbnet_start_xmit/usb_submit_urb
@ 2021-11-15  7:28 syzbot
  2021-11-15 14:31 ` Oliver Neukum
                   ` (4 more replies)
  0 siblings, 5 replies; 21+ messages in thread
From: syzbot @ 2021-11-15  7:28 UTC (permalink / raw)
  To: davem, kuba, linux-kernel, linux-usb, netdev, oneukum, syzkaller-bugs

Hello,

syzbot found the following issue on:

HEAD commit:    048ff8629e11 Merge tag 'usb-5.16-rc1' of git://git.kernel...
git tree:       https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-testing
console output: https://syzkaller.appspot.com/x/log.txt?x=1480ade1b00000
kernel config:  https://syzkaller.appspot.com/x/.config?x=d6b387bc5d3e50f3
dashboard link: https://syzkaller.appspot.com/bug?extid=63ee658b9a100ffadbe2
compiler:       gcc (Debian 10.2.1-6) 10.2.1 20210110, GNU ld (GNU Binutils for Debian) 2.35.2
syz repro:      https://syzkaller.appspot.com/x/repro.syz?x=1313cb7cb00000
C reproducer:   https://syzkaller.appspot.com/x/repro.c?x=16a2f676b00000

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

------------[ cut here ]------------
usb 5-1: BOGUS urb xfer, pipe 3 != type 1
WARNING: CPU: 0 PID: 1291 at drivers/usb/core/urb.c:502 usb_submit_urb+0xed2/0x18a0 drivers/usb/core/urb.c:502
Modules linked in:
CPU: 0 PID: 1291 Comm: kworker/0:3 Not tainted 5.15.0-syzkaller #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
Workqueue: mld mld_ifc_work
RIP: 0010:usb_submit_urb+0xed2/0x18a0 drivers/usb/core/urb.c:502
Code: 7c 24 18 e8 40 2b aa fd 48 8b 7c 24 18 e8 c6 23 1a ff 41 89 d8 44 89 e1 4c 89 ea 48 89 c6 48 c7 c7 40 c0 85 86 e8 e5 66 03 02 <0f> 0b e9 58 f8 ff ff e8 12 2b aa fd 48 81 c5 80 06 00 00 e9 84 f7
RSP: 0018:ffffc90000f0f580 EFLAGS: 00010086
RAX: 0000000000000000 RBX: 0000000000000001 RCX: 0000000000000000
RDX: ffff888108599c00 RSI: ffffffff812bae18 RDI: fffff520001e1ea2
RBP: ffff88810b887b00 R08: 0000000000000000 R09: 0000000000000001
R10: ffffffff812b4bfe R11: 0000000000000000 R12: 0000000000000003
R13: ffff8881067d9dc0 R14: 0000000000000003 R15: ffff88810d2dd700
FS:  0000000000000000(0000) GS:ffff8881f6800000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 00007f3815d25ff8 CR3: 000000010bdba000 CR4: 00000000003506f0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
Call Trace:
 <TASK>
 usbnet_start_xmit+0x5ed/0x1f70 drivers/net/usb/usbnet.c:1460
 __netdev_start_xmit include/linux/netdevice.h:4987 [inline]
 netdev_start_xmit include/linux/netdevice.h:5001 [inline]
 xmit_one net/core/dev.c:3590 [inline]
 dev_hard_start_xmit+0x1eb/0x920 net/core/dev.c:3606
 sch_direct_xmit+0x25b/0x790 net/sched/sch_generic.c:342
 __dev_xmit_skb net/core/dev.c:3817 [inline]
 __dev_queue_xmit+0x11bf/0x31d0 net/core/dev.c:4194
 neigh_resolve_output net/core/neighbour.c:1523 [inline]
 neigh_resolve_output+0x50e/0x820 net/core/neighbour.c:1503
 neigh_output include/net/neighbour.h:527 [inline]
 ip6_finish_output2+0xb49/0x1af0 net/ipv6/ip6_output.c:126
 __ip6_finish_output.part.0+0x387/0xbb0 net/ipv6/ip6_output.c:191
 __ip6_finish_output include/linux/skbuff.h:986 [inline]
 ip6_finish_output net/ipv6/ip6_output.c:201 [inline]
 NF_HOOK_COND include/linux/netfilter.h:296 [inline]
 ip6_output+0x3d2/0x810 net/ipv6/ip6_output.c:224
 dst_output include/net/dst.h:450 [inline]
 NF_HOOK include/linux/netfilter.h:307 [inline]
 NF_HOOK include/linux/netfilter.h:301 [inline]
 mld_sendpack+0x96d/0xe00 net/ipv6/mcast.c:1826
 mld_send_cr net/ipv6/mcast.c:2127 [inline]
 mld_ifc_work+0x71c/0xdc0 net/ipv6/mcast.c:2659
 process_one_work+0x9b2/0x1690 kernel/workqueue.c:2298
 worker_thread+0x658/0x11f0 kernel/workqueue.c:2445
 kthread+0x40b/0x500 kernel/kthread.c:327
 ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:295
 </TASK>


---
This report 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 syzkaller@googlegroups.com.

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

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [syzbot] WARNING in usbnet_start_xmit/usb_submit_urb
  2021-11-15  7:28 [syzbot] WARNING in usbnet_start_xmit/usb_submit_urb syzbot
@ 2021-11-15 14:31 ` Oliver Neukum
  2021-12-04 10:18   ` Dmitry Vyukov
  2021-11-18 17:20 ` Oliver Neukum
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 21+ messages in thread
From: Oliver Neukum @ 2021-11-15 14:31 UTC (permalink / raw)
  To: syzbot, davem, kuba, linux-kernel, linux-usb, netdev, oneukum,
	syzkaller-bugs


On 15.11.21 08:28, syzbot wrote:
> Hello,
>
> syzbot found the following issue on:
>
> HEAD commit:    048ff8629e11 Merge tag 'usb-5.16-rc1' of git://git.kernel...
> git tree:       https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-testing
> console output: https://syzkaller.appspot.com/x/log.txt?x=1480ade1b00000
> kernel config:  https://syzkaller.appspot.com/x/.config?x=d6b387bc5d3e50f3
> dashboard link: https://syzkaller.appspot.com/bug?extid=63ee658b9a100ffadbe2
> compiler:       gcc (Debian 10.2.1-6) 10.2.1 20210110, GNU ld (GNU Binutils for Debian) 2.35.2
> syz repro:      https://syzkaller.appspot.com/x/repro.syz?x=1313cb7cb00000
> C reproducer:   https://syzkaller.appspot.com/x/repro.c?x=16a2f676b00000
>
> IMPORTANT: if you fix the issue, please add the following tag to the commit:
> Reported-by: syzbot+63ee658b9a100ffadbe2@syzkaller.appspotmail.com
>
> ------------[ cut here ]------------
> usb 5-1: BOGUS urb xfer, pipe 3 != type 1
> WARNING: CPU: 0 PID: 1291 at drivers/usb/core/urb.c:502 usb_submit_urb+0xed2/0x18a0 drivers/usb/core/urb.c:502

Hi,

here I understand what is happening, but not why it can happen. Usbnet
checks the endpoint type.

May I request an addition to syzbot? Could you include the output of
"lsusb -v" at the time
of the error condition for USB bugs?

    Regards
        Oliver


^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [syzbot] WARNING in usbnet_start_xmit/usb_submit_urb
  2021-11-15  7:28 [syzbot] WARNING in usbnet_start_xmit/usb_submit_urb syzbot
  2021-11-15 14:31 ` Oliver Neukum
@ 2021-11-18 17:20 ` Oliver Neukum
  2021-11-18 17:34   ` syzbot
  2021-11-25 13:37 ` Oliver Neukum
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 21+ messages in thread
From: Oliver Neukum @ 2021-11-18 17:20 UTC (permalink / raw)
  To: syzbot, kuba, linux-usb, syzkaller-bugs

[-- Attachment #1: Type: text/plain, Size: 980 bytes --]


On 15.11.21 08:28, syzbot wrote:
> Hello,
>
> syzbot found the following issue on:
>
> HEAD commit:    048ff8629e11 Merge tag 'usb-5.16-rc1' of git://git.kernel...
> git tree:       https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-testing
> console output: https://syzkaller.appspot.com/x/log.txt?x=1480ade1b00000
> kernel config:  https://syzkaller.appspot.com/x/.config?x=d6b387bc5d3e50f3
> dashboard link: https://syzkaller.appspot.com/bug?extid=63ee658b9a100ffadbe2
> compiler:       gcc (Debian 10.2.1-6) 10.2.1 20210110, GNU ld (GNU Binutils for Debian) 2.35.2
> syz repro:      https://syzkaller.appspot.com/x/repro.syz?x=1313cb7cb00000
> C reproducer:   https://syzkaller.appspot.com/x/repro.c?x=16a2f676b00000
>
> IMPORTANT: if you fix the issue, please add the following tag to the commit:
> Reported-by: syzbot+63ee658b9a100ffadbe2@syzkaller.appspotmail.com
>

#syz test https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git  048ff8629e11



[-- Attachment #2: 0001-usbnet-sanity-check-for-endpoint-types.patch --]
[-- Type: text/x-patch, Size: 1179 bytes --]

From 2f7c84e39b74ae581bf7d01dbc69d820d09da20a Mon Sep 17 00:00:00 2001
From: Oliver Neukum <oneukum@suse.com>
Date: Thu, 18 Nov 2021 18:15:03 +0100
Subject: [PATCH] usbnet: sanity check for endpoint types

A malicious device can pretend to be a device with a known
configuration of endpoints yet present endpoints of the wrong type.

Signed-off-by: Oliver Neukum <oneukum@suse.com>
---
 drivers/net/usb/usbnet.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
index 9a6450f796dc..aaa897e6ba29 100644
--- a/drivers/net/usb/usbnet.c
+++ b/drivers/net/usb/usbnet.c
@@ -1772,6 +1772,11 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
 	} else if (!info->in || !info->out)
 		status = usbnet_get_endpoints (dev, udev);
 	else {
+		/*sanity checks */
+		if (!usb_endpoint_is_bulk_in(&udev->cur_altsetting->endpoint[info->in].desc))
+			goto out3;
+		if (!usb_endpoint_is_bulk_out(&udev->cur_altsetting->endpoint[info->out].desc))
+			goto out3;
 		dev->in = usb_rcvbulkpipe (xdev, info->in);
 		dev->out = usb_sndbulkpipe (xdev, info->out);
 		if (!(info->flags & FLAG_NO_SETINT))
-- 
2.26.2


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* Re: [syzbot] WARNING in usbnet_start_xmit/usb_submit_urb
  2021-11-18 17:20 ` Oliver Neukum
@ 2021-11-18 17:34   ` syzbot
  0 siblings, 0 replies; 21+ messages in thread
From: syzbot @ 2021-11-18 17:34 UTC (permalink / raw)
  To: kuba, linux-usb, oneukum, syzkaller-bugs

Hello,

syzbot has tested the proposed patch but the reproducer is still triggering an issue:
KASAN: slab-out-of-bounds Read in usbnet_probe

usb 4-1: config 0 interface 0 altsetting 0 endpoint 0x2 has an invalid bInterval 87, changing to 10
usb 4-1: New USB device found, idVendor=0547, idProduct=2727, bcdDevice=e6.98
usb 4-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
usb 4-1: config 0 descriptor??
==================================================================
BUG: KASAN: slab-out-of-bounds in usb_endpoint_xfer_bulk include/uapi/linux/usb/ch9.h:518 [inline]
BUG: KASAN: slab-out-of-bounds in usb_endpoint_is_bulk_in include/uapi/linux/usb/ch9.h:573 [inline]
BUG: KASAN: slab-out-of-bounds in usbnet_probe+0x1b6e/0x2760 drivers/net/usb/usbnet.c:1776
Read of size 1 at addr ffff88811ac09623 by task kworker/1:2/668

CPU: 1 PID: 668 Comm: kworker/1:2 Not tainted 5.15.0-syzkaller #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
Workqueue: usb_hub_wq hub_event
Call Trace:
 <TASK>
 __dump_stack lib/dump_stack.c:88 [inline]
 dump_stack_lvl+0xcd/0x134 lib/dump_stack.c:106
 print_address_description.constprop.0.cold+0x6c/0x309 mm/kasan/report.c:256
 __kasan_report mm/kasan/report.c:442 [inline]
 kasan_report.cold+0x83/0xdf mm/kasan/report.c:459
 usb_endpoint_xfer_bulk include/uapi/linux/usb/ch9.h:518 [inline]
 usb_endpoint_is_bulk_in include/uapi/linux/usb/ch9.h:573 [inline]
 usbnet_probe+0x1b6e/0x2760 drivers/net/usb/usbnet.c:1776
 usb_probe_interface+0x315/0x7f0 drivers/usb/core/driver.c:396
 call_driver_probe drivers/base/dd.c:517 [inline]
 really_probe+0x245/0xcc0 drivers/base/dd.c:596
 __driver_probe_device+0x338/0x4d0 drivers/base/dd.c:751
 driver_probe_device+0x4c/0x1a0 drivers/base/dd.c:781
 __device_attach_driver+0x20b/0x2f0 drivers/base/dd.c:898
 bus_for_each_drv+0x15f/0x1e0 drivers/base/bus.c:427
 __device_attach+0x228/0x4a0 drivers/base/dd.c:969
 bus_probe_device+0x1e4/0x290 drivers/base/bus.c:487
 device_add+0xc17/0x1ee0 drivers/base/core.c:3396
 usb_set_configuration+0x113f/0x1910 drivers/usb/core/message.c:2170
 usb_generic_driver_probe+0xba/0x100 drivers/usb/core/generic.c:238
 usb_probe_device+0xd9/0x2c0 drivers/usb/core/driver.c:293
 call_driver_probe drivers/base/dd.c:517 [inline]
 really_probe+0x245/0xcc0 drivers/base/dd.c:596
 __driver_probe_device+0x338/0x4d0 drivers/base/dd.c:751
 driver_probe_device+0x4c/0x1a0 drivers/base/dd.c:781
 __device_attach_driver+0x20b/0x2f0 drivers/base/dd.c:898
 bus_for_each_drv+0x15f/0x1e0 drivers/base/bus.c:427
 __device_attach+0x228/0x4a0 drivers/base/dd.c:969
 bus_probe_device+0x1e4/0x290 drivers/base/bus.c:487
 device_add+0xc17/0x1ee0 drivers/base/core.c:3396
 usb_new_device.cold+0x63f/0x108e drivers/usb/core/hub.c:2563
 hub_port_connect drivers/usb/core/hub.c:5348 [inline]
 hub_port_connect_change drivers/usb/core/hub.c:5488 [inline]
 port_event drivers/usb/core/hub.c:5634 [inline]
 hub_event+0x2357/0x4330 drivers/usb/core/hub.c:5716
 process_one_work+0x9b2/0x1690 kernel/workqueue.c:2298
 worker_thread+0x658/0x11f0 kernel/workqueue.c:2445
 kthread+0x40b/0x500 kernel/kthread.c:327
 ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:295
 </TASK>

Allocated by task 0:
(stack is not available)

The buggy address belongs to the object at ffff88811ac09600
 which belongs to the cache kmalloc-96 of size 96
The buggy address is located 35 bytes inside of
 96-byte region [ffff88811ac09600, ffff88811ac09660)
The buggy address belongs to the page:
page:ffffea00046b0240 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x11ac09
flags: 0x200000000000200(slab|node=0|zone=2)
raw: 0200000000000200 0000000000000000 dead000000000122 ffff888100041780
raw: 0000000000000000 0000000080200020 00000001ffffffff 0000000000000000
page dumped because: kasan: bad access detected
page_owner tracks the page as allocated
page last allocated via order 0, migratetype Unmovable, gfp_mask 0x112c40(GFP_NOFS|__GFP_NOWARN|__GFP_NORETRY|__GFP_HARDWALL), pid 1873, ts 80842457098, free_ts 80530458047
 prep_new_page mm/page_alloc.c:2426 [inline]
 get_page_from_freelist+0x1254/0x2980 mm/page_alloc.c:4155
 __alloc_pages+0x1b2/0x500 mm/page_alloc.c:5381
 alloc_pages+0x1a7/0x300 mm/mempolicy.c:2191
 alloc_slab_page mm/slub.c:1770 [inline]
 allocate_slab mm/slub.c:1907 [inline]
 new_slab+0x319/0x490 mm/slub.c:1970
 ___slab_alloc+0x8b9/0xfa0 mm/slub.c:3001
 __slab_alloc.constprop.0+0x4d/0xa0 mm/slub.c:3088
 slab_alloc_node mm/slub.c:3179 [inline]
 slab_alloc mm/slub.c:3221 [inline]
 __kmalloc+0x2ee/0x310 mm/slub.c:4396
 kmalloc_array include/linux/slab.h:631 [inline]
 kcalloc include/linux/slab.h:660 [inline]
 ext4_find_extent+0xa47/0xd00 fs/ext4/extents.c:865
 ext4_ext_map_blocks+0x1e2/0x6140 fs/ext4/extents.c:4066
 ext4_map_blocks+0x653/0x17d0 fs/ext4/inode.c:637
 ext4_convert_unwritten_extents+0x2db/0x5b0 fs/ext4/extents.c:4773
 ext4_convert_unwritten_io_end_vec+0x122/0x270 fs/ext4/extents.c:4812
 ext4_end_io_end fs/ext4/page-io.c:184 [inline]
 ext4_do_flush_completed_IO fs/ext4/page-io.c:257 [inline]
 ext4_end_io_rsv_work+0x2b3/0x660 fs/ext4/page-io.c:271
 process_one_work+0x9b2/0x1690 kernel/workqueue.c:2298
 worker_thread+0x658/0x11f0 kernel/workqueue.c:2445
 kthread+0x40b/0x500 kernel/kthread.c:327
page last free stack trace:
 reset_page_owner include/linux/page_owner.h:24 [inline]
 free_pages_prepare mm/page_alloc.c:1340 [inline]
 free_pcp_prepare+0x315/0x710 mm/page_alloc.c:1391
 free_unref_page_prepare mm/page_alloc.c:3317 [inline]
 free_unref_page+0x19/0x580 mm/page_alloc.c:3396
 tlb_batch_list_free mm/mmu_gather.c:61 [inline]
 tlb_finish_mmu+0x24f/0x8c0 mm/mmu_gather.c:343
 unmap_region+0x27f/0x350 mm/mmap.c:2653
 __do_munmap+0x600/0x1260 mm/mmap.c:2884
 __do_sys_brk+0x4b2/0x7d0 mm/mmap.c:255
 do_syscall_x64 arch/x86/entry/common.c:50 [inline]
 do_syscall_64+0x35/0xb0 arch/x86/entry/common.c:80
 entry_SYSCALL_64_after_hwframe+0x44/0xae

Memory state around the buggy address:
 ffff88811ac09500: fa fb fb fb fb fb fb fb fb fb fb fb fc fc fc fc
 ffff88811ac09580: 00 00 00 00 00 00 00 00 00 00 fc fc fc fc fc fc
>ffff88811ac09600: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
                               ^
 ffff88811ac09680: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
 ffff88811ac09700: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
==================================================================


Tested on:

commit:         048ff862 Merge tag 'usb-5.16-rc1' of git://git.kernel...
git tree:       https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git
console output: https://syzkaller.appspot.com/x/log.txt?x=11fb14f6b00000
kernel config:  https://syzkaller.appspot.com/x/.config?x=d6b387bc5d3e50f3
dashboard link: https://syzkaller.appspot.com/bug?extid=63ee658b9a100ffadbe2
compiler:       gcc (Debian 10.2.1-6) 10.2.1 20210110, GNU ld (GNU Binutils for Debian) 2.35.2
patch:          https://syzkaller.appspot.com/x/patch.diff?x=103818a1b00000


^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [syzbot] WARNING in usbnet_start_xmit/usb_submit_urb
  2021-11-15  7:28 [syzbot] WARNING in usbnet_start_xmit/usb_submit_urb syzbot
  2021-11-15 14:31 ` Oliver Neukum
  2021-11-18 17:20 ` Oliver Neukum
@ 2021-11-25 13:37 ` Oliver Neukum
  2021-11-25 13:48   ` syzbot
  2021-11-25 17:39     ` kernel test robot
  2021-12-09 12:03 ` [syzbot] WARNING in usbnet_start_xmit/usb_submit_urb Oliver Neukum
  2023-06-23 13:32 ` [syzbot] [usb?] " syzbot
  4 siblings, 2 replies; 21+ messages in thread
From: Oliver Neukum @ 2021-11-25 13:37 UTC (permalink / raw)
  To: syzbot, kuba, linux-usb, syzkaller-bugs

[-- Attachment #1: Type: text/plain, Size: 981 bytes --]


On 15.11.21 08:28, syzbot wrote:
> Hello,
>
> syzbot found the following issue on:
>
> HEAD commit:    048ff8629e11 Merge tag 'usb-5.16-rc1' of git://git.kernel...
> git tree:       https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-testing
> console output: https://syzkaller.appspot.com/x/log.txt?x=1480ade1b00000
> kernel config:  https://syzkaller.appspot.com/x/.config?x=d6b387bc5d3e50f3
> dashboard link: https://syzkaller.appspot.com/bug?extid=63ee658b9a100ffadbe2
> compiler:       gcc (Debian 10.2.1-6) 10.2.1 20210110, GNU ld (GNU Binutils for Debian) 2.35.2
> syz repro:      https://syzkaller.appspot.com/x/repro.syz?x=1313cb7cb00000
> C reproducer:   https://syzkaller.appspot.com/x/repro.c?x=16a2f676b00000
>
> IMPORTANT: if you fix the issue, please add the following tag to the commit:
> Reported-by: syzbot+63ee658b9a100ffadbe2@syzkaller.appspotmail.com
>

#syz test https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git
048ff8629e11





[-- Attachment #2: 0001-usbnet-sanity-check-for-endpoint-types.patch --]
[-- Type: text/x-patch, Size: 1790 bytes --]

From 3b37ae884eb41dd5db62946a5c289f86b46195bc Mon Sep 17 00:00:00 2001
From: Oliver Neukum <oneukum@suse.com>
Date: Thu, 18 Nov 2021 18:15:03 +0100
Subject: [PATCH] usbnet: sanity check for endpoint types

A malicious device can pretend to be a device with a known
configuration of endpoints yet present endpoints of the wrong type.

Signed-off-by: Oliver Neukum <oneukum@suse.com>
---
 drivers/net/usb/usbnet.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
index 9a6450f796dc..9aa4dc00f64b 100644
--- a/drivers/net/usb/usbnet.c
+++ b/drivers/net/usb/usbnet.c
@@ -91,6 +91,26 @@ static const char * const usbnet_event_names[] = {
 	[EVENT_NO_IP_ALIGN]	   = "EVENT_NO_IP_ALIGN",
 };
 
+bool usbnet_validate_endpoints(struct usbnet *dev, struct usb_interface *intf, const struct driver_info *info)
+{
+	struct usb_host_interface *alt = intf->cur_altsetting;
+	struct usb_host_endpoint *e;
+
+	e = alt->endpoint + info->in;
+	if (!e)
+		return false;
+	if (!usb_endpoint_is_bulk_in(&e->desc))
+		return false;
+
+	e = alt->endpoint + info->out;
+	if (!e)
+		return false;
+	if (!usb_endpoint_is_bulk_out(&e->desc))
+		return false;
+
+	return true;
+}
+
 /* handles CDC Ethernet and many other network "bulk data" interfaces */
 int usbnet_get_endpoints(struct usbnet *dev, struct usb_interface *intf)
 {
@@ -1772,6 +1792,8 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
 	} else if (!info->in || !info->out)
 		status = usbnet_get_endpoints (dev, udev);
 	else {
+		if (!usbnet_validate_endpoints(dev, udev, info))
+			goto out3;
 		dev->in = usb_rcvbulkpipe (xdev, info->in);
 		dev->out = usb_sndbulkpipe (xdev, info->out);
 		if (!(info->flags & FLAG_NO_SETINT))
-- 
2.26.2


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* Re: [syzbot] WARNING in usbnet_start_xmit/usb_submit_urb
  2021-11-25 13:37 ` Oliver Neukum
@ 2021-11-25 13:48   ` syzbot
  2021-11-25 17:39     ` kernel test robot
  1 sibling, 0 replies; 21+ messages in thread
From: syzbot @ 2021-11-25 13:48 UTC (permalink / raw)
  To: kuba, linux-usb, oneukum, syzkaller-bugs

Hello,

syzbot has tested the proposed patch but the reproducer is still triggering an issue:
KASAN: slab-out-of-bounds Read in usbnet_validate_endpoints

usb 6-1: config 0 interface 0 altsetting 0 endpoint 0x2 has an invalid bInterval 87, changing to 10
usb 6-1: New USB device found, idVendor=0547, idProduct=2727, bcdDevice=e6.98
usb 6-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
usb 6-1: config 0 descriptor??
==================================================================
BUG: KASAN: slab-out-of-bounds in usb_endpoint_xfer_bulk include/uapi/linux/usb/ch9.h:518 [inline]
BUG: KASAN: slab-out-of-bounds in usb_endpoint_is_bulk_in include/uapi/linux/usb/ch9.h:573 [inline]
BUG: KASAN: slab-out-of-bounds in usbnet_validate_endpoints+0x22a/0x260 drivers/net/usb/usbnet.c:102
Read of size 1 at addr ffff88810ded4223 by task kworker/0:0/5

CPU: 0 PID: 5 Comm: kworker/0:0 Not tainted 5.15.0-syzkaller #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
Workqueue: usb_hub_wq hub_event
Call Trace:
 <TASK>
 __dump_stack lib/dump_stack.c:88 [inline]
 dump_stack_lvl+0xcd/0x134 lib/dump_stack.c:106
 print_address_description.constprop.0.cold+0x6c/0x309 mm/kasan/report.c:256
 __kasan_report mm/kasan/report.c:442 [inline]
 kasan_report.cold+0x83/0xdf mm/kasan/report.c:459
 usb_endpoint_xfer_bulk include/uapi/linux/usb/ch9.h:518 [inline]
 usb_endpoint_is_bulk_in include/uapi/linux/usb/ch9.h:573 [inline]
 usbnet_validate_endpoints+0x22a/0x260 drivers/net/usb/usbnet.c:102
 usbnet_probe+0x1ab9/0x2620 drivers/net/usb/usbnet.c:1795
 usb_probe_interface+0x315/0x7f0 drivers/usb/core/driver.c:396
 call_driver_probe drivers/base/dd.c:517 [inline]
 really_probe+0x245/0xcc0 drivers/base/dd.c:596
 __driver_probe_device+0x338/0x4d0 drivers/base/dd.c:751
 driver_probe_device+0x4c/0x1a0 drivers/base/dd.c:781
 __device_attach_driver+0x20b/0x2f0 drivers/base/dd.c:898
 bus_for_each_drv+0x15f/0x1e0 drivers/base/bus.c:427
 __device_attach+0x228/0x4a0 drivers/base/dd.c:969
 bus_probe_device+0x1e4/0x290 drivers/base/bus.c:487
 device_add+0xc17/0x1ee0 drivers/base/core.c:3396
 usb_set_configuration+0x113f/0x1910 drivers/usb/core/message.c:2170
 usb_generic_driver_probe+0xba/0x100 drivers/usb/core/generic.c:238
 usb_probe_device+0xd9/0x2c0 drivers/usb/core/driver.c:293
 call_driver_probe drivers/base/dd.c:517 [inline]
 really_probe+0x245/0xcc0 drivers/base/dd.c:596
 __driver_probe_device+0x338/0x4d0 drivers/base/dd.c:751
 driver_probe_device+0x4c/0x1a0 drivers/base/dd.c:781
 __device_attach_driver+0x20b/0x2f0 drivers/base/dd.c:898
 bus_for_each_drv+0x15f/0x1e0 drivers/base/bus.c:427
 __device_attach+0x228/0x4a0 drivers/base/dd.c:969
 bus_probe_device+0x1e4/0x290 drivers/base/bus.c:487
 device_add+0xc17/0x1ee0 drivers/base/core.c:3396
 usb_new_device.cold+0x63f/0x108e drivers/usb/core/hub.c:2563
 hub_port_connect drivers/usb/core/hub.c:5348 [inline]
 hub_port_connect_change drivers/usb/core/hub.c:5488 [inline]
 port_event drivers/usb/core/hub.c:5634 [inline]
 hub_event+0x2357/0x4330 drivers/usb/core/hub.c:5716
 process_one_work+0x9b2/0x1690 kernel/workqueue.c:2298
 worker_thread+0x658/0x11f0 kernel/workqueue.c:2445
 kthread+0x40b/0x500 kernel/kthread.c:327
 ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:295
 </TASK>

Allocated by task 0:
(stack is not available)

The buggy address belongs to the object at ffff88810ded4200
 which belongs to the cache kmalloc-96 of size 96
The buggy address is located 35 bytes inside of
 96-byte region [ffff88810ded4200, ffff88810ded4260)
The buggy address belongs to the page:
page:ffffea000437b500 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x10ded4
flags: 0x200000000000200(slab|node=0|zone=2)
raw: 0200000000000200 0000000000000000 dead000000000122 ffff888100041780
raw: 0000000000000000 0000000080200020 00000001ffffffff 0000000000000000
page dumped because: kasan: bad access detected
page_owner tracks the page as allocated
page last allocated via order 0, migratetype Unmovable, gfp_mask 0x112c40(GFP_NOFS|__GFP_NOWARN|__GFP_NORETRY|__GFP_HARDWALL), pid 4546, ts 85619489521, free_ts 59365205543
 prep_new_page mm/page_alloc.c:2426 [inline]
 get_page_from_freelist+0x1254/0x2980 mm/page_alloc.c:4155
 __alloc_pages+0x1b2/0x500 mm/page_alloc.c:5381
 alloc_pages+0x1a7/0x300 mm/mempolicy.c:2191
 alloc_slab_page mm/slub.c:1770 [inline]
 allocate_slab mm/slub.c:1907 [inline]
 new_slab+0x319/0x490 mm/slub.c:1970
 ___slab_alloc+0x8b9/0xfa0 mm/slub.c:3001
 __slab_alloc.constprop.0+0x4d/0xa0 mm/slub.c:3088
 slab_alloc_node mm/slub.c:3179 [inline]
 slab_alloc mm/slub.c:3221 [inline]
 __kmalloc+0x2ee/0x310 mm/slub.c:4396
 kmalloc include/linux/slab.h:596 [inline]
 kzalloc include/linux/slab.h:721 [inline]
 tomoyo_encode2.part.0+0xe9/0x3a0 security/tomoyo/realpath.c:45
 tomoyo_encode2 security/tomoyo/realpath.c:31 [inline]
 tomoyo_encode+0x28/0x50 security/tomoyo/realpath.c:80
 tomoyo_realpath_from_path+0x186/0x620 security/tomoyo/realpath.c:288
 tomoyo_get_realpath security/tomoyo/file.c:151 [inline]
 tomoyo_path_perm+0x21b/0x400 security/tomoyo/file.c:822
 security_inode_getattr+0xcf/0x140 security/security.c:1334
 vfs_getattr fs/stat.c:157 [inline]
 vfs_statx+0x164/0x390 fs/stat.c:225
 vfs_fstatat fs/stat.c:243 [inline]
 __do_sys_newfstatat+0x96/0x120 fs/stat.c:412
 do_syscall_x64 arch/x86/entry/common.c:50 [inline]
 do_syscall_64+0x35/0xb0 arch/x86/entry/common.c:80
 entry_SYSCALL_64_after_hwframe+0x44/0xae
page last free stack trace:
 reset_page_owner include/linux/page_owner.h:24 [inline]
 free_pages_prepare mm/page_alloc.c:1340 [inline]
 free_pcp_prepare+0x315/0x710 mm/page_alloc.c:1391
 free_unref_page_prepare mm/page_alloc.c:3317 [inline]
 free_unref_page+0x19/0x580 mm/page_alloc.c:3396
 qlink_free mm/kasan/quarantine.c:146 [inline]
 qlist_free_all+0x5a/0xc0 mm/kasan/quarantine.c:165
 kasan_quarantine_reduce+0x180/0x200 mm/kasan/quarantine.c:272
 __kasan_slab_alloc+0x73/0x80 mm/kasan/common.c:444
 kasan_slab_alloc include/linux/kasan.h:259 [inline]
 slab_post_alloc_hook mm/slab.h:519 [inline]
 slab_alloc_node mm/slub.c:3213 [inline]
 slab_alloc mm/slub.c:3221 [inline]
 __kmalloc+0x1d9/0x310 mm/slub.c:4396
 kmalloc include/linux/slab.h:596 [inline]
 tomoyo_realpath_from_path+0xc3/0x620 security/tomoyo/realpath.c:254
 tomoyo_get_realpath security/tomoyo/file.c:151 [inline]
 tomoyo_path_perm+0x21b/0x400 security/tomoyo/file.c:822
 security_inode_getattr+0xcf/0x140 security/security.c:1334
 vfs_getattr fs/stat.c:157 [inline]
 vfs_statx+0x164/0x390 fs/stat.c:225
 vfs_fstatat fs/stat.c:243 [inline]
 __do_sys_newfstatat+0x96/0x120 fs/stat.c:412
 do_syscall_x64 arch/x86/entry/common.c:50 [inline]
 do_syscall_64+0x35/0xb0 arch/x86/entry/common.c:80
 entry_SYSCALL_64_after_hwframe+0x44/0xae

Memory state around the buggy address:
 ffff88810ded4100: 00 00 00 00 00 00 00 00 00 00 00 00 fc fc fc fc
 ffff88810ded4180: 00 00 00 00 00 00 00 00 00 00 fc fc fc fc fc fc
>ffff88810ded4200: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
                               ^
 ffff88810ded4280: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
 ffff88810ded4300: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
==================================================================


Tested on:

commit:         048ff862 Merge tag 'usb-5.16-rc1' of git://git.kernel...
git tree:       https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git
console output: https://syzkaller.appspot.com/x/log.txt?x=16cf5845b00000
kernel config:  https://syzkaller.appspot.com/x/.config?x=d6b387bc5d3e50f3
dashboard link: https://syzkaller.appspot.com/bug?extid=63ee658b9a100ffadbe2
compiler:       gcc (Debian 10.2.1-6) 10.2.1 20210110, GNU ld (GNU Binutils for Debian) 2.35.2
patch:          https://syzkaller.appspot.com/x/patch.diff?x=14984c09b00000


^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] usbnet: sanity check for endpoint types
  2021-11-25 13:37 ` Oliver Neukum
@ 2021-11-25 17:39     ` kernel test robot
  2021-11-25 17:39     ` kernel test robot
  1 sibling, 0 replies; 21+ messages in thread
From: kernel test robot @ 2021-11-25 17:39 UTC (permalink / raw)
  To: Oliver Neukum, syzbot, kuba, linux-usb, syzkaller-bugs; +Cc: kbuild-all

Hi Oliver,

I love your patch! Perhaps something to improve:

[auto build test WARNING on linus/master]
[also build test WARNING on v5.16-rc2 next-20211125]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Oliver-Neukum/usbnet-sanity-check-for-endpoint-types/20211125-214053
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 5f53fa508db098c9d372423a6dac31c8a5679cdf
config: arc-allyesconfig (https://download.01.org/0day-ci/archive/20211126/202111260112.7MrCT7S6-lkp@intel.com/config)
compiler: arceb-elf-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/66c033857b47c1dceaaa6d9daacaabc12ab8ee09
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Oliver-Neukum/usbnet-sanity-check-for-endpoint-types/20211125-214053
        git checkout 66c033857b47c1dceaaa6d9daacaabc12ab8ee09
        # save the config file to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross ARCH=arc 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

>> drivers/net/usb/usbnet.c:94:6: warning: no previous prototype for 'usbnet_validate_endpoints' [-Wmissing-prototypes]
      94 | bool usbnet_validate_endpoints(struct usbnet *dev, struct usb_interface *intf, const struct driver_info *info)
         |      ^~~~~~~~~~~~~~~~~~~~~~~~~


vim +/usbnet_validate_endpoints +94 drivers/net/usb/usbnet.c

    93	
  > 94	bool usbnet_validate_endpoints(struct usbnet *dev, struct usb_interface *intf, const struct driver_info *info)
    95	{
    96		struct usb_host_interface *alt = intf->cur_altsetting;
    97		struct usb_host_endpoint *e;
    98	
    99		e = alt->endpoint + info->in;
   100		if (!e)
   101			return false;
   102		if (!usb_endpoint_is_bulk_in(&e->desc))
   103			return false;
   104	
   105		e = alt->endpoint + info->out;
   106		if (!e)
   107			return false;
   108		if (!usb_endpoint_is_bulk_out(&e->desc))
   109			return false;
   110	
   111		return true;
   112	}
   113	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] usbnet: sanity check for endpoint types
@ 2021-11-25 17:39     ` kernel test robot
  0 siblings, 0 replies; 21+ messages in thread
From: kernel test robot @ 2021-11-25 17:39 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 2644 bytes --]

Hi Oliver,

I love your patch! Perhaps something to improve:

[auto build test WARNING on linus/master]
[also build test WARNING on v5.16-rc2 next-20211125]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Oliver-Neukum/usbnet-sanity-check-for-endpoint-types/20211125-214053
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 5f53fa508db098c9d372423a6dac31c8a5679cdf
config: arc-allyesconfig (https://download.01.org/0day-ci/archive/20211126/202111260112.7MrCT7S6-lkp(a)intel.com/config)
compiler: arceb-elf-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/66c033857b47c1dceaaa6d9daacaabc12ab8ee09
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Oliver-Neukum/usbnet-sanity-check-for-endpoint-types/20211125-214053
        git checkout 66c033857b47c1dceaaa6d9daacaabc12ab8ee09
        # save the config file to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross ARCH=arc 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

>> drivers/net/usb/usbnet.c:94:6: warning: no previous prototype for 'usbnet_validate_endpoints' [-Wmissing-prototypes]
      94 | bool usbnet_validate_endpoints(struct usbnet *dev, struct usb_interface *intf, const struct driver_info *info)
         |      ^~~~~~~~~~~~~~~~~~~~~~~~~


vim +/usbnet_validate_endpoints +94 drivers/net/usb/usbnet.c

    93	
  > 94	bool usbnet_validate_endpoints(struct usbnet *dev, struct usb_interface *intf, const struct driver_info *info)
    95	{
    96		struct usb_host_interface *alt = intf->cur_altsetting;
    97		struct usb_host_endpoint *e;
    98	
    99		e = alt->endpoint + info->in;
   100		if (!e)
   101			return false;
   102		if (!usb_endpoint_is_bulk_in(&e->desc))
   103			return false;
   104	
   105		e = alt->endpoint + info->out;
   106		if (!e)
   107			return false;
   108		if (!usb_endpoint_is_bulk_out(&e->desc))
   109			return false;
   110	
   111		return true;
   112	}
   113	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [syzbot] WARNING in usbnet_start_xmit/usb_submit_urb
  2021-11-15 14:31 ` Oliver Neukum
@ 2021-12-04 10:18   ` Dmitry Vyukov
  0 siblings, 0 replies; 21+ messages in thread
From: Dmitry Vyukov @ 2021-12-04 10:18 UTC (permalink / raw)
  To: Oliver Neukum
  Cc: syzbot, davem, kuba, linux-kernel, linux-usb, netdev,
	syzkaller-bugs, Aleksandr Nogikh, Andrey Konovalov

On Mon, 15 Nov 2021 at 15:31, 'Oliver Neukum' via syzkaller-bugs
<syzkaller-bugs@googlegroups.com> wrote:
>
>
> On 15.11.21 08:28, syzbot wrote:
> > Hello,
> >
> > syzbot found the following issue on:
> >
> > HEAD commit:    048ff8629e11 Merge tag 'usb-5.16-rc1' of git://git.kernel...
> > git tree:       https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-testing
> > console output: https://syzkaller.appspot.com/x/log.txt?x=1480ade1b00000
> > kernel config:  https://syzkaller.appspot.com/x/.config?x=d6b387bc5d3e50f3
> > dashboard link: https://syzkaller.appspot.com/bug?extid=63ee658b9a100ffadbe2
> > compiler:       gcc (Debian 10.2.1-6) 10.2.1 20210110, GNU ld (GNU Binutils for Debian) 2.35.2
> > syz repro:      https://syzkaller.appspot.com/x/repro.syz?x=1313cb7cb00000
> > C reproducer:   https://syzkaller.appspot.com/x/repro.c?x=16a2f676b00000
> >
> > IMPORTANT: if you fix the issue, please add the following tag to the commit:
> > Reported-by: syzbot+63ee658b9a100ffadbe2@syzkaller.appspotmail.com
> >
> > ------------[ cut here ]------------
> > usb 5-1: BOGUS urb xfer, pipe 3 != type 1
> > WARNING: CPU: 0 PID: 1291 at drivers/usb/core/urb.c:502 usb_submit_urb+0xed2/0x18a0 drivers/usb/core/urb.c:502
>
> Hi,
>
> here I understand what is happening, but not why it can happen. Usbnet
> checks the endpoint type.
>
> May I request an addition to syzbot? Could you include the output of
> "lsusb -v" at the time
> of the error condition for USB bugs?

Hi Oliver,

Aleksandr filed https://github.com/google/syzkaller/issues/2889 for
this request.
But so far we did not find a good solution. syzbot collects some info
about the machine after boot, but that's obviously wrong moment. After
the bug it's also too late -- the kernel is dead/corrupted. It's also
unclear what exactly is "usb bug".
It may be easier to do from the kernel by hooking into panic. Would
also benefit all other kernel testing as this is not really
syzbot-specific, so better belongs to kernel. Is it possible to do it
from the kernel? If not, maybe the kernel could at least log
connect/disconnect events to the console.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [syzbot] WARNING in usbnet_start_xmit/usb_submit_urb
  2021-11-15  7:28 [syzbot] WARNING in usbnet_start_xmit/usb_submit_urb syzbot
                   ` (2 preceding siblings ...)
  2021-11-25 13:37 ` Oliver Neukum
@ 2021-12-09 12:03 ` Oliver Neukum
  2021-12-09 12:26   ` syzbot
  2023-06-23 13:32 ` [syzbot] [usb?] " syzbot
  4 siblings, 1 reply; 21+ messages in thread
From: Oliver Neukum @ 2021-12-09 12:03 UTC (permalink / raw)
  To: syzbot, kuba, linux-usb, syzkaller-bugs

[-- Attachment #1: Type: text/plain, Size: 983 bytes --]


On 15.11.21 08:28, syzbot wrote:
> Hello,
>
> syzbot found the following issue on:
>
> HEAD commit:    048ff8629e11 Merge tag 'usb-5.16-rc1' of git://git.kernel...
> git tree:       https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-testing
> console output: https://syzkaller.appspot.com/x/log.txt?x=1480ade1b00000
> kernel config:  https://syzkaller.appspot.com/x/.config?x=d6b387bc5d3e50f3
> dashboard link: https://syzkaller.appspot.com/bug?extid=63ee658b9a100ffadbe2
> compiler:       gcc (Debian 10.2.1-6) 10.2.1 20210110, GNU ld (GNU Binutils for Debian) 2.35.2
> syz repro:      https://syzkaller.appspot.com/x/repro.syz?x=1313cb7cb00000
> C reproducer:   https://syzkaller.appspot.com/x/repro.c?x=16a2f676b00000
>
> IMPORTANT: if you fix the issue, please add the following tag to the commit:
> Reported-by: syzbot+63ee658b9a100ffadbe2@syzkaller.appspotmail.com
>

#syz test https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git
048ff8629e11







[-- Attachment #2: 0001-usbnet-sanity-check-for-endpoint-types.patch --]
[-- Type: text/x-patch, Size: 1967 bytes --]

From 853e421630f82fb3b7005ad0b294c091a064ac39 Mon Sep 17 00:00:00 2001
From: Oliver Neukum <oneukum@suse.com>
Date: Thu, 18 Nov 2021 18:15:03 +0100
Subject: [PATCH] usbnet: sanity check for endpoint types

A malicious device can pretend to be a device with a known
configuration of endpoints yet present endpoints of the wrong type
or too few or none at all.

Signed-off-by: Oliver Neukum <oneukum@suse.com>
---
 drivers/net/usb/usbnet.c | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
index 9a6450f796dc..b1f93810a6f3 100644
--- a/drivers/net/usb/usbnet.c
+++ b/drivers/net/usb/usbnet.c
@@ -91,6 +91,31 @@ static const char * const usbnet_event_names[] = {
 	[EVENT_NO_IP_ALIGN]	   = "EVENT_NO_IP_ALIGN",
 };
 
+bool usbnet_validate_endpoints(struct usbnet *dev, struct usb_interface *intf, const struct driver_info *info)
+{
+	struct usb_host_interface *alt = intf->cur_altsetting;
+	struct usb_host_endpoint *e;
+	int num_endpoints = alt->desc.bNumEndpoints;
+
+	if (info->in > num_endpoints)
+		return false;
+	e = alt->endpoint + info->in;
+	if (!e)
+		return false;
+	if (!usb_endpoint_is_bulk_in(&e->desc))
+		return false;
+
+	if (info->out > num_endpoints)
+		return false;
+	e = alt->endpoint + info->out;
+	if (!e)
+		return false;
+	if (!usb_endpoint_is_bulk_out(&e->desc))
+		return false;
+
+	return true;
+}
+
 /* handles CDC Ethernet and many other network "bulk data" interfaces */
 int usbnet_get_endpoints(struct usbnet *dev, struct usb_interface *intf)
 {
@@ -1772,6 +1797,8 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
 	} else if (!info->in || !info->out)
 		status = usbnet_get_endpoints (dev, udev);
 	else {
+		if (!usbnet_validate_endpoints(dev, udev, info))
+			goto out3;
 		dev->in = usb_rcvbulkpipe (xdev, info->in);
 		dev->out = usb_sndbulkpipe (xdev, info->out);
 		if (!(info->flags & FLAG_NO_SETINT))
-- 
2.26.2


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* Re: [syzbot] WARNING in usbnet_start_xmit/usb_submit_urb
  2021-12-09 12:03 ` [syzbot] WARNING in usbnet_start_xmit/usb_submit_urb Oliver Neukum
@ 2021-12-09 12:26   ` syzbot
  0 siblings, 0 replies; 21+ messages in thread
From: syzbot @ 2021-12-09 12:26 UTC (permalink / raw)
  To: kuba, linux-usb, oneukum, syzkaller-bugs

Hello,

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

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

Tested on:

commit:         048ff862 Merge tag 'usb-5.16-rc1' of git://git.kernel...
git tree:       https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git
kernel config:  https://syzkaller.appspot.com/x/.config?x=d6b387bc5d3e50f3
dashboard link: https://syzkaller.appspot.com/bug?extid=63ee658b9a100ffadbe2
compiler:       gcc (Debian 10.2.1-6) 10.2.1 20210110, GNU ld (GNU Binutils for Debian) 2.35.2
patch:          https://syzkaller.appspot.com/x/patch.diff?x=15103a51b00000

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

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [syzbot] [usb?] WARNING in usbnet_start_xmit/usb_submit_urb
  2021-11-15  7:28 [syzbot] WARNING in usbnet_start_xmit/usb_submit_urb syzbot
                   ` (3 preceding siblings ...)
  2021-12-09 12:03 ` [syzbot] WARNING in usbnet_start_xmit/usb_submit_urb Oliver Neukum
@ 2023-06-23 13:32 ` syzbot
  2023-06-23 15:23   ` Alan Stern
  4 siblings, 1 reply; 21+ messages in thread
From: syzbot @ 2023-06-23 13:32 UTC (permalink / raw)
  To: andreyknvl, davem, dvyukov, edumazet, gregkh, kbuild-all, kuba,
	linux-kernel, linux-usb, lkp, netdev, nogikh, oneukum, pabeni,
	stern, syzkaller-bugs, troels

syzbot has bisected this issue to:

commit 45bf39f8df7f05efb83b302c65ae3b9bc92b7065
Author: Alan Stern <stern@rowland.harvard.edu>
Date:   Tue Jan 31 20:49:04 2023 +0000

    USB: core: Don't hold device lock while reading the "descriptors" sysfs file

bisection log:  https://syzkaller.appspot.com/x/bisect.txt?x=124b5877280000
start commit:   692b7dc87ca6 Merge tag 'hyperv-fixes-signed-20230619' of g..
git tree:       upstream
final oops:     https://syzkaller.appspot.com/x/report.txt?x=114b5877280000
console output: https://syzkaller.appspot.com/x/log.txt?x=164b5877280000
kernel config:  https://syzkaller.appspot.com/x/.config?x=2cbd298d0aff1140
dashboard link: https://syzkaller.appspot.com/bug?extid=63ee658b9a100ffadbe2
syz repro:      https://syzkaller.appspot.com/x/repro.syz?x=1760094b280000
C reproducer:   https://syzkaller.appspot.com/x/repro.c?x=1359cdf3280000

Reported-by: syzbot+63ee658b9a100ffadbe2@syzkaller.appspotmail.com
Fixes: 45bf39f8df7f ("USB: core: Don't hold device lock while reading the "descriptors" sysfs file")

For information about bisection process see: https://goo.gl/tpsmEJ#bisection

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [syzbot] [usb?] WARNING in usbnet_start_xmit/usb_submit_urb
  2023-06-23 13:32 ` [syzbot] [usb?] " syzbot
@ 2023-06-23 15:23   ` Alan Stern
  2023-06-23 16:07     ` syzbot
  2023-06-23 17:16     ` Alan Stern
  0 siblings, 2 replies; 21+ messages in thread
From: Alan Stern @ 2023-06-23 15:23 UTC (permalink / raw)
  To: syzbot
  Cc: andreyknvl, davem, dvyukov, edumazet, gregkh, kbuild-all, kuba,
	linux-kernel, linux-usb, lkp, netdev, nogikh, oneukum, pabeni,
	syzkaller-bugs, troels

On Fri, Jun 23, 2023 at 06:32:22AM -0700, syzbot wrote:
> syzbot has bisected this issue to:
> 
> commit 45bf39f8df7f05efb83b302c65ae3b9bc92b7065
> Author: Alan Stern <stern@rowland.harvard.edu>
> Date:   Tue Jan 31 20:49:04 2023 +0000
> 
>     USB: core: Don't hold device lock while reading the "descriptors" sysfs file
> 
> bisection log:  https://syzkaller.appspot.com/x/bisect.txt?x=124b5877280000
> start commit:   692b7dc87ca6 Merge tag 'hyperv-fixes-signed-20230619' of g..
> git tree:       upstream
> final oops:     https://syzkaller.appspot.com/x/report.txt?x=114b5877280000
> console output: https://syzkaller.appspot.com/x/log.txt?x=164b5877280000
> kernel config:  https://syzkaller.appspot.com/x/.config?x=2cbd298d0aff1140
> dashboard link: https://syzkaller.appspot.com/bug?extid=63ee658b9a100ffadbe2
> syz repro:      https://syzkaller.appspot.com/x/repro.syz?x=1760094b280000
> C reproducer:   https://syzkaller.appspot.com/x/repro.c?x=1359cdf3280000
> 
> Reported-by: syzbot+63ee658b9a100ffadbe2@syzkaller.appspotmail.com
> Fixes: 45bf39f8df7f ("USB: core: Don't hold device lock while reading the "descriptors" sysfs file")
> 
> For information about bisection process see: https://goo.gl/tpsmEJ#bisection

The bisection result is wrong, but the issue still needs to be fixed.

Alan Stern

#syz test: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/ v6.4-rc7

Index: usb-devel/drivers/net/usb/usbnet.c
===================================================================
--- usb-devel.orig/drivers/net/usb/usbnet.c
+++ usb-devel/drivers/net/usb/usbnet.c
@@ -1775,6 +1775,9 @@ usbnet_probe (struct usb_interface *udev
 	} else if (!info->in || !info->out)
 		status = usbnet_get_endpoints (dev, udev);
 	else {
+		u8		ep_addrs[3] = {
+			info->in + USB_DIR_IN, info->out + USB_DIR_OUT, 0};
+
 		dev->in = usb_rcvbulkpipe (xdev, info->in);
 		dev->out = usb_sndbulkpipe (xdev, info->out);
 		if (!(info->flags & FLAG_NO_SETINT))
@@ -1784,6 +1787,8 @@ usbnet_probe (struct usb_interface *udev
 		else
 			status = 0;
 
+		if (status == 0 && !usb_check_bulk_endpoints(udev, ep_addrs))
+			status = -EINVAL;
 	}
 	if (status >= 0 && dev->status)
 		status = init_status (dev, udev);

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [syzbot] [usb?] WARNING in usbnet_start_xmit/usb_submit_urb
  2023-06-23 15:23   ` Alan Stern
@ 2023-06-23 16:07     ` syzbot
  2023-06-23 17:16     ` Alan Stern
  1 sibling, 0 replies; 21+ messages in thread
From: syzbot @ 2023-06-23 16:07 UTC (permalink / raw)
  To: andreyknvl, davem, dvyukov, edumazet, gregkh, kbuild-all, kuba,
	linux-kernel, linux-usb, lkp, netdev, nogikh, oneukum, pabeni,
	stern, syzkaller-bugs, troels

Hello,

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

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

Tested on:

commit:         45a3e24f Linux 6.4-rc7
git tree:       https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/ v6.4-rc7
console output: https://syzkaller.appspot.com/x/log.txt?x=1210e557280000
kernel config:  https://syzkaller.appspot.com/x/.config?x=2cbd298d0aff1140
dashboard link: https://syzkaller.appspot.com/bug?extid=63ee658b9a100ffadbe2
compiler:       gcc (Debian 10.2.1-6) 10.2.1 20210110, GNU ld (GNU Binutils for Debian) 2.35.2
patch:          https://syzkaller.appspot.com/x/patch.diff?x=14e0e557280000

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

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [syzbot] [usb?] WARNING in usbnet_start_xmit/usb_submit_urb
  2023-06-23 15:23   ` Alan Stern
  2023-06-23 16:07     ` syzbot
@ 2023-06-23 17:16     ` Alan Stern
  2023-07-11 12:42       ` Oliver Neukum
  1 sibling, 1 reply; 21+ messages in thread
From: Alan Stern @ 2023-06-23 17:16 UTC (permalink / raw)
  To: Oliver Neukum; +Cc: USB mailing list

Oliver:

I just noticed you had posted a patch to fix this same problem:
https://lore.kernel.org/linux-usb/291da1b9-9f71-0f99-45f4-a25a259c8d6d@suse.com/

Do you want to submit your patch or would you prefer that I submit the 
patch below?

Alan Stern

On Fri, Jun 23, 2023 at 11:23:53AM -0400, Alan Stern wrote:
> On Fri, Jun 23, 2023 at 06:32:22AM -0700, syzbot wrote:
> > syzbot has bisected this issue to:
> > 
> > commit 45bf39f8df7f05efb83b302c65ae3b9bc92b7065
> > Author: Alan Stern <stern@rowland.harvard.edu>
> > Date:   Tue Jan 31 20:49:04 2023 +0000
> > 
> >     USB: core: Don't hold device lock while reading the "descriptors" sysfs file
> > 
> > bisection log:  https://syzkaller.appspot.com/x/bisect.txt?x=124b5877280000
> > start commit:   692b7dc87ca6 Merge tag 'hyperv-fixes-signed-20230619' of g..
> > git tree:       upstream
> > final oops:     https://syzkaller.appspot.com/x/report.txt?x=114b5877280000
> > console output: https://syzkaller.appspot.com/x/log.txt?x=164b5877280000
> > kernel config:  https://syzkaller.appspot.com/x/.config?x=2cbd298d0aff1140
> > dashboard link: https://syzkaller.appspot.com/bug?extid=63ee658b9a100ffadbe2
> > syz repro:      https://syzkaller.appspot.com/x/repro.syz?x=1760094b280000
> > C reproducer:   https://syzkaller.appspot.com/x/repro.c?x=1359cdf3280000
> > 
> > Reported-by: syzbot+63ee658b9a100ffadbe2@syzkaller.appspotmail.com
> > Fixes: 45bf39f8df7f ("USB: core: Don't hold device lock while reading the "descriptors" sysfs file")
> > 
> > For information about bisection process see: https://goo.gl/tpsmEJ#bisection
> 
> The bisection result is wrong, but the issue still needs to be fixed.
> 
> Alan Stern
> 
> #syz test: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/ v6.4-rc7
> 
> Index: usb-devel/drivers/net/usb/usbnet.c
> ===================================================================
> --- usb-devel.orig/drivers/net/usb/usbnet.c
> +++ usb-devel/drivers/net/usb/usbnet.c
> @@ -1775,6 +1775,9 @@ usbnet_probe (struct usb_interface *udev
>  	} else if (!info->in || !info->out)
>  		status = usbnet_get_endpoints (dev, udev);
>  	else {
> +		u8		ep_addrs[3] = {
> +			info->in + USB_DIR_IN, info->out + USB_DIR_OUT, 0};
> +
>  		dev->in = usb_rcvbulkpipe (xdev, info->in);
>  		dev->out = usb_sndbulkpipe (xdev, info->out);
>  		if (!(info->flags & FLAG_NO_SETINT))
> @@ -1784,6 +1787,8 @@ usbnet_probe (struct usb_interface *udev
>  		else
>  			status = 0;
>  
> +		if (status == 0 && !usb_check_bulk_endpoints(udev, ep_addrs))
> +			status = -EINVAL;
>  	}
>  	if (status >= 0 && dev->status)
>  		status = init_status (dev, udev);

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [syzbot] [usb?] WARNING in usbnet_start_xmit/usb_submit_urb
  2023-06-23 17:16     ` Alan Stern
@ 2023-07-11 12:42       ` Oliver Neukum
  2023-07-11 17:38         ` [PATCH] net: usbnet: Fix " Alan Stern
  0 siblings, 1 reply; 21+ messages in thread
From: Oliver Neukum @ 2023-07-11 12:42 UTC (permalink / raw)
  To: Alan Stern, Oliver Neukum; +Cc: USB mailing list



On 23.06.23 19:16, Alan Stern wrote:
> Oliver:
> 
> I just noticed you had posted a patch to fix this same problem:
> https://lore.kernel.org/linux-usb/291da1b9-9f71-0f99-45f4-a25a259c8d6d@suse.com/
> 
> Do you want to submit your patch or would you prefer that I submit the
> patch below?

Hi,

yours is more elegant. Please submit.

	Regards
		Oliver


^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH] net: usbnet: Fix WARNING in usbnet_start_xmit/usb_submit_urb
  2023-07-11 12:42       ` Oliver Neukum
@ 2023-07-11 17:38         ` Alan Stern
  2023-07-11 20:12           ` Jakub Kicinski
  0 siblings, 1 reply; 21+ messages in thread
From: Alan Stern @ 2023-07-11 17:38 UTC (permalink / raw)
  To: David S. Miller; +Cc: Oliver Neukum, netdev, USB mailing list

The syzbot fuzzer identified a problem in the usbnet driver:

usb 1-1: BOGUS urb xfer, pipe 3 != type 1
WARNING: CPU: 0 PID: 754 at drivers/usb/core/urb.c:504 usb_submit_urb+0xed6/0x1880 drivers/usb/core/urb.c:504
Modules linked in:
CPU: 0 PID: 754 Comm: kworker/0:2 Not tainted 6.4.0-rc7-syzkaller-00014-g692b7dc87ca6 #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 05/27/2023
Workqueue: mld mld_ifc_work
RIP: 0010:usb_submit_urb+0xed6/0x1880 drivers/usb/core/urb.c:504
Code: 7c 24 18 e8 2c b4 5b fb 48 8b 7c 24 18 e8 42 07 f0 fe 41 89 d8 44 89 e1 4c 89 ea 48 89 c6 48 c7 c7 a0 c9 fc 8a e8 5a 6f 23 fb <0f> 0b e9 58 f8 ff ff e8 fe b3 5b fb 48 81 c5 c0 05 00 00 e9 84 f7
RSP: 0018:ffffc9000463f568 EFLAGS: 00010086
RAX: 0000000000000000 RBX: 0000000000000001 RCX: 0000000000000000
RDX: ffff88801eb28000 RSI: ffffffff814c03b7 RDI: 0000000000000001
RBP: ffff8881443b7190 R08: 0000000000000001 R09: 0000000000000000
R10: 0000000000000000 R11: 0000000000000001 R12: 0000000000000003
R13: ffff88802a77cb18 R14: 0000000000000003 R15: ffff888018262500
FS:  0000000000000000(0000) GS:ffff8880b9800000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 0000556a99c15a18 CR3: 0000000028c71000 CR4: 0000000000350ef0
Call Trace:
 <TASK>
 usbnet_start_xmit+0xfe5/0x2190 drivers/net/usb/usbnet.c:1453
 __netdev_start_xmit include/linux/netdevice.h:4918 [inline]
 netdev_start_xmit include/linux/netdevice.h:4932 [inline]
 xmit_one net/core/dev.c:3578 [inline]
 dev_hard_start_xmit+0x187/0x700 net/core/dev.c:3594
...

This bug is caused by the fact that usbnet trusts the bulk endpoint
addresses its probe routine receives in the driver_info structure, and
it does not check to see that these endpoints actually exist and have
the expected type and directions.

The fix is simply to add such a check.

Reported-and-tested-by: syzbot+63ee658b9a100ffadbe2@syzkaller.appspotmail.com
Closes: https://lore.kernel.org/linux-usb/000000000000a56e9105d0cec021@google.com/
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
CC: Oliver Neukum <oneukum@suse.com>

---

 drivers/net/usb/usbnet.c |    5 +++++
 1 file changed, 5 insertions(+)

Index: usb-devel/drivers/net/usb/usbnet.c
===================================================================
--- usb-devel.orig/drivers/net/usb/usbnet.c
+++ usb-devel/drivers/net/usb/usbnet.c
@@ -1775,6 +1775,9 @@ usbnet_probe (struct usb_interface *udev
 	} else if (!info->in || !info->out)
 		status = usbnet_get_endpoints (dev, udev);
 	else {
+		u8		ep_addrs[3] = {
+			info->in + USB_DIR_IN, info->out + USB_DIR_OUT, 0};
+
 		dev->in = usb_rcvbulkpipe (xdev, info->in);
 		dev->out = usb_sndbulkpipe (xdev, info->out);
 		if (!(info->flags & FLAG_NO_SETINT))
@@ -1784,6 +1787,8 @@ usbnet_probe (struct usb_interface *udev
 		else
 			status = 0;
 
+		if (status == 0 && !usb_check_bulk_endpoints(udev, ep_addrs))
+			status = -EINVAL;
 	}
 	if (status >= 0 && dev->status)
 		status = init_status (dev, udev);


^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] net: usbnet: Fix WARNING in usbnet_start_xmit/usb_submit_urb
  2023-07-11 17:38         ` [PATCH] net: usbnet: Fix " Alan Stern
@ 2023-07-11 20:12           ` Jakub Kicinski
  2023-07-12 14:15             ` [PATCH v2] " Alan Stern
  0 siblings, 1 reply; 21+ messages in thread
From: Jakub Kicinski @ 2023-07-11 20:12 UTC (permalink / raw)
  To: Alan Stern; +Cc: David S. Miller, Oliver Neukum, netdev, USB mailing list

On Tue, 11 Jul 2023 13:38:00 -0400 Alan Stern wrote:
> +		u8		ep_addrs[3] = {
> +			info->in + USB_DIR_IN, info->out + USB_DIR_OUT, 0};

With the two-tab indentation and the continuation line starting
half way thru.. this looks highly unusual. Can we use a more
standard kernel formatting in this case?

		u8 ep_addrs[3] = {
			info->in + USB_DIR_IN, info->out + USB_DIR_OUT, 0
		};
-- 
pw-bot: cr

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH v2] net: usbnet: Fix WARNING in usbnet_start_xmit/usb_submit_urb
  2023-07-11 20:12           ` Jakub Kicinski
@ 2023-07-12 14:15             ` Alan Stern
  2023-07-14  4:00               ` patchwork-bot+netdevbpf
  0 siblings, 1 reply; 21+ messages in thread
From: Alan Stern @ 2023-07-12 14:15 UTC (permalink / raw)
  To: David S. Miller; +Cc: Jakub Kicinski, Oliver Neukum, netdev, USB mailing list

The syzbot fuzzer identified a problem in the usbnet driver:

usb 1-1: BOGUS urb xfer, pipe 3 != type 1
WARNING: CPU: 0 PID: 754 at drivers/usb/core/urb.c:504 usb_submit_urb+0xed6/0x1880 drivers/usb/core/urb.c:504
Modules linked in:
CPU: 0 PID: 754 Comm: kworker/0:2 Not tainted 6.4.0-rc7-syzkaller-00014-g692b7dc87ca6 #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 05/27/2023
Workqueue: mld mld_ifc_work
RIP: 0010:usb_submit_urb+0xed6/0x1880 drivers/usb/core/urb.c:504
Code: 7c 24 18 e8 2c b4 5b fb 48 8b 7c 24 18 e8 42 07 f0 fe 41 89 d8 44 89 e1 4c 89 ea 48 89 c6 48 c7 c7 a0 c9 fc 8a e8 5a 6f 23 fb <0f> 0b e9 58 f8 ff ff e8 fe b3 5b fb 48 81 c5 c0 05 00 00 e9 84 f7
RSP: 0018:ffffc9000463f568 EFLAGS: 00010086
RAX: 0000000000000000 RBX: 0000000000000001 RCX: 0000000000000000
RDX: ffff88801eb28000 RSI: ffffffff814c03b7 RDI: 0000000000000001
RBP: ffff8881443b7190 R08: 0000000000000001 R09: 0000000000000000
R10: 0000000000000000 R11: 0000000000000001 R12: 0000000000000003
R13: ffff88802a77cb18 R14: 0000000000000003 R15: ffff888018262500
FS:  0000000000000000(0000) GS:ffff8880b9800000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 0000556a99c15a18 CR3: 0000000028c71000 CR4: 0000000000350ef0
Call Trace:
 <TASK>
 usbnet_start_xmit+0xfe5/0x2190 drivers/net/usb/usbnet.c:1453
 __netdev_start_xmit include/linux/netdevice.h:4918 [inline]
 netdev_start_xmit include/linux/netdevice.h:4932 [inline]
 xmit_one net/core/dev.c:3578 [inline]
 dev_hard_start_xmit+0x187/0x700 net/core/dev.c:3594
...

This bug is caused by the fact that usbnet trusts the bulk endpoint
addresses its probe routine receives in the driver_info structure, and
it does not check to see that these endpoints actually exist and have
the expected type and directions.

The fix is simply to add such a check.

Reported-and-tested-by: syzbot+63ee658b9a100ffadbe2@syzkaller.appspotmail.com
Closes: https://lore.kernel.org/linux-usb/000000000000a56e9105d0cec021@google.com/
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
CC: Oliver Neukum <oneukum@suse.com>

---

v2: Updated the formatting of the definition of ep_addrs[].


 drivers/net/usb/usbnet.c |    6 ++++++
 1 file changed, 6 insertions(+)

Index: usb-devel/drivers/net/usb/usbnet.c
===================================================================
--- usb-devel.orig/drivers/net/usb/usbnet.c
+++ usb-devel/drivers/net/usb/usbnet.c
@@ -1775,6 +1775,10 @@ usbnet_probe (struct usb_interface *udev
 	} else if (!info->in || !info->out)
 		status = usbnet_get_endpoints (dev, udev);
 	else {
+		u8 ep_addrs[3] = {
+			info->in + USB_DIR_IN, info->out + USB_DIR_OUT, 0
+		};
+
 		dev->in = usb_rcvbulkpipe (xdev, info->in);
 		dev->out = usb_sndbulkpipe (xdev, info->out);
 		if (!(info->flags & FLAG_NO_SETINT))
@@ -1784,6 +1788,8 @@ usbnet_probe (struct usb_interface *udev
 		else
 			status = 0;
 
+		if (status == 0 && !usb_check_bulk_endpoints(udev, ep_addrs))
+			status = -EINVAL;
 	}
 	if (status >= 0 && dev->status)
 		status = init_status (dev, udev);

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v2] net: usbnet: Fix WARNING in usbnet_start_xmit/usb_submit_urb
  2023-07-12 14:15             ` [PATCH v2] " Alan Stern
@ 2023-07-14  4:00               ` patchwork-bot+netdevbpf
  0 siblings, 0 replies; 21+ messages in thread
From: patchwork-bot+netdevbpf @ 2023-07-14  4:00 UTC (permalink / raw)
  To: Alan Stern; +Cc: davem, kuba, oneukum, netdev, linux-usb

Hello:

This patch was applied to netdev/net.git (main)
by Jakub Kicinski <kuba@kernel.org>:

On Wed, 12 Jul 2023 10:15:10 -0400 you wrote:
> The syzbot fuzzer identified a problem in the usbnet driver:
> 
> usb 1-1: BOGUS urb xfer, pipe 3 != type 1
> WARNING: CPU: 0 PID: 754 at drivers/usb/core/urb.c:504 usb_submit_urb+0xed6/0x1880 drivers/usb/core/urb.c:504
> Modules linked in:
> CPU: 0 PID: 754 Comm: kworker/0:2 Not tainted 6.4.0-rc7-syzkaller-00014-g692b7dc87ca6 #0
> Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 05/27/2023
> Workqueue: mld mld_ifc_work
> RIP: 0010:usb_submit_urb+0xed6/0x1880 drivers/usb/core/urb.c:504
> Code: 7c 24 18 e8 2c b4 5b fb 48 8b 7c 24 18 e8 42 07 f0 fe 41 89 d8 44 89 e1 4c 89 ea 48 89 c6 48 c7 c7 a0 c9 fc 8a e8 5a 6f 23 fb <0f> 0b e9 58 f8 ff ff e8 fe b3 5b fb 48 81 c5 c0 05 00 00 e9 84 f7
> RSP: 0018:ffffc9000463f568 EFLAGS: 00010086
> RAX: 0000000000000000 RBX: 0000000000000001 RCX: 0000000000000000
> RDX: ffff88801eb28000 RSI: ffffffff814c03b7 RDI: 0000000000000001
> RBP: ffff8881443b7190 R08: 0000000000000001 R09: 0000000000000000
> R10: 0000000000000000 R11: 0000000000000001 R12: 0000000000000003
> R13: ffff88802a77cb18 R14: 0000000000000003 R15: ffff888018262500
> FS:  0000000000000000(0000) GS:ffff8880b9800000(0000) knlGS:0000000000000000
> CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> CR2: 0000556a99c15a18 CR3: 0000000028c71000 CR4: 0000000000350ef0
> Call Trace:
>  <TASK>
>  usbnet_start_xmit+0xfe5/0x2190 drivers/net/usb/usbnet.c:1453
>  __netdev_start_xmit include/linux/netdevice.h:4918 [inline]
>  netdev_start_xmit include/linux/netdevice.h:4932 [inline]
>  xmit_one net/core/dev.c:3578 [inline]
>  dev_hard_start_xmit+0x187/0x700 net/core/dev.c:3594
> ...
> 
> [...]

Here is the summary with links:
  - [v2] net: usbnet: Fix WARNING in usbnet_start_xmit/usb_submit_urb
    https://git.kernel.org/netdev/net/c/5e1627cb43dd

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [syzbot] WARNING in usbnet_start_xmit/usb_submit_urb
       [not found] <89b4d11e-8e00-c78f-7b5a-5f77c1291088@suse.com>
@ 2021-11-18 15:24 ` syzbot
  0 siblings, 0 replies; 21+ messages in thread
From: syzbot @ 2021-11-18 15:24 UTC (permalink / raw)
  To: kuba, linux-usb, oneukum, syzkaller-bugs

Hello,

syzbot has tested the proposed patch but the reproducer is still triggering an issue:
WARNING in usbnet_start_xmit/usb_submit_urb

------------[ cut here ]------------
usb 4-1: BOGUS urb xfer, pipe 3 != type 1
WARNING: CPU: 0 PID: 710 at drivers/usb/core/urb.c:502 usb_submit_urb+0xed2/0x18a0 drivers/usb/core/urb.c:502
Modules linked in:
CPU: 0 PID: 710 Comm: kworker/0:2 Not tainted 5.15.0-syzkaller #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
Workqueue: mld mld_ifc_work
RIP: 0010:usb_submit_urb+0xed2/0x18a0 drivers/usb/core/urb.c:502
Code: 7c 24 18 e8 a0 32 aa fd 48 8b 7c 24 18 e8 26 2b 1a ff 41 89 d8 44 89 e1 4c 89 ea 48 89 c6 48 c7 c7 80 c1 85 86 e8 45 5e 03 02 <0f> 0b e9 58 f8 ff ff e8 72 32 aa fd 48 81 c5 80 06 00 00 e9 84 f7
RSP: 0018:ffffc90001da7580 EFLAGS: 00010086
RAX: 0000000000000000 RBX: 0000000000000001 RCX: 0000000000000000
RDX: ffff88810d383800 RSI: ffffffff812bae18 RDI: fffff520003b4ea2
RBP: ffff888114c89800 R08: 0000000000000000 R09: 0000000000000000
R10: ffffffff812b4bfe R11: 0000000000000000 R12: 0000000000000003
R13: ffff8881045d2370 R14: 0000000000000003 R15: ffff888122f7c600
FS:  0000000000000000(0000) GS:ffff8881f6800000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 00007f3d0eb50ff8 CR3: 0000000117af8000 CR4: 00000000003506f0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
Call Trace:
 <TASK>
 usbnet_start_xmit+0x5ed/0x1f70 drivers/net/usb/usbnet.c:1464
 __netdev_start_xmit include/linux/netdevice.h:4987 [inline]
 netdev_start_xmit include/linux/netdevice.h:5001 [inline]
 xmit_one net/core/dev.c:3590 [inline]
 dev_hard_start_xmit+0x1eb/0x920 net/core/dev.c:3606
 sch_direct_xmit+0x25b/0x790 net/sched/sch_generic.c:342
 __dev_xmit_skb net/core/dev.c:3817 [inline]
 __dev_queue_xmit+0x11bf/0x31d0 net/core/dev.c:4194
 neigh_resolve_output net/core/neighbour.c:1523 [inline]
 neigh_resolve_output+0x50e/0x820 net/core/neighbour.c:1503
 neigh_output include/net/neighbour.h:527 [inline]
 ip6_finish_output2+0xb49/0x1af0 net/ipv6/ip6_output.c:126
 __ip6_finish_output.part.0+0x387/0xbb0 net/ipv6/ip6_output.c:191
 __ip6_finish_output include/linux/skbuff.h:986 [inline]
 ip6_finish_output net/ipv6/ip6_output.c:201 [inline]
 NF_HOOK_COND include/linux/netfilter.h:296 [inline]
 ip6_output+0x3d2/0x810 net/ipv6/ip6_output.c:224
 dst_output include/net/dst.h:450 [inline]
 NF_HOOK include/linux/netfilter.h:307 [inline]
 NF_HOOK include/linux/netfilter.h:301 [inline]
 mld_sendpack+0x96d/0xe00 net/ipv6/mcast.c:1826
 mld_send_cr net/ipv6/mcast.c:2127 [inline]
 mld_ifc_work+0x71c/0xdc0 net/ipv6/mcast.c:2659
 process_one_work+0x9b2/0x1690 kernel/workqueue.c:2298
 worker_thread+0x658/0x11f0 kernel/workqueue.c:2445
 kthread+0x40b/0x500 kernel/kthread.c:327
 ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:295
 </TASK>


Tested on:

commit:         048ff862 Merge tag 'usb-5.16-rc1' of git://git.kernel...
git tree:       https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git
console output: https://syzkaller.appspot.com/x/log.txt?x=1105444eb00000
kernel config:  https://syzkaller.appspot.com/x/.config?x=d6b387bc5d3e50f3
dashboard link: https://syzkaller.appspot.com/bug?extid=63ee658b9a100ffadbe2
compiler:       gcc (Debian 10.2.1-6) 10.2.1 20210110, GNU ld (GNU Binutils for Debian) 2.35.2
patch:          https://syzkaller.appspot.com/x/patch.diff?x=1004939eb00000


^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2023-07-14  4:00 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-15  7:28 [syzbot] WARNING in usbnet_start_xmit/usb_submit_urb syzbot
2021-11-15 14:31 ` Oliver Neukum
2021-12-04 10:18   ` Dmitry Vyukov
2021-11-18 17:20 ` Oliver Neukum
2021-11-18 17:34   ` syzbot
2021-11-25 13:37 ` Oliver Neukum
2021-11-25 13:48   ` syzbot
2021-11-25 17:39   ` [PATCH] usbnet: sanity check for endpoint types kernel test robot
2021-11-25 17:39     ` kernel test robot
2021-12-09 12:03 ` [syzbot] WARNING in usbnet_start_xmit/usb_submit_urb Oliver Neukum
2021-12-09 12:26   ` syzbot
2023-06-23 13:32 ` [syzbot] [usb?] " syzbot
2023-06-23 15:23   ` Alan Stern
2023-06-23 16:07     ` syzbot
2023-06-23 17:16     ` Alan Stern
2023-07-11 12:42       ` Oliver Neukum
2023-07-11 17:38         ` [PATCH] net: usbnet: Fix " Alan Stern
2023-07-11 20:12           ` Jakub Kicinski
2023-07-12 14:15             ` [PATCH v2] " Alan Stern
2023-07-14  4:00               ` patchwork-bot+netdevbpf
     [not found] <89b4d11e-8e00-c78f-7b5a-5f77c1291088@suse.com>
2021-11-18 15:24 ` [syzbot] " syzbot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.