Zhihao Cheng
dacfd5e4d1
blktrace: Fix uaf in blk_trace access after removing by sysfs
[ Upstream commit 5afedf670c ]
There is an use-after-free problem triggered by following process:
P1(sda) P2(sdb)
echo 0 > /sys/block/sdb/trace/enable
blk_trace_remove_queue
synchronize_rcu
blk_trace_free
relay_close
rcu_read_lock
__blk_add_trace
trace_note_tsk
(Iterate running_trace_list)
relay_close_buf
relay_destroy_buf
kfree(buf)
trace_note(sdb's bt)
relay_reserve
buf->offset <- nullptr deference (use-after-free) !!!
rcu_read_unlock
[ 502.714379] BUG: kernel NULL pointer dereference, address:
0000000000000010
[ 502.715260] #PF: supervisor read access in kernel mode
[ 502.715903] #PF: error_code(0x0000) - not-present page
[ 502.716546] PGD 103984067 P4D 103984067 PUD 17592b067 PMD 0
[ 502.717252] Oops: 0000 [#1] SMP
[ 502.720308] RIP: 0010:trace_note.isra.0+0x86/0x360
[ 502.732872] Call Trace:
[ 502.733193] __blk_add_trace.cold+0x137/0x1a3
[ 502.733734] blk_add_trace_rq+0x7b/0xd0
[ 502.734207] blk_add_trace_rq_issue+0x54/0xa0
[ 502.734755] blk_mq_start_request+0xde/0x1b0
[ 502.735287] scsi_queue_rq+0x528/0x1140
...
[ 502.742704] sg_new_write.isra.0+0x16e/0x3e0
[ 502.747501] sg_ioctl+0x466/0x1100
Reproduce method:
ioctl(/dev/sda, BLKTRACESETUP, blk_user_trace_setup[buf_size=127])
ioctl(/dev/sda, BLKTRACESTART)
ioctl(/dev/sdb, BLKTRACESETUP, blk_user_trace_setup[buf_size=127])
ioctl(/dev/sdb, BLKTRACESTART)
echo 0 > /sys/block/sdb/trace/enable &
// Add delay(mdelay/msleep) before kernel enters blk_trace_free()
ioctl$SG_IO(/dev/sda, SG_IO, ...)
// Enters trace_note_tsk() after blk_trace_free() returned
// Use mdelay in rcu region rather than msleep(which may schedule out)
Remove blk_trace from running_list before calling blk_trace_free() by
sysfs if blk_trace is at Blktrace_running state.
Fixes: c71a896154 ("blktrace: add ftrace plugin")
Signed-off-by: Zhihao Cheng <chengzhihao1@huawei.com>
Link: https://lore.kernel.org/r/20210923134921.109194-1-chengzhihao1@huawei.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2021-10-06 10:23:40 +02:00
..
2021-02-23 13:59:16 +01:00
2016-10-11 15:06:32 -07:00
2021-03-03 17:44:31 +01:00
2021-09-22 11:43:09 +02:00
2020-09-23 08:46:14 +02:00
2021-03-24 10:59:26 +01:00
2016-08-26 14:42:08 +02:00
2021-03-30 14:41:42 +02:00
2020-10-29 09:05:43 +01:00
2021-03-07 11:25:56 +01:00
2019-05-31 06:48:30 -07:00
2021-07-28 09:14:25 +02:00
2021-03-24 10:59:25 +01:00
2021-10-06 10:23:40 +02:00
2018-01-10 09:29:51 +01:00
2018-02-17 13:21:18 +01:00
2020-10-01 20:40:07 +02:00
2021-04-07 12:05:41 +02:00
2021-04-07 12:05:41 +02:00
2021-04-07 12:05:41 +02:00
2019-11-28 18:28:55 +01:00
2018-11-13 11:16:57 -08:00
2017-01-06 10:40:13 +01:00
2019-12-21 10:42:02 +01:00
2021-06-16 11:36:34 +02:00
2020-06-20 10:24:21 +02:00
2020-12-29 13:44:50 +01:00
2017-10-12 11:51:25 +02:00
2020-01-12 11:24:13 +01:00
2021-02-03 23:19:49 +01:00
2017-07-21 07:42:21 +02:00
2021-09-22 11:43:08 +02:00
2016-07-28 16:07:41 -07:00
2021-07-11 12:46:40 +02:00
2018-01-10 09:29:52 +01:00
2019-04-20 09:07:52 +02:00
2017-12-14 09:28:24 +01:00
2018-08-03 07:55:12 +02:00
2018-06-05 10:28:57 +02:00
2021-05-22 10:40:31 +02:00
2016-08-02 19:35:27 -04:00
2020-10-14 09:48:14 +02:00
2021-02-10 09:09:25 +01:00
2016-08-02 19:35:30 -04:00
2021-07-11 12:46:41 +02:00
2021-02-10 09:09:25 +01:00
2017-03-12 06:41:45 +01:00
2019-01-13 10:03:51 +01:00
2021-03-03 17:44:44 +01:00
2020-04-02 17:20:26 +02:00
2020-05-27 16:41:53 +02:00
2019-10-17 13:42:25 -07:00
2021-09-22 11:43:08 +02:00
2018-04-13 19:47:53 +02:00
2021-09-26 13:36:18 +02:00
2021-05-26 11:29:06 +02:00
2020-11-18 18:26:32 +01:00
2020-08-26 10:29:03 +02:00
2018-04-24 09:34:09 +02:00
2021-03-03 17:44:43 +01:00
2020-04-24 07:58:54 +02:00
2018-08-15 18:14:53 +02:00
2016-10-11 15:06:33 -07:00
2018-08-15 18:14:42 +02:00
2017-02-14 15:25:42 -08:00
2018-08-03 07:55:24 +02:00
2016-09-13 14:41:36 +02:00
2021-09-26 13:36:18 +02:00
2020-07-09 09:35:55 +02:00
2016-08-02 19:35:02 -04:00
2020-01-12 11:24:12 +01:00
2016-08-22 10:01:49 -07:00
2021-03-03 17:44:38 +01:00
2017-06-17 06:41:51 +02:00
2018-01-10 09:29:52 +01:00
2016-09-05 13:52:39 +02:00
2018-09-09 20:01:24 +02:00
2018-09-09 20:01:24 +02:00
2016-09-22 20:00:36 -05:00
2017-06-17 06:41:57 +02:00
2017-06-17 06:41:57 +02:00
2017-11-15 15:53:17 +01:00
2021-08-04 11:58:01 +02:00