CVE-2023-53538
Severity CVSS v4.0:
Pending analysis
Type:
Unavailable / Other
Publication date:
04/10/2025
Last modified:
06/10/2025
Description
In the Linux kernel, the following vulnerability has been resolved:<br />
<br />
btrfs: insert tree mod log move in push_node_left<br />
<br />
There is a fairly unlikely race condition in tree mod log rewind that<br />
can result in a kernel panic which has the following trace:<br />
<br />
[530.569] BTRFS critical (device sda3): unable to find logical 0 length 4096<br />
[530.585] BTRFS critical (device sda3): unable to find logical 0 length 4096<br />
[530.602] BUG: kernel NULL pointer dereference, address: 0000000000000002<br />
[530.618] #PF: supervisor read access in kernel mode<br />
[530.629] #PF: error_code(0x0000) - not-present page<br />
[530.641] PGD 0 P4D 0<br />
[530.647] Oops: 0000 [#1] SMP<br />
[530.654] CPU: 30 PID: 398973 Comm: below Kdump: loaded Tainted: G S O K 5.12.0-0_fbk13_clang_7455_gb24de3bdb045 #1<br />
[530.680] Hardware name: Quanta Mono Lake-M.2 SATA 1HY9U9Z001G/Mono Lake-M.2 SATA, BIOS F20_3A15 08/16/2017<br />
[530.703] RIP: 0010:__btrfs_map_block+0xaa/0xd00<br />
[530.755] RSP: 0018:ffffc9002c2f7600 EFLAGS: 00010246<br />
[530.767] RAX: ffffffffffffffea RBX: ffff888292e41000 RCX: f2702d8b8be15100<br />
[530.784] RDX: ffff88885fda6fb8 RSI: ffff88885fd973c8 RDI: ffff88885fd973c8<br />
[530.800] RBP: ffff888292e410d0 R08: ffffffff82fd7fd0 R09: 00000000fffeffff<br />
[530.816] R10: ffffffff82e57fd0 R11: ffffffff82e57d70 R12: 0000000000000000<br />
[530.832] R13: 0000000000001000 R14: 0000000000001000 R15: ffffc9002c2f76f0<br />
[530.848] FS: 00007f38d64af000(0000) GS:ffff88885fd80000(0000) knlGS:0000000000000000<br />
[530.866] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033<br />
[530.880] CR2: 0000000000000002 CR3: 00000002b6770004 CR4: 00000000003706e0<br />
[530.896] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000<br />
[530.912] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400<br />
[530.928] Call Trace:<br />
[530.934] ? btrfs_printk+0x13b/0x18c<br />
[530.943] ? btrfs_bio_counter_inc_blocked+0x3d/0x130<br />
[530.955] btrfs_map_bio+0x75/0x330<br />
[530.963] ? kmem_cache_alloc+0x12a/0x2d0<br />
[530.973] ? btrfs_submit_metadata_bio+0x63/0x100<br />
[530.984] btrfs_submit_metadata_bio+0xa4/0x100<br />
[530.995] submit_extent_page+0x30f/0x360<br />
[531.004] read_extent_buffer_pages+0x49e/0x6d0<br />
[531.015] ? submit_extent_page+0x360/0x360<br />
[531.025] btree_read_extent_buffer_pages+0x5f/0x150<br />
[531.037] read_tree_block+0x37/0x60<br />
[531.046] read_block_for_search+0x18b/0x410<br />
[531.056] btrfs_search_old_slot+0x198/0x2f0<br />
[531.066] resolve_indirect_ref+0xfe/0x6f0<br />
[531.076] ? ulist_alloc+0x31/0x60<br />
[531.084] ? kmem_cache_alloc_trace+0x12e/0x2b0<br />
[531.095] find_parent_nodes+0x720/0x1830<br />
[531.105] ? ulist_alloc+0x10/0x60<br />
[531.113] iterate_extent_inodes+0xea/0x370<br />
[531.123] ? btrfs_previous_extent_item+0x8f/0x110<br />
[531.134] ? btrfs_search_path_in_tree+0x240/0x240<br />
[531.146] iterate_inodes_from_logical+0x98/0xd0<br />
[531.157] ? btrfs_search_path_in_tree+0x240/0x240<br />
[531.168] btrfs_ioctl_logical_to_ino+0xd9/0x180<br />
[531.179] btrfs_ioctl+0xe2/0x2eb0<br />
<br />
This occurs when logical inode resolution takes a tree mod log sequence<br />
number, and then while backref walking hits a rewind on a busy node<br />
which has the following sequence of tree mod log operations (numbers<br />
filled in from a specific example, but they are somewhat arbitrary)<br />
<br />
REMOVE_WHILE_FREEING slot 532<br />
REMOVE_WHILE_FREEING slot 531<br />
REMOVE_WHILE_FREEING slot 530<br />
...<br />
REMOVE_WHILE_FREEING slot 0<br />
REMOVE slot 455<br />
REMOVE slot 454<br />
REMOVE slot 453<br />
...<br />
REMOVE slot 0<br />
ADD slot 455<br />
ADD slot 454<br />
ADD slot 453<br />
...<br />
ADD slot 0<br />
MOVE src slot 0 -> dst slot 456 nritems 533<br />
REMOVE slot 455<br />
REMOVE slot 454<br />
REMOVE slot 453<br />
...<br />
REMOVE slot 0<br />
<br />
When this sequence gets applied via btrfs_tree_mod_log_rewind, it<br />
allocates a fresh rewind eb, and first inserts the correct key info for<br />
the 533 elements, then overwrites the first 456 of them, then decrements<br />
the count by 456 via the add ops, then rewinds the move by doing a<br />
memmove from 456:988->0:532. We have never written anything past 532,<br />
---truncated---



