Vulnerability Details CVE-2024-50225
In the Linux kernel, the following vulnerability has been resolved:
btrfs: fix error propagation of split bios
The purpose of btrfs_bbio_propagate_error() shall be propagating an error
of split bio to its original btrfs_bio, and tell the error to the upper
layer. However, it's not working well on some cases.
* Case 1. Immediate (or quick) end_bio with an error
When btrfs sends btrfs_bio to mirrored devices, btrfs calls
btrfs_bio_end_io() when all the mirroring bios are completed. If that
btrfs_bio was split, it is from btrfs_clone_bioset and its end_io function
is btrfs_orig_write_end_io. For this case, btrfs_bbio_propagate_error()
accesses the orig_bbio's bio context to increase the error count.
That works well in most cases. However, if the end_io is called enough
fast, orig_bbio's (remaining part after split) bio context may not be
properly set at that time. Since the bio context is set when the orig_bbio
(the last btrfs_bio) is sent to devices, that might be too late for earlier
split btrfs_bio's completion. That will result in NULL pointer
dereference.
That bug is easily reproducible by running btrfs/146 on zoned devices [1]
and it shows the following trace.
[1] You need raid-stripe-tree feature as it create "-d raid0 -m raid1" FS.
BUG: kernel NULL pointer dereference, address: 0000000000000020
#PF: supervisor read access in kernel mode
#PF: error_code(0x0000) - not-present page
PGD 0 P4D 0
Oops: Oops: 0000 [#1] PREEMPT SMP PTI
CPU: 1 UID: 0 PID: 13 Comm: kworker/u32:1 Not tainted 6.11.0-rc7-BTRFS-ZNS+ #474
Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011
Workqueue: writeback wb_workfn (flush-btrfs-5)
RIP: 0010:btrfs_bio_end_io+0xae/0xc0 [btrfs]
BTRFS error (device dm-0): bdev /dev/mapper/error-test errs: wr 2, rd 0, flush 0, corrupt 0, gen 0
RSP: 0018:ffffc9000006f248 EFLAGS: 00010246
RAX: 0000000000000000 RBX: ffff888005a7f080 RCX: ffffc9000006f1dc
RDX: 0000000000000000 RSI: 000000000000000a RDI: ffff888005a7f080
RBP: ffff888011dfc540 R08: 0000000000000000 R09: 0000000000000001
R10: ffffffff82e508e0 R11: 0000000000000005 R12: ffff88800ddfbe58
R13: ffff888005a7f080 R14: ffff888005a7f158 R15: ffff888005a7f158
FS: 0000000000000000(0000) GS:ffff88803ea80000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 0000000000000020 CR3: 0000000002e22006 CR4: 0000000000370ef0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
Call Trace:
<TASK>
? __die_body.cold+0x19/0x26
? page_fault_oops+0x13e/0x2b0
? _printk+0x58/0x73
? do_user_addr_fault+0x5f/0x750
? exc_page_fault+0x76/0x240
? asm_exc_page_fault+0x22/0x30
? btrfs_bio_end_io+0xae/0xc0 [btrfs]
? btrfs_log_dev_io_error+0x7f/0x90 [btrfs]
btrfs_orig_write_end_io+0x51/0x90 [btrfs]
dm_submit_bio+0x5c2/0xa50 [dm_mod]
? find_held_lock+0x2b/0x80
? blk_try_enter_queue+0x90/0x1e0
__submit_bio+0xe0/0x130
? ktime_get+0x10a/0x160
? lockdep_hardirqs_on+0x74/0x100
submit_bio_noacct_nocheck+0x199/0x410
btrfs_submit_bio+0x7d/0x150 [btrfs]
btrfs_submit_chunk+0x1a1/0x6d0 [btrfs]
? lockdep_hardirqs_on+0x74/0x100
? __folio_start_writeback+0x10/0x2c0
btrfs_submit_bbio+0x1c/0x40 [btrfs]
submit_one_bio+0x44/0x60 [btrfs]
submit_extent_folio+0x13f/0x330 [btrfs]
? btrfs_set_range_writeback+0xa3/0xd0 [btrfs]
extent_writepage_io+0x18b/0x360 [btrfs]
extent_write_locked_range+0x17c/0x340 [btrfs]
? __pfx_end_bbio_data_write+0x10/0x10 [btrfs]
run_delalloc_cow+0x71/0xd0 [btrfs]
btrfs_run_delalloc_range+0x176/0x500 [btrfs]
? find_lock_delalloc_range+0x119/0x260 [btrfs]
writepage_delalloc+0x2ab/0x480 [btrfs]
extent_write_cache_pages+0x236/0x7d0 [btrfs]
btrfs_writepages+0x72/0x130 [btrfs]
do_writepages+0xd4/0x240
? find_held_lock+0x2b/0x80
? wbc_attach_and_unlock_inode+0x12c/0x290
? wbc_attach_and_unlock_inode+0x12c/0x29
---truncated---
Exploit prediction scoring system (EPSS) score
EPSS Score 0.0
EPSS Ranking 4.8%
CVSS Severity
CVSS v3 Score 5.5
Products affected by CVE-2024-50225
-
cpe:2.3:o:linux:linux_kernel:6.10
-
cpe:2.3:o:linux:linux_kernel:6.10.0
-
cpe:2.3:o:linux:linux_kernel:6.10.1
-
cpe:2.3:o:linux:linux_kernel:6.10.10
-
cpe:2.3:o:linux:linux_kernel:6.10.11
-
cpe:2.3:o:linux:linux_kernel:6.10.12
-
cpe:2.3:o:linux:linux_kernel:6.10.13
-
cpe:2.3:o:linux:linux_kernel:6.10.14
-
cpe:2.3:o:linux:linux_kernel:6.10.2
-
cpe:2.3:o:linux:linux_kernel:6.10.3
-
cpe:2.3:o:linux:linux_kernel:6.10.4
-
cpe:2.3:o:linux:linux_kernel:6.10.5
-
cpe:2.3:o:linux:linux_kernel:6.10.6
-
cpe:2.3:o:linux:linux_kernel:6.10.7
-
cpe:2.3:o:linux:linux_kernel:6.10.8
-
cpe:2.3:o:linux:linux_kernel:6.10.9
-
cpe:2.3:o:linux:linux_kernel:6.11
-
cpe:2.3:o:linux:linux_kernel:6.11.1
-
cpe:2.3:o:linux:linux_kernel:6.11.2
-
cpe:2.3:o:linux:linux_kernel:6.11.3
-
cpe:2.3:o:linux:linux_kernel:6.11.4
-
cpe:2.3:o:linux:linux_kernel:6.11.5
-
cpe:2.3:o:linux:linux_kernel:6.11.6
-
cpe:2.3:o:linux:linux_kernel:6.12
-
cpe:2.3:o:linux:linux_kernel:6.3
-
cpe:2.3:o:linux:linux_kernel:6.3.1
-
cpe:2.3:o:linux:linux_kernel:6.3.10
-
cpe:2.3:o:linux:linux_kernel:6.3.11
-
cpe:2.3:o:linux:linux_kernel:6.3.12
-
cpe:2.3:o:linux:linux_kernel:6.3.13
-
cpe:2.3:o:linux:linux_kernel:6.3.2
-
cpe:2.3:o:linux:linux_kernel:6.3.3
-
cpe:2.3:o:linux:linux_kernel:6.3.4
-
cpe:2.3:o:linux:linux_kernel:6.3.5
-
cpe:2.3:o:linux:linux_kernel:6.3.6
-
cpe:2.3:o:linux:linux_kernel:6.3.7
-
cpe:2.3:o:linux:linux_kernel:6.3.8
-
cpe:2.3:o:linux:linux_kernel:6.3.9
-
cpe:2.3:o:linux:linux_kernel:6.4
-
cpe:2.3:o:linux:linux_kernel:6.4.1
-
cpe:2.3:o:linux:linux_kernel:6.4.10
-
cpe:2.3:o:linux:linux_kernel:6.4.11
-
cpe:2.3:o:linux:linux_kernel:6.4.12
-
cpe:2.3:o:linux:linux_kernel:6.4.13
-
cpe:2.3:o:linux:linux_kernel:6.4.14
-
cpe:2.3:o:linux:linux_kernel:6.4.15
-
cpe:2.3:o:linux:linux_kernel:6.4.16
-
cpe:2.3:o:linux:linux_kernel:6.4.2
-
cpe:2.3:o:linux:linux_kernel:6.4.3
-
cpe:2.3:o:linux:linux_kernel:6.4.4
-
cpe:2.3:o:linux:linux_kernel:6.4.5
-
cpe:2.3:o:linux:linux_kernel:6.4.6
-
cpe:2.3:o:linux:linux_kernel:6.4.7
-
cpe:2.3:o:linux:linux_kernel:6.4.8
-
cpe:2.3:o:linux:linux_kernel:6.4.9
-
cpe:2.3:o:linux:linux_kernel:6.5
-
cpe:2.3:o:linux:linux_kernel:6.5.1
-
cpe:2.3:o:linux:linux_kernel:6.5.10
-
cpe:2.3:o:linux:linux_kernel:6.5.11
-
cpe:2.3:o:linux:linux_kernel:6.5.12
-
cpe:2.3:o:linux:linux_kernel:6.5.13
-
cpe:2.3:o:linux:linux_kernel:6.5.2
-
cpe:2.3:o:linux:linux_kernel:6.5.3
-
cpe:2.3:o:linux:linux_kernel:6.5.4
-
cpe:2.3:o:linux:linux_kernel:6.5.5
-
cpe:2.3:o:linux:linux_kernel:6.5.6
-
cpe:2.3:o:linux:linux_kernel:6.5.7
-
cpe:2.3:o:linux:linux_kernel:6.5.8
-
cpe:2.3:o:linux:linux_kernel:6.5.9
-
cpe:2.3:o:linux:linux_kernel:6.6
-
cpe:2.3:o:linux:linux_kernel:6.6.1
-
cpe:2.3:o:linux:linux_kernel:6.6.10
-
cpe:2.3:o:linux:linux_kernel:6.6.100
-
cpe:2.3:o:linux:linux_kernel:6.6.101
-
cpe:2.3:o:linux:linux_kernel:6.6.102
-
cpe:2.3:o:linux:linux_kernel:6.6.103
-
cpe:2.3:o:linux:linux_kernel:6.6.104
-
cpe:2.3:o:linux:linux_kernel:6.6.105
-
cpe:2.3:o:linux:linux_kernel:6.6.106
-
cpe:2.3:o:linux:linux_kernel:6.6.107
-
cpe:2.3:o:linux:linux_kernel:6.6.108
-
cpe:2.3:o:linux:linux_kernel:6.6.109
-
cpe:2.3:o:linux:linux_kernel:6.6.11
-
cpe:2.3:o:linux:linux_kernel:6.6.110
-
cpe:2.3:o:linux:linux_kernel:6.6.111
-
cpe:2.3:o:linux:linux_kernel:6.6.112
-
cpe:2.3:o:linux:linux_kernel:6.6.113
-
cpe:2.3:o:linux:linux_kernel:6.6.114
-
cpe:2.3:o:linux:linux_kernel:6.6.115
-
cpe:2.3:o:linux:linux_kernel:6.6.116
-
cpe:2.3:o:linux:linux_kernel:6.6.117
-
cpe:2.3:o:linux:linux_kernel:6.6.118
-
cpe:2.3:o:linux:linux_kernel:6.6.119
-
cpe:2.3:o:linux:linux_kernel:6.6.12
-
cpe:2.3:o:linux:linux_kernel:6.6.120
-
cpe:2.3:o:linux:linux_kernel:6.6.121
-
cpe:2.3:o:linux:linux_kernel:6.6.122
-
cpe:2.3:o:linux:linux_kernel:6.6.123
-
cpe:2.3:o:linux:linux_kernel:6.6.124
-
cpe:2.3:o:linux:linux_kernel:6.6.125
-
cpe:2.3:o:linux:linux_kernel:6.6.127
-
cpe:2.3:o:linux:linux_kernel:6.6.128
-
cpe:2.3:o:linux:linux_kernel:6.6.129
-
cpe:2.3:o:linux:linux_kernel:6.6.13
-
cpe:2.3:o:linux:linux_kernel:6.6.130
-
cpe:2.3:o:linux:linux_kernel:6.6.131
-
cpe:2.3:o:linux:linux_kernel:6.6.135
-
cpe:2.3:o:linux:linux_kernel:6.6.136
-
cpe:2.3:o:linux:linux_kernel:6.6.14
-
cpe:2.3:o:linux:linux_kernel:6.6.15
-
cpe:2.3:o:linux:linux_kernel:6.6.16
-
cpe:2.3:o:linux:linux_kernel:6.6.17
-
cpe:2.3:o:linux:linux_kernel:6.6.18
-
cpe:2.3:o:linux:linux_kernel:6.6.19
-
cpe:2.3:o:linux:linux_kernel:6.6.2
-
cpe:2.3:o:linux:linux_kernel:6.6.20
-
cpe:2.3:o:linux:linux_kernel:6.6.21
-
cpe:2.3:o:linux:linux_kernel:6.6.22
-
cpe:2.3:o:linux:linux_kernel:6.6.23
-
cpe:2.3:o:linux:linux_kernel:6.6.24
-
cpe:2.3:o:linux:linux_kernel:6.6.25
-
cpe:2.3:o:linux:linux_kernel:6.6.26
-
cpe:2.3:o:linux:linux_kernel:6.6.27
-
cpe:2.3:o:linux:linux_kernel:6.6.28
-
cpe:2.3:o:linux:linux_kernel:6.6.29
-
cpe:2.3:o:linux:linux_kernel:6.6.3
-
cpe:2.3:o:linux:linux_kernel:6.6.30
-
cpe:2.3:o:linux:linux_kernel:6.6.31
-
cpe:2.3:o:linux:linux_kernel:6.6.32
-
cpe:2.3:o:linux:linux_kernel:6.6.33
-
cpe:2.3:o:linux:linux_kernel:6.6.34
-
cpe:2.3:o:linux:linux_kernel:6.6.35
-
cpe:2.3:o:linux:linux_kernel:6.6.36
-
cpe:2.3:o:linux:linux_kernel:6.6.37
-
cpe:2.3:o:linux:linux_kernel:6.6.38
-
cpe:2.3:o:linux:linux_kernel:6.6.39
-
cpe:2.3:o:linux:linux_kernel:6.6.4
-
cpe:2.3:o:linux:linux_kernel:6.6.40
-
cpe:2.3:o:linux:linux_kernel:6.6.41
-
cpe:2.3:o:linux:linux_kernel:6.6.42
-
cpe:2.3:o:linux:linux_kernel:6.6.43
-
cpe:2.3:o:linux:linux_kernel:6.6.44
-
cpe:2.3:o:linux:linux_kernel:6.6.45
-
cpe:2.3:o:linux:linux_kernel:6.6.46
-
cpe:2.3:o:linux:linux_kernel:6.6.47
-
cpe:2.3:o:linux:linux_kernel:6.6.48
-
cpe:2.3:o:linux:linux_kernel:6.6.49
-
cpe:2.3:o:linux:linux_kernel:6.6.5
-
cpe:2.3:o:linux:linux_kernel:6.6.50
-
cpe:2.3:o:linux:linux_kernel:6.6.51
-
cpe:2.3:o:linux:linux_kernel:6.6.52
-
cpe:2.3:o:linux:linux_kernel:6.6.53
-
cpe:2.3:o:linux:linux_kernel:6.6.54
-
cpe:2.3:o:linux:linux_kernel:6.6.55
-
cpe:2.3:o:linux:linux_kernel:6.6.56
-
cpe:2.3:o:linux:linux_kernel:6.6.57
-
cpe:2.3:o:linux:linux_kernel:6.6.58
-
cpe:2.3:o:linux:linux_kernel:6.6.59
-
cpe:2.3:o:linux:linux_kernel:6.6.6
-
cpe:2.3:o:linux:linux_kernel:6.6.60
-
cpe:2.3:o:linux:linux_kernel:6.6.61
-
cpe:2.3:o:linux:linux_kernel:6.6.62
-
cpe:2.3:o:linux:linux_kernel:6.6.63
-
cpe:2.3:o:linux:linux_kernel:6.6.64
-
cpe:2.3:o:linux:linux_kernel:6.6.65
-
cpe:2.3:o:linux:linux_kernel:6.6.66
-
cpe:2.3:o:linux:linux_kernel:6.6.67
-
cpe:2.3:o:linux:linux_kernel:6.6.68
-
cpe:2.3:o:linux:linux_kernel:6.6.69
-
cpe:2.3:o:linux:linux_kernel:6.6.7
-
cpe:2.3:o:linux:linux_kernel:6.6.70
-
cpe:2.3:o:linux:linux_kernel:6.6.71
-
cpe:2.3:o:linux:linux_kernel:6.6.72
-
cpe:2.3:o:linux:linux_kernel:6.6.73
-
cpe:2.3:o:linux:linux_kernel:6.6.74
-
cpe:2.3:o:linux:linux_kernel:6.6.75
-
cpe:2.3:o:linux:linux_kernel:6.6.76
-
cpe:2.3:o:linux:linux_kernel:6.6.77
-
cpe:2.3:o:linux:linux_kernel:6.6.78
-
cpe:2.3:o:linux:linux_kernel:6.6.79
-
cpe:2.3:o:linux:linux_kernel:6.6.8
-
cpe:2.3:o:linux:linux_kernel:6.6.80
-
cpe:2.3:o:linux:linux_kernel:6.6.81
-
cpe:2.3:o:linux:linux_kernel:6.6.82
-
cpe:2.3:o:linux:linux_kernel:6.6.83
-
cpe:2.3:o:linux:linux_kernel:6.6.84
-
cpe:2.3:o:linux:linux_kernel:6.6.85
-
cpe:2.3:o:linux:linux_kernel:6.6.86
-
cpe:2.3:o:linux:linux_kernel:6.6.87
-
cpe:2.3:o:linux:linux_kernel:6.6.88
-
cpe:2.3:o:linux:linux_kernel:6.6.89
-
cpe:2.3:o:linux:linux_kernel:6.6.9
-
cpe:2.3:o:linux:linux_kernel:6.6.90
-
cpe:2.3:o:linux:linux_kernel:6.6.91
-
cpe:2.3:o:linux:linux_kernel:6.6.92
-
cpe:2.3:o:linux:linux_kernel:6.6.93
-
cpe:2.3:o:linux:linux_kernel:6.6.94
-
cpe:2.3:o:linux:linux_kernel:6.6.95
-
cpe:2.3:o:linux:linux_kernel:6.6.96
-
cpe:2.3:o:linux:linux_kernel:6.6.97
-
cpe:2.3:o:linux:linux_kernel:6.6.98
-
cpe:2.3:o:linux:linux_kernel:6.6.99
-
cpe:2.3:o:linux:linux_kernel:6.7
-
cpe:2.3:o:linux:linux_kernel:6.7.1
-
cpe:2.3:o:linux:linux_kernel:6.7.10
-
cpe:2.3:o:linux:linux_kernel:6.7.11
-
cpe:2.3:o:linux:linux_kernel:6.7.12
-
cpe:2.3:o:linux:linux_kernel:6.7.2
-
cpe:2.3:o:linux:linux_kernel:6.7.3
-
cpe:2.3:o:linux:linux_kernel:6.7.4
-
cpe:2.3:o:linux:linux_kernel:6.7.5
-
cpe:2.3:o:linux:linux_kernel:6.7.6
-
cpe:2.3:o:linux:linux_kernel:6.7.7
-
cpe:2.3:o:linux:linux_kernel:6.7.8
-
cpe:2.3:o:linux:linux_kernel:6.7.9
-
cpe:2.3:o:linux:linux_kernel:6.8
-
cpe:2.3:o:linux:linux_kernel:6.8.1
-
cpe:2.3:o:linux:linux_kernel:6.8.10
-
cpe:2.3:o:linux:linux_kernel:6.8.11
-
cpe:2.3:o:linux:linux_kernel:6.8.12
-
cpe:2.3:o:linux:linux_kernel:6.8.2
-
cpe:2.3:o:linux:linux_kernel:6.8.3
-
cpe:2.3:o:linux:linux_kernel:6.8.4
-
cpe:2.3:o:linux:linux_kernel:6.8.5
-
cpe:2.3:o:linux:linux_kernel:6.8.6
-
cpe:2.3:o:linux:linux_kernel:6.8.7
-
cpe:2.3:o:linux:linux_kernel:6.8.8
-
cpe:2.3:o:linux:linux_kernel:6.8.9
-
cpe:2.3:o:linux:linux_kernel:6.9
-
cpe:2.3:o:linux:linux_kernel:6.9.1
-
cpe:2.3:o:linux:linux_kernel:6.9.10
-
cpe:2.3:o:linux:linux_kernel:6.9.11
-
cpe:2.3:o:linux:linux_kernel:6.9.12
-
cpe:2.3:o:linux:linux_kernel:6.9.2
-
cpe:2.3:o:linux:linux_kernel:6.9.3
-
cpe:2.3:o:linux:linux_kernel:6.9.4
-
cpe:2.3:o:linux:linux_kernel:6.9.5
-
cpe:2.3:o:linux:linux_kernel:6.9.6
-
cpe:2.3:o:linux:linux_kernel:6.9.7
-
cpe:2.3:o:linux:linux_kernel:6.9.8
-
cpe:2.3:o:linux:linux_kernel:6.9.9