drivers/block/nbd.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
From: Zheng Qixing <zhengqixing@huawei.com>
There is a use-after-free issue in nbd:
block nbd6: Receive control failed (result -104)
block nbd6: shutting down sockets
==================================================================
BUG: KASAN: slab-use-after-free in recv_work+0x694/0xa80 drivers/block/nbd.c:1022
Write of size 4 at addr ffff8880295de478 by task kworker/u33:0/67
CPU: 2 UID: 0 PID: 67 Comm: kworker/u33:0 Not tainted 6.15.0-rc5-syzkaller-00123-g2c89c1b655c0 #0 PREEMPT(full)
Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2~bpo12+1 04/01/2014
Workqueue: nbd6-recv recv_work
Call Trace:
<TASK>
__dump_stack lib/dump_stack.c:94 [inline]
dump_stack_lvl+0x116/0x1f0 lib/dump_stack.c:120
print_address_description mm/kasan/report.c:408 [inline]
print_report+0xc3/0x670 mm/kasan/report.c:521
kasan_report+0xe0/0x110 mm/kasan/report.c:634
check_region_inline mm/kasan/generic.c:183 [inline]
kasan_check_range+0xef/0x1a0 mm/kasan/generic.c:189
instrument_atomic_read_write include/linux/instrumented.h:96 [inline]
atomic_dec include/linux/atomic/atomic-instrumented.h:592 [inline]
recv_work+0x694/0xa80 drivers/block/nbd.c:1022
process_one_work+0x9cc/0x1b70 kernel/workqueue.c:3238
process_scheduled_works kernel/workqueue.c:3319 [inline]
worker_thread+0x6c8/0xf10 kernel/workqueue.c:3400
kthread+0x3c2/0x780 kernel/kthread.c:464
ret_from_fork+0x45/0x80 arch/x86/kernel/process.c:153
ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:245
</TASK>
nbd_genl_connect() does not properly stop the device on certain
error paths after nbd_start_device() has been called. This causes
the error path to put nbd->config while recv_work continue to use
the config after putting it, leading to use-after-free in recv_work.
This patch moves nbd_start_device() after the backend file creation.
Reported-by: syzbot+48240bab47e705c53126@syzkaller.appspotmail.com
Closes: https://lore.kernel.org/all/68227a04.050a0220.f2294.00b5.GAE@google.com/T/
Fixes: 6497ef8df568 ("nbd: provide a way for userspace processes to identify device backends")
Signed-off-by: Zheng Qixing <zhengqixing@huawei.com>
---
drivers/block/nbd.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c
index 7bdc7eb808ea..2592bd19ebc1 100644
--- a/drivers/block/nbd.c
+++ b/drivers/block/nbd.c
@@ -2198,9 +2198,7 @@ static int nbd_genl_connect(struct sk_buff *skb, struct genl_info *info)
goto out;
}
}
- ret = nbd_start_device(nbd);
- if (ret)
- goto out;
+
if (info->attrs[NBD_ATTR_BACKEND_IDENTIFIER]) {
nbd->backend = nla_strdup(info->attrs[NBD_ATTR_BACKEND_IDENTIFIER],
GFP_KERNEL);
@@ -2216,6 +2214,8 @@ static int nbd_genl_connect(struct sk_buff *skb, struct genl_info *info)
goto out;
}
set_bit(NBD_RT_HAS_BACKEND_FILE, &config->runtime_flags);
+
+ ret = nbd_start_device(nbd);
out:
mutex_unlock(&nbd->config_lock);
if (!ret) {
--
2.39.2
On Thu, 12 Jun 2025 21:24:05 +0800, Zheng Qixing wrote: > There is a use-after-free issue in nbd: > > block nbd6: Receive control failed (result -104) > block nbd6: shutting down sockets > ================================================================== > BUG: KASAN: slab-use-after-free in recv_work+0x694/0xa80 drivers/block/nbd.c:1022 > Write of size 4 at addr ffff8880295de478 by task kworker/u33:0/67 > > [...] Applied, thanks! [1/1] nbd: fix uaf in nbd_genl_connect() error path commit: aa9552438ebf015fc5f9f890dbfe39f0c53cf37e Best regards, -- Jens Axboe
Hi, Jens! 在 2025/06/12 21:24, Zheng Qixing 写道: > block nbd6: Receive control failed (result -104) > block nbd6: shutting down sockets Since there is no other response, and according to the above error message, this syzkaller problem is pretty straightforward and easy to reporduce, can you consider this patch in this merger window? Thanks, Kuai
Gentle ping. Thanks, Qixing 在 2025/6/12 21:24, Zheng Qixing 写道: > From: Zheng Qixing <zhengqixing@huawei.com> > > There is a use-after-free issue in nbd: > > block nbd6: Receive control failed (result -104) > block nbd6: shutting down sockets > ================================================================== > BUG: KASAN: slab-use-after-free in recv_work+0x694/0xa80 drivers/block/nbd.c:1022 > Write of size 4 at addr ffff8880295de478 by task kworker/u33:0/67 > > CPU: 2 UID: 0 PID: 67 Comm: kworker/u33:0 Not tainted 6.15.0-rc5-syzkaller-00123-g2c89c1b655c0 #0 PREEMPT(full) > Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2~bpo12+1 04/01/2014 > Workqueue: nbd6-recv recv_work > Call Trace: > <TASK> > __dump_stack lib/dump_stack.c:94 [inline] > dump_stack_lvl+0x116/0x1f0 lib/dump_stack.c:120 > print_address_description mm/kasan/report.c:408 [inline] > print_report+0xc3/0x670 mm/kasan/report.c:521 > kasan_report+0xe0/0x110 mm/kasan/report.c:634 > check_region_inline mm/kasan/generic.c:183 [inline] > kasan_check_range+0xef/0x1a0 mm/kasan/generic.c:189 > instrument_atomic_read_write include/linux/instrumented.h:96 [inline] > atomic_dec include/linux/atomic/atomic-instrumented.h:592 [inline] > recv_work+0x694/0xa80 drivers/block/nbd.c:1022 > process_one_work+0x9cc/0x1b70 kernel/workqueue.c:3238 > process_scheduled_works kernel/workqueue.c:3319 [inline] > worker_thread+0x6c8/0xf10 kernel/workqueue.c:3400 > kthread+0x3c2/0x780 kernel/kthread.c:464 > ret_from_fork+0x45/0x80 arch/x86/kernel/process.c:153 > ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:245 > </TASK> > > nbd_genl_connect() does not properly stop the device on certain > error paths after nbd_start_device() has been called. This causes > the error path to put nbd->config while recv_work continue to use > the config after putting it, leading to use-after-free in recv_work. > > This patch moves nbd_start_device() after the backend file creation. > > Reported-by: syzbot+48240bab47e705c53126@syzkaller.appspotmail.com > Closes: https://lore.kernel.org/all/68227a04.050a0220.f2294.00b5.GAE@google.com/T/ > Fixes: 6497ef8df568 ("nbd: provide a way for userspace processes to identify device backends") > Signed-off-by: Zheng Qixing <zhengqixing@huawei.com> > --- > drivers/block/nbd.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c > index 7bdc7eb808ea..2592bd19ebc1 100644 > --- a/drivers/block/nbd.c > +++ b/drivers/block/nbd.c > @@ -2198,9 +2198,7 @@ static int nbd_genl_connect(struct sk_buff *skb, struct genl_info *info) > goto out; > } > } > - ret = nbd_start_device(nbd); > - if (ret) > - goto out; > + > if (info->attrs[NBD_ATTR_BACKEND_IDENTIFIER]) { > nbd->backend = nla_strdup(info->attrs[NBD_ATTR_BACKEND_IDENTIFIER], > GFP_KERNEL); > @@ -2216,6 +2214,8 @@ static int nbd_genl_connect(struct sk_buff *skb, struct genl_info *info) > goto out; > } > set_bit(NBD_RT_HAS_BACKEND_FILE, &config->runtime_flags); > + > + ret = nbd_start_device(nbd); > out: > mutex_unlock(&nbd->config_lock); > if (!ret) {
在 2025/06/12 21:24, Zheng Qixing 写道: > From: Zheng Qixing<zhengqixing@huawei.com> > > There is a use-after-free issue in nbd: > > block nbd6: Receive control failed (result -104) > block nbd6: shutting down sockets > ================================================================== > BUG: KASAN: slab-use-after-free in recv_work+0x694/0xa80 drivers/block/nbd.c:1022 > Write of size 4 at addr ffff8880295de478 by task kworker/u33:0/67 > > CPU: 2 UID: 0 PID: 67 Comm: kworker/u33:0 Not tainted 6.15.0-rc5-syzkaller-00123-g2c89c1b655c0 #0 PREEMPT(full) > Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2~bpo12+1 04/01/2014 > Workqueue: nbd6-recv recv_work > Call Trace: > <TASK> > __dump_stack lib/dump_stack.c:94 [inline] > dump_stack_lvl+0x116/0x1f0 lib/dump_stack.c:120 > print_address_description mm/kasan/report.c:408 [inline] > print_report+0xc3/0x670 mm/kasan/report.c:521 > kasan_report+0xe0/0x110 mm/kasan/report.c:634 > check_region_inline mm/kasan/generic.c:183 [inline] > kasan_check_range+0xef/0x1a0 mm/kasan/generic.c:189 > instrument_atomic_read_write include/linux/instrumented.h:96 [inline] > atomic_dec include/linux/atomic/atomic-instrumented.h:592 [inline] > recv_work+0x694/0xa80 drivers/block/nbd.c:1022 > process_one_work+0x9cc/0x1b70 kernel/workqueue.c:3238 > process_scheduled_works kernel/workqueue.c:3319 [inline] > worker_thread+0x6c8/0xf10 kernel/workqueue.c:3400 > kthread+0x3c2/0x780 kernel/kthread.c:464 > ret_from_fork+0x45/0x80 arch/x86/kernel/process.c:153 > ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:245 > </TASK> > > nbd_genl_connect() does not properly stop the device on certain > error paths after nbd_start_device() has been called. This causes > the error path to put nbd->config while recv_work continue to use > the config after putting it, leading to use-after-free in recv_work. > > This patch moves nbd_start_device() after the backend file creation. > > Reported-by:syzbot+48240bab47e705c53126@syzkaller.appspotmail.com > Closes:https://lore.kernel.org/all/68227a04.050a0220.f2294.00b5.GAE@google.com/T/ > Fixes: 6497ef8df568 ("nbd: provide a way for userspace processes to identify device backends") > Signed-off-by: Zheng Qixing<zhengqixing@huawei.com> > --- > drivers/block/nbd.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) Reviewed-by: Yu Kuai <yukuai3@huawei.com>
© 2016 - 2025 Red Hat, Inc.