CVE-2026-97549
>_ Opis
Tłumaczenie automatyczne – może zawierać nieścisłości.
W jądrze Linuksa usunięto następującą lukę:
xfs: naprawiono niedostateczną rezerwację bloków podczas naprawy katalogów sf
Podczas uruchamiania kontroli jakości na XFS for-next od wersji 7.3-rc2 z MKFS_OPTIONS="-n
size=8192”, zaobserwowałem następującą (przyciętą) ikonę dmesg:
XFS: Asercja nie powiodła się: args->total >= dp->i_nblocks - nblks, plik: fs/xfs/libxfs/xfs_da_btree.c, linia: 2387
OSTRZEŻENIE: fs/xfs/xfs_message.c:104 w assfail+0x46/0x4a [xfs], CPU#0: xfs_scrub/1426511
Procesor: 0 UID: 0 PID: 1426511 Comm: xfs_scrub Tainted: G W 7.3.0-rc2-djwx #rc2 PREEMPT(lazy) 6e418570b606a39783b0e7e7b30dc407b965f9e8
Skażony: [W]=OSTRZEŻ
RIP: 0010:awaria ataku+0x46/0x4a [xfs]
RSP: 0018:ffffc900010d7890 EFLAGS: 00010246
RAX: 0000000000000000 RBX: 0000000000000000 RCX: 00000000ffffffd1
RDX: 0000000000000000 RSI: 0000000000000021 RDI: ffffffffa059fd38
RBP: 0000000000000002 R08: 0000000000000000 R09: 0000000000000000
R10: 000000000000000a R11: 000000007ffffffff R12: ffffc900010d7940
R13: ffff888368d8f980 R14: ffffc900010d7a48 R15: ffffc900010d78d0
FS: 00007f445c5ce680(0000) GS:ffff8884a97ea000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 00007f443803b9a8 CR3: 0000000107a4b000 CR4: 00000000003506f0
Zadzwoń do śledzenia:
<ZADANIE>
xfs_da_grow_inode_int+0x2e0/0x300 [xfs 5de2257e14108c136f11317e6bbb8ac77efd392c]
xfs_dir2_grow_inode+0x6e/0x150 [xfs 5de2257e14108c136f11317e6bbb8ac77efd392c]
xfs_dir2_sf_to_block+0x149/0x870 [xfs 5de2257e14108c136f11317e6bbb8ac77efd392c]
xrep_dir_swap_prep+0xe2/0x110 [xfs 5de2257e14108c136f11317e6bbb8ac77efd392c]
xrep_dir_swap+0xfb/0x2f0 [xfs 5de2257e14108c136f11317e6bbb8ac77efd392c]
xrep_dir_rebuild_tree+0x99/0x100 [xfs 5de2257e14108c136f11317e6bbb8ac77efd392c]
katalog_xrep+0x83/0x1c0 [xfs 5de2257e14108c136f11317e6bbb8ac77efd392c]
xrep_attempt+0x4f/0x1e0 [xfs 5de2257e14108c136f11317e6bbb8ac77efd392c]
xfs_scrub_metadata+0x393/0x5b0 [xfs 5de2257e14108c136f11317e6bbb8ac77efd392c]
xfs_ioc_scrubv_metadata+0x306/0x570 [xfs 5de2257e14108c136f11317e6bbb8ac77efd392c]
xfs_file_ioctl+0xa4f/0x1150 [xfs 5de2257e14108c136f11317e6bbb8ac77efd392c]
__x64_sys_ioctl+0x76/0xc0
do_syscall_64+0x7a/0x3b0
wpis_SYSCALL_64_after_hwframe+0x4b/0x53
Jest to konsekwencja zatwierdzenia 0fe77e57588b98, które dodało
następujące stwierdzenie do xfs_da_grow_inode_int:
ASSERT(args->total >= dp->i_nblocks - nblks);
Śledząc to z powrotem do xrep_dir_swap_prep, zauważyłem, że xfs_da_args
obiekt przekazany do xfs_dir2_sf_to_block ustawia argumenty->total na 1.
Jest to nieprawidłowe, ponieważ mkfs ustawił rozmiar bloku katalogu na 8k i
rozmiar bloku systemu plików na 4k. Innymi słowy, argumenty->total powinny być
2 tutaj, a nie 1.
Dave Chinner potknął się o ten sam problem przy tej samej gałęzi
inny kanał — jego konfiguracja testowa ustawiła rozmiar bloku fs na 1k, cale
w takim przypadku rozmiar bloku katalogu jest nadal ustawiony na 4k. Tutaj,
argumenty-> suma powinna wynosić 4.
Zmiana przypisania args->total do sc->mp->m_dir_geo->fsbcount
powoduje, że to twierdzenie znika, ale nie jest to całkowite rozwiązanie. w
xrep_tempexch_estimate, błędnie zakładamy również, że jest to skrót
konwersja wymaga 1 fsblock, gdy powinno być m_dir_geo->fsbcount.
Bez tego możemy za mało zarezerwować miejsce w transakcji i spowodować:
zamknięcie systemu plików.
Zauważ, że pomocnik xfs_dabuf_nfsb obliczy poprawną wartość dla
katalogi i xattr, więc używamy tego zamiast otwartego kodowania logiki.
Napraw także xrep_xattr_swap_prep, aby przypisać argumenty->total przez xfs_dabuf_nfsb
aby uniknąć jednej bomby logicznej, jeśli kiedykolwiek będziemy obsługiwać atrybuty multi-fsblock.
Potknął się: 0fe77e57588b98 („xfs: potwierdź, że rezerwacja obejmuje każdy wzrost da fork”)
>_ Referencje
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