CVE-2026-98959
>_ Opis
Tłumaczenie automatyczne – może zawierać nieścisłości.
W jądrze Linuksa usunięto następującą lukę:
btrfs: napraw xattr zamień, gdy wiele xattr jest spakowanych w tym samym elemencie
Jeśli mamy element btrfs_dir_item, który zawiera wiele xattr, a następnie my
zamień wartość jednego z nich (rodziną wywołań systemowych setxattr(2))
z inną wartością o innym rozmiarze, ostatecznie nie mamy w pełni
zainicjowano btrfs_dir_item, co spowodowało uszkodzenie drzewa
moduł sprawdzający wykryje czas zapisu zwrotnego bufora zakresu.
Dzieje się tak, ponieważ w btrfs_setxattr() znajdziemy btrfs_dir_item z
wiele xattrs (ze względu na to, że skrót crc32c ich nazwy jest taki sam)
usuwamy jeden z elementów xattr (btrfs_dir_item), a następnie wstawiamy nowy
jeden, ale usunięcie i wstawienie skutkuje przesunięciem istniejących danych
liść i dlatego nowa wartość xattr ma inny rozmiar,
nowy btrfs_dir_item jest umieszczany w sekcji liścia, której nie było
zainicjowany, a my jedynie kopiujemy dane wartości i ustawiamy długość wartości
w nowym btrfs_dir_item, bez ustawiania nazwy, długość nazwy,
klucz (który dla xattrs musi składać się wyłącznie z zer), flagi (BTRFS_FT_XATTR) i
identyfikator transakcji.
Poniższy skrypt odtwarza problem:
$ test kota.sh
#!/bin/bash
DEV=/dev/sdi
MNT=/mnt/sdi
mkfs.btrfs -f $DEV
zamontuj $DEV $MNT
dotknij $MNT/plik testowy
# Dodaj dwa xattr, które na btrfs mają ten sam skrót (crc32c) dla swoich
# name i dlatego są spakowane w tym samym btrfs_dir_item.
setfattr -n użytkownik.foobar -v 123 $MNT/plik testowy
setfattr -n użytkownik.WvG1c1Td -v qwerty $MNT/plik testowy
# Sprawdź, czy xattrs są obecne.
echo "xattrs przed:"
getfattr --absolute-names --dump $MNT/plik testowy
# Teraz zamień wartość foobar xattr na znacznie większą
# wartość.
setfattr -n użytkownik.foobar -v abcdefghijklmnopqrstuvwxyz $MNT/plik testowy
# Sprawdź, czy xattrs mają oczekiwane wartości.
echo "xattrs po:"
getfattr --absolute-names --dump $MNT/plik testowy
kwota $MNT
Uruchamianie:
$ ./test.sh
(...)
xattrs wcześniej:
# plik: /mnt/sdi/testfile
użytkownik.WvG1c1Td="qwerty"
użytkownik.foobar="123"
xattrs po:
# plik: /mnt/sdi/testfile
użytkownik.WvG1c1Td="qwerty"
Zatem brakuje xattr „user.foobar” i nastąpiło przerwanie transakcji
podczas odmontowywania fs z następującymi śladami w dmesg:
$dmesg
[869800.159271] Ostrzeżenie BTRFS (urządzenie sdi): dostęp do eb bytenr 30474240 len 16384 początek poza zakresem 16015 len 25964
[869800.159293] -------[wytnij tutaj]------------
[869800.159296] OSTRZEŻENIE: fs/btrfs/extent_io.c:4408 w report_eb_range+0x44/0x60 [btrfs], CPU#8: getfattr/2605179
[869800.168961] Moduły powiązane w: btrfs dm_thin_pool (...)
[869800.190527] Procesor: 8 UID: 0 PID: 2605179 Comm: getfattr Tainted: G W 7.3.0-rc3-btrfs-next-244+ #1 PREEMPT (pełny)
[869800.193726] Skażony: [W]=OSTRZEŻ
[869800.194502] Nazwa sprzętu: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.2-0-gea1b7a073390-prebuilt.qemu.org 01.04.2014
[869800.197576] RIP: 0010:report_eb_range+0x44/0x60 [btrfs]
[869800.198985] Kod: 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: 3ffffffffffffff
[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] Śledzenie połączeń:
[869800.234330] <ZADANIE>
[869800.234791] read_extent_buffer+0x4d/0x100 [btrfs]
[869800.235898] btrfs_listxattr+0x199/0x240 [btrfs]
[869800.236912] vfs_listxattr+0x51/0
---obcięty---
>_ Referencje
- https://git.kernel.org/stable/c/5877d7138cc4359d26fd7b010eedfd1b3162348f
- https://git.kernel.org/stable/c/7a53bb4668b319fc6c8a3ce2c21635125c7d2712
- https://git.kernel.org/stable/c/858bee1c77857aabcc2327cd32dd8266332de332
- https://git.kernel.org/stable/c/a97114b9b00ed3d05156f3b2ddbf797296260389
- https://git.kernel.org/stable/c/c1803697a60f22743aa28ad522f805e92d45e3f0
Dane podatności pochodzą z oficjalnych źródeł (CVE® List / NVD). Opisy po polsku są tłumaczone automatycznie i mogą zawierać nieścisłości – na stronie rekordu można wyświetlić wersję angielską.
This product uses the NVD API but is not endorsed or certified by the NVD.
Copyright © 1999–2026, The MITRE Corporation. CVE is a registered trademark and the CVE logo is a registered trademark of The MITRE Corporation.
CVE Usage: MITRE hereby grants you a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Common Vulnerabilities and Exposures (CVE®). Any copy you make for such purposes is authorized provided that you reproduce MITRE's copyright designation and this license in any such copy. ALL DOCUMENTS AND THE INFORMATION CONTAINED THEREIN PROVIDED BY MITRE ARE PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND.
NVD Terms of Use / CVE® Terms of Use / nvd.nist.gov / cve.org