CVE-2025-21658 Information
Description
In the Linux kernel the following vulnerability has been resolved:
btrfs: avoid NULL pointer dereference if no valid extent tree
[BUG] Syzbot reported a crash with the following call trace:
BTRFS info (device loop0): scrub: started on devid 1
BUG: kernel NULL pointer dereference address: 0000000000000208
PF: supervisor read access in kernel mode
PF: error_code(0x0000) - not-present page
PGD 106e70067 P4D 106e70067 PUD 107143067 PMD 0
Oops: Oops: 0000 [1] PREEMPT SMP NOPTI
CPU: 1 UID: 0 PID: 689 Comm: repro Kdump: loaded Tainted: G O 6.13.0-rc4-custom+ 206
Tainted: [O]=OOT_MODULE
Hardware name: QEMU Standard PC (Q35 + ICH9 2009) BIOS unknown 02/02/2022
RIP: 0010:find_first_extent_item+0x26/0x1f0 [btrfs]
Call Trace:
[CAUSE] The reproducer is using a corrupted image where extent tree root is corrupted thus forcing to use escue=allro\ mount option to mount the image.
Then it triggered a scrub but since scrub relies on extent tree to find where the data/metadata extents are scrub_find_fill_first_stripe() relies on an non-empty extent root.
But unfortunately scrub_find_fill_first_stripe() doesn’t really expect an NULL pointer for extent root it use extent_root to grab fs_info and triggered a NULL pointer dereference.
[FIX] Add an extra check for a valid extent root at the beginning of scrub_find_fill_first_stripe().
The new error path is introduced by 42437a6386ff (trfs: introduce mount option rescue=ignorebadroots) but that’s pretty old and later commit b979547513ff (trfs: scrub: introduce helper to find and fill sector info for a scrub_stripe) changed how we do scrub.
So for kernels older than 6.6 the fix will need manual backport.
Reference
https://git.kernel.org/stable/c/24b85a8b0310e0144da9ab30be42e87e6476638a https://git.kernel.org/stable/c/6aecd91a5c5b68939cf4169e32bc49f3cd2dd329 https://git.kernel.org/stable/c/aee5f69f3e6cd82bfefaca1b70b40b6cd8f3f784
Share on: