CVE-2026-93800
Niskie ryzyko· EPSS 5%Prawdopodobieństwo exploitacji (EPSS)
Niskie ryzykoPercentyl 5 - wyżej niż 5% wszystkich znanych CVE
Streszczenie
W jądrze Linux w podsystemie btrfs występuje podatność use-after-free związana z operacją relokacji. Gdy funkcja insert_dirty_subvol() zwróci błąd, pole reloc_root korzenia pozostaje wskazaniem do zwolnionego obiektu reloc root zamiast zostać ustawione na NULL, co prowadzi do użycia zwolnionej pamięci lub podwójnego zwolnienia podczas odmontowywania systemu plików.
Ocena ryzyka
Podatność może prowadzić do uszkodzenia pamięci jądra, awarii systemu (panic) lub potencjalnego wykonania kodu w kontekście jądra. Wymaga jednak wystąpienia błędu podczas relokacji btrfs, co ogranicza możliwość wykorzystania.
Rekomendacja
Zaktualizuj jądro Linux do wersji zawierającej poprawkę dla CVE-2026-93800. Do czasu aktualizacji unikaj operacji balance/relokacji na systemach plików btrfs w środowiskach o krytycznym znaczeniu.
Inne podatności w Linux kernel (btrfs)
Zobacz wszystkie- CVE-2026-98080Nieznane
W jądrze Linux w podsystemie btrfs występuje błąd, który podczas tworzenia snapshotów z włączonymi qgroupami (quota) wymusza niepotrzebne tworzenie reloc root. Prowadzi to do ostrzeżenia jądra w funkcji lookup_inline_extent_backref i przełączenia systemu plików w tryb tylko do odczytu (RO). Problem ujawnia się m.in. podczas operacji balance/relocate na systemie plików btrfs z włączoną opcją quota.
- CVE-2026-93255Nieznane
W jądrze Linux w podsystemie btrfs występuje wyścig (race condition) między wątkiem kończącym odczyt extent buffera a wątkiem odmontowującym system plików. Flaga EXTENT_BUFFER_READING nie jest czyszczona w tej samej sekcji krytycznej co zmniejszanie liczby referencji, co prowadzi do fałszywych ostrzeżeń w invalidate_and_check_btree_folios(). Poprawka wprowadza funkcję pomocniczą free_extent_buffer_clear_reading() oraz synchronizację na refs_lock.
- CVE-2026-90265Nieznane
W jądrze Linux występuje zakleszczenie (deadlock) w systemie plików btrfs, do którego dochodzi podczas defragmentacji plików z włączoną opcją autodefrag. Defragmentacja rezerwuje miejsce delalloc, trzymając jednocześnie zablokowane i brudne folio oraz blokadę zakresu extentu, co prowadzi do wzajemnego zablokowania zadań jądra (btrfs-cleaner, writeback, reclaim metadanych).
- CVE-2026-89772Niskie ryzyko· EPSS 7%
W jądrze Linux w podsystemie btrfs wykryto błąd polegający na braku wczesnej ochrony przed zapisem (write-protect) stron pamięci (folios) podczas zapisu danych na dysk. Zmiana w kodzie zastąpiła wywołanie folio_clear_dirty_for_io() zwykłym sprawdzeniem folio_test_dirty(), przez co proces z zmapowanym plikiem (mmap) może modyfikować sektory w trakcie ich przetwarzania przez mechanizm writeback. Prowadzi to do uszkodzenia sum kontrolnych, utraty zapisanych danych, a w przypadku plików skompresowanych lub rozszerzonych do uszkodzenia danych.
- CVE-2023-3111Wysokie
W systemie Linux Kernel odkryto podatność typu use after free w funkcji prepare_to_relocate w pliku fs/btrfs/relocation.c. Możliwe jest wywołanie tej luki poprzez wywołanie btrfs_ioctl_balance() przed btrfs_ioctl_defrag().
Oryginalny opis (angielski, źródło NVD)
In the Linux kernel, the following vulnerability has been resolved: btrfs: fix use-after-free on reloc root after error in insert_dirty_subvol() If during relocation we fail in insert_dirty_subvol() because btrfs_update_reloc_root() returned an error, we will leave a root's reloc_root field pointing to a reloc root that was freed instead of NULL, resulting later in a use-after-free, or double free attempt during unmount. The sequence of steps is this: 1) During relocation the call to btrfs_update_reloc_root() in insert_dirty_subvol() fails, so insert_dirty_subvol() returns the error to merge_reloc_root() without adding the root to the list rc->dirty_subvol_roots; 2) Then merge_reloc_root() aborts the current transaction because insert_dirty_subvol() returned an error; 3) Up the call chain, merge_reloc_roots() gets the error, adds the reloc root for root X to the local reloc_roots list and jumps to the 'out' label, where it calls free_reloc_roots() to free all the reloc roots in the local reloc_roots list. This frees the reloc root for root X; 4) We go up the call chain to relocate_block_group() which calls clean_dirty_subvols() to go over dirty roots and set their ->reloc_root field to NULL, but root X is not in the dirty_subvol_roots list, so its ->reloc_root still points to a reloc root; 5) Relocation finishes, with an error and a transaction abort, but the ->reloc_root field for root X still points to the reloc root that was freed in step 3; 6) When unmounting the fs we end up calling: btrfs_free_fs_roots() btrfs_drop_and_free_fs_root() --> calls btrfs_put_root() against root X's ->reloc_root which is not NULL and points to the already freed reloc root in step 4 above Resulting in a use-after-free to a double free attempt. Syzbot reported this with the following dmesg/syslog: [ 106.004389][ T5339] BTRFS error (device loop0 state A): Transaction aborted (error -5) [ 106.014266][ T5339] BTRFS: error (device loop0 state A) in merge_reloc_root:1655: errno=-5 IO failure [ 106.021891][ T1061] BTRFS error (device loop0 state A): error while writing out transaction: -5 [ 106.026964][ T1061] BTRFS warning (device loop0 state A): Skipping commit of aborted transaction. [ 106.033807][ T5340] BTRFS error (device loop0 state A): bdev /dev/loop0 errs: wr 3, rd 0, flush 0, corrupt 0, gen 0 [ 106.039265][ T1061] BTRFS: error (device loop0 state A) in cleanup_transaction:2067: errno=-5 IO failure [ 106.044382][ T5339] BTRFS info (device loop0 state EA): forced readonly [ 106.074329][ T5339] BTRFS: error (device loop0 state EA) in merge_reloc_roots:1887: errno=-5 IO failure [ 106.081004][ T5356] BTRFS info (device loop0 state EA): scrub: started on devid 1 [ 106.085611][ T5339] BTRFS info (device loop0 state EA): balance: ended with status: -30 [ 106.089517][ T5356] BTRFS info (device loop0 state EA): scrub: not finished on devid 1 with status: -30 [ 106.662365][ T5338] BTRFS info (device loop0 state EA): last unmount of filesystem 3a375e4e-b156-4d76-a2ad-16e198ce1409 [ 106.682946][ T5338] ================================================================== [ 106.686574][ T5338] BUG: KASAN: slab-use-after-free in btrfs_put_root+0x2f/0x250 [ 106.690090][ T5338] Write of size 4 at addr ffff88803f978630 by task syz.0.0/5338 [ 106.693173][ T5338] [ 106.694279][ T5338] CPU: 0 UID: 0 PID: 5338 Comm: syz.0.0 Not tainted syzkaller #0 PREEMPT(full) [ 106.694293][ T5338] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2 04/01/2014 [ 106.694300][ T5338] Call Trace: [ 106.694308][ T5338] <TASK> [ 106.694314][ T5338] dump_stack_lvl+0xe8/0x150 [ 106.694331][ T5338] print_address_description+0x55/0x1e0 [ 106.694343][ T5338] ? btrfs_put_root+0x2f/0x250 [ 106.694358][ T5338] print_report+0x58/0x70 [ 106. ---truncated---
Dane podatności pochodzą z NVD (NIST) · CISA KEV · EPSS

