CVE-2026-98959
CriticalCVSS 9.8Exploitation Probability (EPSS)
Low risk10th percentile - higher than 10% of all known CVEs
Summary
In the Linux kernel, a bug in btrfs occurs when replacing the value of an extended attribute (xattr) if multiple xattrs are packed into the same btrfs_dir_item. The new btrfs_dir_item is not fully initialized, leading to tree corruption detected by the tree checker during extent buffer writeback.
Risk Assessment
This can cause data loss (missing xattr entries), transaction aborts, and filesystem corruption on btrfs, affecting data integrity and service availability.
Recommendation
Update the Linux kernel to a version that includes the fix for CVE-2026-98959. Until then, avoid replacing xattr values on btrfs filesystems, especially when multiple xattrs share the same crc32c hash.
Other vulnerabilities in Linux kernel (btrfs)
See all- CVE-2026-98080Medium
In the Linux kernel, a bug in the btrfs subsystem forces unnecessary reloc root creation during snapshot creation when qgroups (quota) are enabled. This triggers a kernel warning in lookup_inline_extent_backref and flips the filesystem to read-only mode. The issue is reproducible during balance/relocate operations on a btrfs filesystem with quota enabled.
- CVE-2026-93800Low risk· EPSS 5%
In the Linux kernel's btrfs subsystem, a use-after-free vulnerability exists related to relocation operations. When insert_dirty_subvol() fails, a root's reloc_root field remains pointing to a freed reloc root instead of being set to NULL, leading to a use-after-free or double free during filesystem unmount.
- CVE-2026-93255Low risk· EPSS 9%
In the Linux kernel, a race condition exists in the btrfs subsystem between the thread finishing an extent buffer read and the thread unmounting the filesystem. The EXTENT_BUFFER_READING flag is not cleared within the same critical section as the reference count decrement, leading to false warnings in invalidate_and_check_btree_folios(). The fix introduces a helper free_extent_buffer_clear_reading() and synchronization on refs_lock.
- CVE-2026-90265Low risk· EPSS 10%
A deadlock exists in the Linux kernel's btrfs filesystem during file defragmentation when autodefrag is enabled. Defrag reserves delalloc space while holding dirty and locked folios plus the extent range lock, causing kernel tasks (btrfs-cleaner, writeback, metadata reclaim) to block each other.
- CVE-2026-89772Low risk· EPSS 9%
A flaw was found in the Linux kernel btrfs subsystem where write-protection of folios during data writeback was lost. A code change replaced folio_clear_dirty_for_io() with a plain folio_test_dirty() check, allowing a process with an mmap-ed file to modify sectors while writeback is in progress. This can cause checksum corruption, lost writes, and data corruption for compressed or inline extents.
- CVE-2023-3111High
A use after free vulnerability was found in prepare_to_relocate in fs/btrfs/relocation.c in the Linux Kernel. This possible flaw can be triggered by calling btrfs_ioctl_balance() before calling btrfs_ioctl_defrag().
Original NVD description (English source)
In the Linux kernel, the following vulnerability has been resolved: btrfs: fix xattr replace when multiple xattrs are packed in the same item If we have a btrfs_dir_item item that packs multiple xattrs and then we replace the value of one of them (with the setxattr(2) family of syscalls) with another value of a different size, we end up not having a fully initialized btrfs_dir_item, resulting in a corruption that the tree checker will detect at extent buffer writeback time. This is because in btrfs_setxattr() when we find a btrfs_dir_item with multiple xattrs (due to the crc32c hash of their name being the same) we delete one of the xattr items (btrfs_dir_item) and then insert a new one, but the deletion and insertion results in shifting existing data in the leaf and therefore when the new value of a xattr has a different size, the new btrfs_dir_item is placed in a leaf section that was not initialized and we only copy the value's data and set the value's length in the new btrfs_dir_item, without setting the name, the name's length, the key (which must be all zeroes for xattrs), flags (BTRFS_FT_XATTR) and transaction ID. The following script reproduces the issue: $ cat test.sh #!/bin/bash DEV=/dev/sdi MNT=/mnt/sdi mkfs.btrfs -f $DEV mount $DEV $MNT touch $MNT/testfile # Add two xattrs that, on btrfs, have the same hash (crc32c) for their # name and therefore are packed into the same btrfs_dir_item. setfattr -n user.foobar -v 123 $MNT/testfile setfattr -n user.WvG1c1Td -v qwerty $MNT/testfile # Verify the xattrs are present. echo "xattrs before:" getfattr --absolute-names --dump $MNT/testfile # Now replace the value of the foobar xattr with a significantly larger # value. setfattr -n user.foobar -v abcdefghijklmnopqrstuvwxyz $MNT/testfile # Check the xattrs have the expected values. echo "xattrs after:" getfattr --absolute-names --dump $MNT/testfile umount $MNT Running it: $ ./test.sh (...) xattrs before: # file: /mnt/sdi/testfile user.WvG1c1Td="qwerty" user.foobar="123" xattrs after: # file: /mnt/sdi/testfile user.WvG1c1Td="qwerty" So the "user.foobar" xattr is missing and there was a transaction abort when unmounting the fs with the following traces in dmesg: $ dmesg [869800.159271] BTRFS warning (device sdi): access to eb bytenr 30474240 len 16384 out of range start 16015 len 25964 [869800.159293] ------------[ cut here ]------------ [869800.159296] WARNING: fs/btrfs/extent_io.c:4408 at report_eb_range+0x44/0x60 [btrfs], CPU#8: getfattr/2605179 [869800.168961] Modules linked in: btrfs dm_thin_pool (...) [869800.190527] CPU: 8 UID: 0 PID: 2605179 Comm: getfattr Tainted: G W 7.3.0-rc3-btrfs-next-244+ #1 PREEMPT(full) [869800.193726] Tainted: [W]=WARN [869800.194502] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.2-0-gea1b7a073390-prebuilt.qemu.org 04/01/2014 [869800.197576] RIP: 0010:report_eb_range+0x44/0x60 [btrfs] [869800.198985] Code: 48 8b 7b 18 (...) [869800.203531] RSP: 0018:ffffce4541937d58 EFLAGS: 00010246 [869800.204609] RAX: 0000000000000000 RBX: ffff8dde054b8738 RCX: 0000000000000000 [869800.206137] RDX: 0000000000000000 RSI: 0000000000000001 RDI: ffffffffc04c92a0 [869800.207645] RBP: 0000000000003e8f R08: 0000000000000000 R09: 3fffffffffefffff [869800.226175] R10: ffffce4541937a88 R11: 0000000000000003 R12: 000000000000656c [869800.227594] R13: ffff8dde14be800f R14: 000000000000656c R15: 0000000000000069 [869800.229097] FS: 00007f59023bb780(0000) GS:ffff8de5788ed000(0000) knlGS:0000000000000000 [869800.231137] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [869800.232321] CR2: 0000558dc45e6a78 CR3: 0000000765b16004 CR4: 0000000000370ef0 [869800.233783] Call Trace: [869800.234330] <TASK> [869800.234791] read_extent_buffer+0x4d/0x100 [btrfs] [869800.235898] btrfs_listxattr+0x199/0x240 [btrfs] [869800.236912] vfs_listxattr+0x51/0 ---truncated---
Vulnerability data from NVD (NIST) · CISA KEV · EPSS

