* Re: [syzbot] [pm?] KASAN: use-after-free Read in netdev_unregister_kobject
2024-04-22 15:35 [syzbot] [pm?] KASAN: use-after-free Read in netdev_unregister_kobject syzbot
@ 2024-04-22 23:16 ` Hillf Danton
2024-04-23 3:12 ` syzbot
2024-04-23 10:42 ` Hillf Danton
` (7 subsequent siblings)
8 siblings, 1 reply; 19+ messages in thread
From: Hillf Danton @ 2024-04-22 23:16 UTC (permalink / raw)
To: syzbot; +Cc: linux-kernel, syzkaller-bugs
On Mon, 22 Apr 2024 08:35:25 -0700
> syzbot found the following issue on:
>
> HEAD commit: 3cdb45594619 Merge tag 's390-6.9-4' of git://git.kernel.or..
> git tree: upstream
> C reproducer: https://syzkaller.appspot.com/x/repro.c?x=144067cb180000
#syz test https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 3cdb45594619
--- x/net/bluetooth/bnep/core.c
+++ y/net/bluetooth/bnep/core.c
@@ -659,7 +659,7 @@ int bnep_del_connection(struct bnep_conn
if (req->flags & ~valid_flags)
return -EINVAL;
- down_read(&bnep_session_sem);
+ down_write(&bnep_session_sem);
s = __bnep_get_session(req->dst);
if (s) {
@@ -668,7 +668,7 @@ int bnep_del_connection(struct bnep_conn
} else
err = -ENOENT;
- up_read(&bnep_session_sem);
+ up_write(&bnep_session_sem);
return err;
}
--
^ permalink raw reply [flat|nested] 19+ messages in thread* Re: [syzbot] [pm?] KASAN: use-after-free Read in netdev_unregister_kobject
2024-04-22 23:16 ` Hillf Danton
@ 2024-04-23 3:12 ` syzbot
0 siblings, 0 replies; 19+ messages in thread
From: syzbot @ 2024-04-23 3:12 UTC (permalink / raw)
To: hdanton, linux-kernel, syzkaller-bugs
Hello,
syzbot has tested the proposed patch but the reproducer is still triggering an issue:
KASAN: use-after-free Read in netdev_unregister_kobject
==================================================================
BUG: KASAN: use-after-free in device_for_each_child+0xa7/0x170 drivers/base/core.c:4044
Read of size 8 at addr ffff8880293555f8 by task kbnepd bnep0/5664
CPU: 0 PID: 5664 Comm: kbnepd bnep0 Not tainted 6.9.0-rc4-syzkaller-00173-g3cdb45594619-dirty #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 03/27/2024
Call Trace:
<TASK>
__dump_stack lib/dump_stack.c:88 [inline]
dump_stack_lvl+0x241/0x360 lib/dump_stack.c:114
print_address_description mm/kasan/report.c:377 [inline]
print_report+0x169/0x550 mm/kasan/report.c:488
kasan_report+0x143/0x180 mm/kasan/report.c:601
device_for_each_child+0xa7/0x170 drivers/base/core.c:4044
pm_runtime_set_memalloc_noio+0x114/0x260 drivers/base/power/runtime.c:248
netdev_unregister_kobject+0x178/0x250 net/core/net-sysfs.c:2106
unregister_netdevice_many_notify+0x11dd/0x16e0 net/core/dev.c:11135
unregister_netdevice_many net/core/dev.c:11163 [inline]
unregister_netdevice_queue+0x303/0x370 net/core/dev.c:11042
unregister_netdevice include/linux/netdevice.h:3115 [inline]
unregister_netdev+0x1c/0x30 net/core/dev.c:11181
bnep_session+0x2e09/0x3000 net/bluetooth/bnep/core.c:525
kthread+0x2f2/0x390 kernel/kthread.c:388
ret_from_fork+0x4d/0x80 arch/x86/kernel/process.c:147
ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:244
</TASK>
The buggy address belongs to the physical page:
page: refcount:0 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x29355
flags: 0xfff80000000000(node=0|zone=1|lastcpupid=0xfff)
page_type: 0xffffffff()
raw: 00fff80000000000 ffffea0000a4d588 ffffea0000a4d508 0000000000000000
raw: 0000000000000000 0000000000000000 00000000ffffffff 0000000000000000
page dumped because: kasan: bad access detected
page_owner tracks the page as freed
page last allocated via order 2, migratetype Unmovable, gfp_mask 0x140dc0(GFP_USER|__GFP_COMP|__GFP_ZERO), pid 5470, tgid 1627921193 (syz-executor.4), ts 5470, free_ts 128431373442
set_page_owner include/linux/page_owner.h:32 [inline]
post_alloc_hook+0x1ea/0x210 mm/page_alloc.c:1534
prep_new_page mm/page_alloc.c:1541 [inline]
get_page_from_freelist+0x3410/0x35b0 mm/page_alloc.c:3317
__alloc_pages+0x256/0x6c0 mm/page_alloc.c:4575
__alloc_pages_node include/linux/gfp.h:238 [inline]
alloc_pages_node include/linux/gfp.h:261 [inline]
__kmalloc_large_node+0x91/0x1f0 mm/slub.c:3911
__do_kmalloc_node mm/slub.c:3954 [inline]
__kmalloc+0x320/0x4a0 mm/slub.c:3979
kmalloc include/linux/slab.h:632 [inline]
kzalloc include/linux/slab.h:749 [inline]
hci_alloc_dev_priv+0x27/0x2030 net/bluetooth/hci_core.c:2500
hci_alloc_dev include/net/bluetooth/hci_core.h:1672 [inline]
__vhci_create_device drivers/bluetooth/hci_vhci.c:406 [inline]
vhci_create_device+0x12e/0x720 drivers/bluetooth/hci_vhci.c:480
vhci_get_user drivers/bluetooth/hci_vhci.c:537 [inline]
vhci_write+0x3cb/0x480 drivers/bluetooth/hci_vhci.c:617
call_write_iter include/linux/fs.h:2110 [inline]
new_sync_write fs/read_write.c:497 [inline]
vfs_write+0xa86/0xcb0 fs/read_write.c:590
ksys_write+0x1a0/0x2c0 fs/read_write.c:643
do_syscall_x64 arch/x86/entry/common.c:52 [inline]
do_syscall_64+0xf5/0x240 arch/x86/entry/common.c:83
entry_SYSCALL_64_after_hwframe+0x77/0x7f
page last free pid 5470 tgid 5470 stack trace:
reset_page_owner include/linux/page_owner.h:25 [inline]
free_pages_prepare mm/page_alloc.c:1141 [inline]
free_unref_page_prepare+0x986/0xab0 mm/page_alloc.c:2347
free_unref_page+0x37/0x3f0 mm/page_alloc.c:2487
__folio_put_large+0x13f/0x190 mm/swap.c:132
__folio_put+0x299/0x390 mm/swap.c:140
folio_put include/linux/mm.h:1506 [inline]
free_large_kmalloc+0x105/0x1c0 mm/slub.c:4361
kfree+0x1ca/0x3a0 mm/slub.c:4384
hci_release_dev+0x1516/0x16a0 net/bluetooth/hci_core.c:2833
bt_host_release+0x83/0x90 net/bluetooth/hci_sysfs.c:94
device_release+0x9b/0x1c0
kobject_cleanup lib/kobject.c:689 [inline]
kobject_release lib/kobject.c:720 [inline]
kref_put include/linux/kref.h:65 [inline]
kobject_put+0x231/0x480 lib/kobject.c:737
vhci_release+0x8b/0xd0 drivers/bluetooth/hci_vhci.c:675
__fput+0x42b/0x8a0 fs/file_table.c:422
task_work_run+0x251/0x310 kernel/task_work.c:180
exit_task_work include/linux/task_work.h:38 [inline]
do_exit+0xa1b/0x27e0 kernel/exit.c:878
do_group_exit+0x207/0x2c0 kernel/exit.c:1027
__do_sys_exit_group kernel/exit.c:1038 [inline]
__se_sys_exit_group kernel/exit.c:1036 [inline]
__x64_sys_exit_group+0x3f/0x40 kernel/exit.c:1036
Memory state around the buggy address:
ffff888029355480: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ffff888029355500: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
>ffff888029355580: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
^
ffff888029355600: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ffff888029355680: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
==================================================================
Tested on:
commit: 3cdb4559 Merge tag 's390-6.9-4' of git://git.kernel.or..
git tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
console output: https://syzkaller.appspot.com/x/log.txt?x=10c3d0d3180000
kernel config: https://syzkaller.appspot.com/x/.config?x=d239903bd07761e5
dashboard link: https://syzkaller.appspot.com/bug?extid=6cf5652d3df49fae2e3f
compiler: Debian clang version 15.0.6, GNU ld (GNU Binutils for Debian) 2.40
patch: https://syzkaller.appspot.com/x/patch.diff?x=105d6b20980000
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [syzbot] [pm?] KASAN: use-after-free Read in netdev_unregister_kobject
2024-04-22 15:35 [syzbot] [pm?] KASAN: use-after-free Read in netdev_unregister_kobject syzbot
2024-04-22 23:16 ` Hillf Danton
@ 2024-04-23 10:42 ` Hillf Danton
2024-04-23 13:25 ` syzbot
2024-04-23 21:31 ` Hillf Danton
` (6 subsequent siblings)
8 siblings, 1 reply; 19+ messages in thread
From: Hillf Danton @ 2024-04-23 10:42 UTC (permalink / raw)
To: syzbot; +Cc: linux-kernel, syzkaller-bugs
On Mon, 22 Apr 2024 08:35:25 -0700
> syzbot found the following issue on:
>
> HEAD commit: 3cdb45594619 Merge tag 's390-6.9-4' of git://git.kernel.or..
> git tree: upstream
> C reproducer: https://syzkaller.appspot.com/x/repro.c?x=144067cb180000
#syz test https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 3cdb45594619
--- x/net/bluetooth/bnep/core.c
+++ y/net/bluetooth/bnep/core.c
@@ -535,6 +535,7 @@ static int bnep_session(void *arg)
__bnep_unlink_session(s);
up_write(&bnep_session_sem);
+ put_device(dev->dev.parent);
free_netdev(dev);
module_put_and_kthread_exit(0);
return 0;
@@ -618,7 +619,7 @@ int bnep_add_connection(struct bnep_conn
bnep_set_default_proto_filter(s);
#endif
- SET_NETDEV_DEV(dev, bnep_get_device(s));
+ SET_NETDEV_DEV(dev, get_device(bnep_get_device(s)));
SET_NETDEV_DEVTYPE(dev, &bnep_type);
err = register_netdev(dev);
--
^ permalink raw reply [flat|nested] 19+ messages in thread* Re: [syzbot] [pm?] KASAN: use-after-free Read in netdev_unregister_kobject
2024-04-23 10:42 ` Hillf Danton
@ 2024-04-23 13:25 ` syzbot
0 siblings, 0 replies; 19+ messages in thread
From: syzbot @ 2024-04-23 13:25 UTC (permalink / raw)
To: hdanton, linux-kernel, syzkaller-bugs
Hello,
syzbot has tested the proposed patch but the reproducer is still triggering an issue:
KASAN: out-of-bounds Read in netdev_unregister_kobject
==================================================================
BUG: KASAN: out-of-bounds in device_for_each_child+0xa7/0x170 drivers/base/core.c:4044
Read of size 8 at addr ffff88806e92d5f8 by task kbnepd bnep0/5637
CPU: 0 PID: 5637 Comm: kbnepd bnep0 Not tainted 6.9.0-rc4-syzkaller-00173-g3cdb45594619-dirty #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 03/27/2024
Call Trace:
<TASK>
__dump_stack lib/dump_stack.c:88 [inline]
dump_stack_lvl+0x241/0x360 lib/dump_stack.c:114
print_address_description mm/kasan/report.c:377 [inline]
print_report+0x169/0x550 mm/kasan/report.c:488
kasan_report+0x143/0x180 mm/kasan/report.c:601
device_for_each_child+0xa7/0x170 drivers/base/core.c:4044
pm_runtime_set_memalloc_noio+0x114/0x260 drivers/base/power/runtime.c:248
netdev_unregister_kobject+0x178/0x250 net/core/net-sysfs.c:2106
unregister_netdevice_many_notify+0x11dd/0x16e0 net/core/dev.c:11135
unregister_netdevice_many net/core/dev.c:11163 [inline]
unregister_netdevice_queue+0x303/0x370 net/core/dev.c:11042
unregister_netdevice include/linux/netdevice.h:3115 [inline]
unregister_netdev+0x1c/0x30 net/core/dev.c:11181
bnep_session+0x2e09/0x3030 net/bluetooth/bnep/core.c:525
kthread+0x2f2/0x390 kernel/kthread.c:388
ret_from_fork+0x4d/0x80 arch/x86/kernel/process.c:147
ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:244
</TASK>
The buggy address belongs to the physical page:
page: refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x6e92c
head: order:2 entire_mapcount:0 nr_pages_mapped:0 pincount:0
flags: 0xfff80000000040(head|node=0|zone=1|lastcpupid=0xfff)
page_type: 0xffffffff()
raw: 00fff80000000040 0000000000000000 dead000000000122 0000000000000000
raw: 0000000000000000 0000000000000000 00000001ffffffff 0000000000000000
head: 00fff80000000040 0000000000000000 dead000000000122 0000000000000000
head: 0000000000000000 0000000000000000 00000001ffffffff 0000000000000000
head: 00fff80000000002 ffffea0001ba4b01 dead000000000122 00000000ffffffff
head: 0000000400000000 0000000000000000 00000000ffffffff 0000000000000000
page dumped because: kasan: bad access detected
page_owner tracks the page as allocated
page last allocated via order 2, migratetype Unmovable, gfp_mask 0x140dc0(GFP_USER|__GFP_COMP|__GFP_ZERO), pid 5732, tgid -1102947349 (syz-executor.3), ts 5732, free_ts 127654865274
set_page_owner include/linux/page_owner.h:32 [inline]
post_alloc_hook+0x1ea/0x210 mm/page_alloc.c:1534
prep_new_page mm/page_alloc.c:1541 [inline]
get_page_from_freelist+0x3410/0x35b0 mm/page_alloc.c:3317
__alloc_pages+0x256/0x6c0 mm/page_alloc.c:4575
__alloc_pages_node include/linux/gfp.h:238 [inline]
alloc_pages_node include/linux/gfp.h:261 [inline]
__kmalloc_large_node+0x91/0x1f0 mm/slub.c:3911
__do_kmalloc_node mm/slub.c:3954 [inline]
__kmalloc+0x320/0x4a0 mm/slub.c:3979
kmalloc include/linux/slab.h:632 [inline]
kzalloc include/linux/slab.h:749 [inline]
hci_alloc_dev_priv+0x27/0x2030 net/bluetooth/hci_core.c:2500
hci_alloc_dev include/net/bluetooth/hci_core.h:1672 [inline]
__vhci_create_device drivers/bluetooth/hci_vhci.c:406 [inline]
vhci_create_device+0x12e/0x720 drivers/bluetooth/hci_vhci.c:480
vhci_get_user drivers/bluetooth/hci_vhci.c:537 [inline]
vhci_write+0x3cb/0x480 drivers/bluetooth/hci_vhci.c:617
call_write_iter include/linux/fs.h:2110 [inline]
new_sync_write fs/read_write.c:497 [inline]
vfs_write+0xa86/0xcb0 fs/read_write.c:590
ksys_write+0x1a0/0x2c0 fs/read_write.c:643
do_syscall_x64 arch/x86/entry/common.c:52 [inline]
do_syscall_64+0xf5/0x240 arch/x86/entry/common.c:83
entry_SYSCALL_64_after_hwframe+0x77/0x7f
page last free pid 5462 tgid 5462 stack trace:
reset_page_owner include/linux/page_owner.h:25 [inline]
free_pages_prepare mm/page_alloc.c:1141 [inline]
free_unref_page_prepare+0x986/0xab0 mm/page_alloc.c:2347
free_unref_page+0x37/0x3f0 mm/page_alloc.c:2487
__folio_put_large+0x13f/0x190 mm/swap.c:132
__folio_put+0x299/0x390 mm/swap.c:140
folio_put include/linux/mm.h:1506 [inline]
free_large_kmalloc+0x105/0x1c0 mm/slub.c:4361
kfree+0x1ca/0x3a0 mm/slub.c:4384
hci_release_dev+0x1516/0x16a0 net/bluetooth/hci_core.c:2833
bt_host_release+0x83/0x90 net/bluetooth/hci_sysfs.c:94
device_release+0x9b/0x1c0
kobject_cleanup lib/kobject.c:689 [inline]
kobject_release lib/kobject.c:720 [inline]
kref_put include/linux/kref.h:65 [inline]
kobject_put+0x231/0x480 lib/kobject.c:737
vhci_release+0x8b/0xd0 drivers/bluetooth/hci_vhci.c:675
__fput+0x42b/0x8a0 fs/file_table.c:422
task_work_run+0x251/0x310 kernel/task_work.c:180
exit_task_work include/linux/task_work.h:38 [inline]
do_exit+0xa1b/0x27e0 kernel/exit.c:878
do_group_exit+0x207/0x2c0 kernel/exit.c:1027
__do_sys_exit_group kernel/exit.c:1038 [inline]
__se_sys_exit_group kernel/exit.c:1036 [inline]
__x64_sys_exit_group+0x3f/0x40 kernel/exit.c:1036
Memory state around the buggy address:
ffff88806e92d500: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
ffff88806e92d580: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
>ffff88806e92d600: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
^
ffff88806e92d680: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
ffff88806e92d700: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
==================================================================
Tested on:
commit: 3cdb4559 Merge tag 's390-6.9-4' of git://git.kernel.or..
git tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
console output: https://syzkaller.appspot.com/x/log.txt?x=12f4cd9f180000
kernel config: https://syzkaller.appspot.com/x/.config?x=d239903bd07761e5
dashboard link: https://syzkaller.appspot.com/bug?extid=6cf5652d3df49fae2e3f
compiler: Debian clang version 15.0.6, GNU ld (GNU Binutils for Debian) 2.40
patch: https://syzkaller.appspot.com/x/patch.diff?x=124cca53180000
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [syzbot] [pm?] KASAN: use-after-free Read in netdev_unregister_kobject
2024-04-22 15:35 [syzbot] [pm?] KASAN: use-after-free Read in netdev_unregister_kobject syzbot
2024-04-22 23:16 ` Hillf Danton
2024-04-23 10:42 ` Hillf Danton
@ 2024-04-23 21:31 ` Hillf Danton
2024-04-23 22:06 ` syzbot
2024-10-24 14:13 ` [syzbot] " syzbot
` (5 subsequent siblings)
8 siblings, 1 reply; 19+ messages in thread
From: Hillf Danton @ 2024-04-23 21:31 UTC (permalink / raw)
To: syzbot; +Cc: linux-kernel, syzkaller-bugs
On Mon, 22 Apr 2024 08:35:25 -0700
> syzbot found the following issue on:
>
> HEAD commit: 3cdb45594619 Merge tag 's390-6.9-4' of git://git.kernel.or..
> git tree: upstream
> C reproducer: https://syzkaller.appspot.com/x/repro.c?x=144067cb180000
#syz test https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 3cdb45594619
--- x/net/bluetooth/bnep/core.c
+++ y/net/bluetooth/bnep/core.c
@@ -540,16 +540,6 @@ static int bnep_session(void *arg)
return 0;
}
-static struct device *bnep_get_device(struct bnep_session *session)
-{
- struct l2cap_conn *conn = l2cap_pi(session->sock->sk)->chan->conn;
-
- if (!conn || !conn->hcon)
- return NULL;
-
- return &conn->hcon->dev;
-}
-
static const struct device_type bnep_type = {
.name = "bluetooth",
};
@@ -618,7 +608,6 @@ int bnep_add_connection(struct bnep_conn
bnep_set_default_proto_filter(s);
#endif
- SET_NETDEV_DEV(dev, bnep_get_device(s));
SET_NETDEV_DEVTYPE(dev, &bnep_type);
err = register_netdev(dev);
--
^ permalink raw reply [flat|nested] 19+ messages in thread* Re: [syzbot] Re: KASAN: use-after-free Read in netdev_unregister_kobject
2024-04-22 15:35 [syzbot] [pm?] KASAN: use-after-free Read in netdev_unregister_kobject syzbot
` (2 preceding siblings ...)
2024-04-23 21:31 ` Hillf Danton
@ 2024-10-24 14:13 ` syzbot
2024-10-24 14:14 ` syzbot
` (4 subsequent siblings)
8 siblings, 0 replies; 19+ messages in thread
From: syzbot @ 2024-10-24 14:13 UTC (permalink / raw)
To: linux-kernel, syzkaller-bugs
For archival purposes, forwarding an incoming command email to
linux-kernel@vger.kernel.org, syzkaller-bugs@googlegroups.com.
***
Subject: Re: KASAN: use-after-free Read in netdev_unregister_kobject
Author: dmantipov@yandex.ru
#syz test git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next fb4560832d4c91d73680538d6659ac2c024ec9d5
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index 629c302f7407..aaa7849c74f4 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -2716,7 +2716,6 @@ void hci_unregister_dev(struct hci_dev *hdev)
rfkill_destroy(hdev->rfkill);
}
- device_del(&hdev->dev);
/* Actual cleanup is deferred until hci_release_dev(). */
hci_dev_put(hdev);
}
@@ -2756,6 +2755,8 @@ void hci_release_dev(struct hci_dev *hdev)
kfree_skb(hdev->sent_cmd);
kfree_skb(hdev->req_skb);
kfree_skb(hdev->recv_event);
+
+ device_del(&hdev->dev);
kfree(hdev);
}
EXPORT_SYMBOL(hci_release_dev);
^ permalink raw reply related [flat|nested] 19+ messages in thread* Re: [syzbot] Re: KASAN: use-after-free Read in netdev_unregister_kobject
2024-04-22 15:35 [syzbot] [pm?] KASAN: use-after-free Read in netdev_unregister_kobject syzbot
` (3 preceding siblings ...)
2024-10-24 14:13 ` [syzbot] " syzbot
@ 2024-10-24 14:14 ` syzbot
2024-11-01 11:57 ` syzbot
` (3 subsequent siblings)
8 siblings, 0 replies; 19+ messages in thread
From: syzbot @ 2024-10-24 14:14 UTC (permalink / raw)
To: linux-kernel, syzkaller-bugs
For archival purposes, forwarding an incoming command email to
linux-kernel@vger.kernel.org, syzkaller-bugs@googlegroups.com.
***
Subject: Re: KASAN: use-after-free Read in netdev_unregister_kobject
Author: dmantipov@yandex.ru
#syz test https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git c2ee9f594da826bea183ed14f2cc029c719bf4da
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index 629c302f7407..aaa7849c74f4 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -2716,7 +2716,6 @@ void hci_unregister_dev(struct hci_dev *hdev)
rfkill_destroy(hdev->rfkill);
}
- device_del(&hdev->dev);
/* Actual cleanup is deferred until hci_release_dev(). */
hci_dev_put(hdev);
}
@@ -2756,6 +2755,8 @@ void hci_release_dev(struct hci_dev *hdev)
kfree_skb(hdev->sent_cmd);
kfree_skb(hdev->req_skb);
kfree_skb(hdev->recv_event);
+
+ device_del(&hdev->dev);
kfree(hdev);
}
EXPORT_SYMBOL(hci_release_dev);
^ permalink raw reply related [flat|nested] 19+ messages in thread* Re: [syzbot] Re: KASAN: use-after-free Read in netdev_unregister_kobject
2024-04-22 15:35 [syzbot] [pm?] KASAN: use-after-free Read in netdev_unregister_kobject syzbot
` (4 preceding siblings ...)
2024-10-24 14:14 ` syzbot
@ 2024-11-01 11:57 ` syzbot
2024-11-01 11:59 ` syzbot
` (2 subsequent siblings)
8 siblings, 0 replies; 19+ messages in thread
From: syzbot @ 2024-11-01 11:57 UTC (permalink / raw)
To: linux-kernel, syzkaller-bugs
For archival purposes, forwarding an incoming command email to
linux-kernel@vger.kernel.org, syzkaller-bugs@googlegroups.com.
***
Subject: Re: KASAN: use-after-free Read in netdev_unregister_kobject
Author: dmantipov@yandex.ru
#syz test https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 6c52d4da1c742cd01a797a4d0a2d3c5a60dc9bfe
diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c
index 367e32fe30eb..80ac537fa500 100644
--- a/net/bluetooth/hci_sysfs.c
+++ b/net/bluetooth/hci_sysfs.c
@@ -73,6 +73,8 @@ void hci_conn_del_sysfs(struct hci_conn *conn)
return;
}
+ device_move(&conn->dev, NULL, DPM_ORDER_DEV_LAST);
+
while (1) {
struct device *dev;
--
2.47.0
^ permalink raw reply related [flat|nested] 19+ messages in thread* Re: [syzbot] Re: KASAN: use-after-free Read in netdev_unregister_kobject
2024-04-22 15:35 [syzbot] [pm?] KASAN: use-after-free Read in netdev_unregister_kobject syzbot
` (5 preceding siblings ...)
2024-11-01 11:57 ` syzbot
@ 2024-11-01 11:59 ` syzbot
2024-11-01 15:01 ` [syzbot] Re: [PATCH v2] Bluetooth: fix use-after-free in device_for_each_child() syzbot
2024-11-01 19:30 ` syzbot
8 siblings, 0 replies; 19+ messages in thread
From: syzbot @ 2024-11-01 11:59 UTC (permalink / raw)
To: linux-kernel, syzkaller-bugs
For archival purposes, forwarding an incoming command email to
linux-kernel@vger.kernel.org, syzkaller-bugs@googlegroups.com.
***
Subject: Re: KASAN: use-after-free Read in netdev_unregister_kobject
Author: dmantipov@yandex.ru
#syz test git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next dff8a64238a3f951dbf0930bac915eec7cae8200
diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c
index 367e32fe30eb..80ac537fa500 100644
--- a/net/bluetooth/hci_sysfs.c
+++ b/net/bluetooth/hci_sysfs.c
@@ -73,6 +73,8 @@ void hci_conn_del_sysfs(struct hci_conn *conn)
return;
}
+ device_move(&conn->dev, NULL, DPM_ORDER_DEV_LAST);
+
while (1) {
struct device *dev;
--
2.47.0
^ permalink raw reply related [flat|nested] 19+ messages in thread* Re: [syzbot] Re: [PATCH v2] Bluetooth: fix use-after-free in device_for_each_child()
2024-04-22 15:35 [syzbot] [pm?] KASAN: use-after-free Read in netdev_unregister_kobject syzbot
` (6 preceding siblings ...)
2024-11-01 11:59 ` syzbot
@ 2024-11-01 15:01 ` syzbot
2024-11-01 19:30 ` syzbot
8 siblings, 0 replies; 19+ messages in thread
From: syzbot @ 2024-11-01 15:01 UTC (permalink / raw)
To: linux-kernel, syzkaller-bugs
For archival purposes, forwarding an incoming command email to
linux-kernel@vger.kernel.org, syzkaller-bugs@googlegroups.com.
***
Subject: Re: [PATCH v2] Bluetooth: fix use-after-free in device_for_each_child()
Author: luiz.dentz@gmail.com
#syz test
On Fri, Nov 1, 2024 at 7:44 AM Dmitry Antipov <dmantipov@yandex.ru> wrote:
>
> Syzbot has reported the following KASAN splat:
>
> BUG: KASAN: slab-use-after-free in device_for_each_child+0x18f/0x1a0
> Read of size 8 at addr ffff88801f605308 by task kbnepd bnep0/4980
>
> CPU: 0 UID: 0 PID: 4980 Comm: kbnepd bnep0 Not tainted 6.12.0-rc4-00161-gae90f6a6170d #1
> Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.3-2.fc40 04/01/2014
> Call Trace:
> <TASK>
> dump_stack_lvl+0x100/0x190
> ? device_for_each_child+0x18f/0x1a0
> print_report+0x13a/0x4cb
> ? __virt_addr_valid+0x5e/0x590
> ? __phys_addr+0xc6/0x150
> ? device_for_each_child+0x18f/0x1a0
> kasan_report+0xda/0x110
> ? device_for_each_child+0x18f/0x1a0
> ? __pfx_dev_memalloc_noio+0x10/0x10
> device_for_each_child+0x18f/0x1a0
> ? __pfx_device_for_each_child+0x10/0x10
> pm_runtime_set_memalloc_noio+0xf2/0x180
> netdev_unregister_kobject+0x1ed/0x270
> unregister_netdevice_many_notify+0x123c/0x1d80
> ? __mutex_trylock_common+0xde/0x250
> ? __pfx_unregister_netdevice_many_notify+0x10/0x10
> ? trace_contention_end+0xe6/0x140
> ? __mutex_lock+0x4e7/0x8f0
> ? __pfx_lock_acquire.part.0+0x10/0x10
> ? rcu_is_watching+0x12/0xc0
> ? unregister_netdev+0x12/0x30
> unregister_netdevice_queue+0x30d/0x3f0
> ? __pfx_unregister_netdevice_queue+0x10/0x10
> ? __pfx_down_write+0x10/0x10
> unregister_netdev+0x1c/0x30
> bnep_session+0x1fb3/0x2ab0
> ? __pfx_bnep_session+0x10/0x10
> ? __pfx_lock_release+0x10/0x10
> ? __pfx_woken_wake_function+0x10/0x10
> ? __kthread_parkme+0x132/0x200
> ? __pfx_bnep_session+0x10/0x10
> ? kthread+0x13a/0x370
> ? __pfx_bnep_session+0x10/0x10
> kthread+0x2b7/0x370
> ? __pfx_kthread+0x10/0x10
> ret_from_fork+0x48/0x80
> ? __pfx_kthread+0x10/0x10
> ret_from_fork_asm+0x1a/0x30
> </TASK>
>
> Allocated by task 4974:
> kasan_save_stack+0x30/0x50
> kasan_save_track+0x14/0x30
> __kasan_kmalloc+0xaa/0xb0
> __kmalloc_noprof+0x1d1/0x440
> hci_alloc_dev_priv+0x1d/0x2820
> __vhci_create_device+0xef/0x7d0
> vhci_write+0x2c7/0x480
> vfs_write+0x6a0/0xfc0
> ksys_write+0x12f/0x260
> do_syscall_64+0xc7/0x250
> entry_SYSCALL_64_after_hwframe+0x77/0x7f
>
> Freed by task 4979:
> kasan_save_stack+0x30/0x50
> kasan_save_track+0x14/0x30
> kasan_save_free_info+0x3b/0x60
> __kasan_slab_free+0x4f/0x70
> kfree+0x141/0x490
> hci_release_dev+0x4d9/0x600
> bt_host_release+0x6a/0xb0
> device_release+0xa4/0x240
> kobject_put+0x1ec/0x5a0
> put_device+0x1f/0x30
> vhci_release+0x81/0xf0
> __fput+0x3f6/0xb30
> task_work_run+0x151/0x250
> do_exit+0xa79/0x2c30
> do_group_exit+0xd5/0x2a0
> get_signal+0x1fcd/0x2210
> arch_do_signal_or_restart+0x93/0x780
> syscall_exit_to_user_mode+0x140/0x290
> do_syscall_64+0xd4/0x250
> entry_SYSCALL_64_after_hwframe+0x77/0x7f
>
> In 'hci_conn_del_sysfs()', 'device_unregister()' may be called when
> an underlying (kobject) reference counter is greater than 1. This
> means that reparenting (happened when the device is actually freed)
> is delayed and, during that delay, parent controller device (hciX)
> may be deleted. Since the latter may create a dangling pointer to
> freed parent, avoid that scenario by reparenting to NULL explicitly.
>
> Reported-by: syzbot+6cf5652d3df49fae2e3f@syzkaller.appspotmail.com
> Closes: https://syzkaller.appspot.com/bug?extid=6cf5652d3df49fae2e3f
> Fixes: a85fb91e3d72 ("Bluetooth: Fix double free in hci_conn_cleanup")
> Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru>
> ---
> v2: reparent per-connection 'struct device' explicitly
> ---
> net/bluetooth/hci_sysfs.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c
> index 367e32fe30eb..80ac537fa500 100644
> --- a/net/bluetooth/hci_sysfs.c
> +++ b/net/bluetooth/hci_sysfs.c
> @@ -73,6 +73,8 @@ void hci_conn_del_sysfs(struct hci_conn *conn)
> return;
> }
>
> + device_move(&conn->dev, NULL, DPM_ORDER_DEV_LAST);
> +
> while (1) {
> struct device *dev;
>
> --
> 2.47.0
>
--
Luiz Augusto von Dentz
^ permalink raw reply [flat|nested] 19+ messages in thread* Re: [syzbot] Re: [PATCH v2] Bluetooth: fix use-after-free in device_for_each_child()
2024-04-22 15:35 [syzbot] [pm?] KASAN: use-after-free Read in netdev_unregister_kobject syzbot
` (7 preceding siblings ...)
2024-11-01 15:01 ` [syzbot] Re: [PATCH v2] Bluetooth: fix use-after-free in device_for_each_child() syzbot
@ 2024-11-01 19:30 ` syzbot
8 siblings, 0 replies; 19+ messages in thread
From: syzbot @ 2024-11-01 19:30 UTC (permalink / raw)
To: linux-kernel, syzkaller-bugs
For archival purposes, forwarding an incoming command email to
linux-kernel@vger.kernel.org, syzkaller-bugs@googlegroups.com.
***
Subject: Re: [PATCH v2] Bluetooth: fix use-after-free in device_for_each_child()
Author: luiz.dentz@gmail.com
On Fri, Nov 1, 2024 at 1:37 PM Luiz Augusto von Dentz
<luiz.dentz@gmail.com> wrote:
>
> Hi Dmitry,
>
> On Fri, Nov 1, 2024 at 11:31 AM Luiz Augusto von Dentz
> <luiz.dentz@gmail.com> wrote:
> >
> > Hi Dmitry,
> >
> > On Fri, Nov 1, 2024 at 11:17 AM Dmitry Antipov <dmantipov@yandex.ru> wrote:
> > >
> > > On 11/1/24 6:12 PM, Luiz Augusto von Dentz wrote:
> > >
> > > > There is no Tested-by thus why I assumed it wasn't tested by syzbot yet.
> > >
> > > Ugh. Until today I've assumed that Tested-by: is applicable to human-driven
> > > testing only :-).
> >
> > Nope, in fact it is very handy to have syzbot test your changes since
> > it may hit other problems as well.
>
> Looks like this doesn't solve the problem, in fact I think you are
> getting it backwards, you are trying to reparent the parent dev not
> the child and I assume by destroying the parent device there should be
> some way to reset the parent which seems to be the intent the
> following code in hci_conn_del_sysfs:
>
> while (1) {
> struct device *dev;
>
> dev = device_find_child(&conn->dev, NULL, __match_tty);
> if (!dev)
> break;
> device_move(dev, NULL, DPM_ORDER_DEV_LAST);
> put_device(dev);
> }
>
> But note that it only does that after matching tty, but I guess we
> want to do it regardless otherwise we may have the child objects still
> access it, that said we should probably use device_for_each_child
> though if that is safe to do calls to device_move under its callback.
#syz test
> > > Dmitry
> > >
> >
> >
> > --
> > Luiz Augusto von Dentz
>
>
>
> --
> Luiz Augusto von Dentz
--
Luiz Augusto von Dentz
^ permalink raw reply [flat|nested] 19+ messages in thread