CVE-2026-89493
>_ Opis
Tłumaczenie automatyczne – może zawierać nieścisłości.
W jądrze Linuksa usunięto następującą lukę:
ocfs2: sprawdź poprawność rl_used względem rl_count w walidatorze bloku przeliczenia
ocfs2_find_refcount_rec_in_rl() przegląda tablicę rekordów refcount na dysku
z:
for (; i < le16_to_cpu(rb->rf_records.rl_used); i++) {
rec = &rb->rf_records.rl_recs[i];
...
rl_recs[] znajduje się w pojedynczym bloku metadanych (4096 bajtów w pliku Common
konfiguracja), więc jego rzeczywista pojemność jest ustalana przez
ocfs2_refcount_recs_per_rb(sb) (247 rekordów dla bloku 4K z
16-bajtowy ocfs2_refcount_rec). Zarówno rl_used, jak i rl_count są odczytywane bezpośrednio
wyłączone z dysku przez ocfs2_validate_refcount_block() i nigdy nie są sprawdzane
tej zdolności, ani przeciwko sobie, przed jakimkolwiek przeliczeniem/reflinkem/CoW
operacja chodzi po tablicy.
Stworzony (lub uszkodzony) blok przeliczenia z rl_used == 0xffff powoduje, że
pętla powyżej przejdź daleko poza koniec bloku, dereferując rl_recs[i]
dla i aż do 65534. Wynikowy indeks jest następnie przekazywany rodzeństwa
ocfs2_insert_refcount_rec(), której przesunięcie wstawiania powoduje:
if (indeks < le16_to_cpu(rf_list->rl_used))
memmove(&rf_list->rl_recs[indeks + 1],
&rf_list->rl_recs[indeks],
(le16_to_cpu(rf_list->rl_used) - indeks) *
sizeof(struct ocfs2_refcount_rec));
tj. memmove() o wielkości do (0xffff - indeks) * 16 bajtów (~1 MiB) z
przesunięte już za blok. Można to osiągnąć za pomocą zwykłego linku zwrotnego
(FICLONE) przeciwko spreparowanemu/uszkodzonemu obrazowi ocfs2: dołączanie zakresu
którego cpos sortuje każdy prawdziwy rekord w liściu, wymuszając wyszukiwanie
uciec do końca, zamiast wracać na początku meczu. Model napastnika
jest lokalny: CAP_SYS_ADMIN montuje spreparowany lub uszkodzony obraz ocfs2, lub a
surowy zapis na urządzeniu blokowym obsługującym już zamontowany system plików ocfs2.
ocfs2_validate_refcount_block() już sprawdza ECC bloku,
podpis, rf_blkno i rf_fs_generacja, ale nigdy rl_count/rl_used
względem rzeczywistej pojemności bloku na dysku. To jest ta sama klasa
luka, którą ocfs2_validate_extent_block() (fs/ocfs2/alloc.c) już zamyka
dla nagłówka listy rozszerzeń rodzeństwa, który sprawdza pojemność rekordów
i „used” powiązane przed jakimkolwiek kodem h_list.l_recs[]:
if (le16_to_cpu(eb->h_list.l_count) != ocfs2_extent_recs_per_eb(sb)) {
rc = ocfs2_error(...);
muszę wyjść za kaucją;
}
if (le16_to_cpu(eb->h_list.l_next_free_rec) >
le16_to_cpu(eb->h_list.l_count)) {
rc = ocfs2_error(...);
muszę wyjść za kaucją;
}
Dodaj równoważną parę kontroli do ocfs2_validate_refcount_block():
odrzuć blok refcount, którego rl_count nie pasuje do ustalonej liczby bloków
pojemność zwrócona przez ocfs2_refcount_recs_per_rb() i odrzuć rl_used >
rl_count. Obie kontrole są pomijane, gdy ustawiono OCFS2_REFCOUNT_TREE_FL,
ponieważ w tym przypadku te same bajty unii zawierają listę ocfs2_extent_list
(rf_list), a nie lista rekordów refcount (rf_records) - taki jest układ
już zweryfikowane oddzielnie przez ocfs2_validate_extent_block(), gdy
odczytywany jest odnośny blok zakresu. Odzwierciedla to istniejące
Strażnik „!(rb->rf_flags & OCFS2_REFCOUNT_TREE_FL)” używany gdzie indziej w tym
plik (np. ocfs2_get_refcount_rec()), aby zdecydować, czy rf_records czy
rf_list jest żywym członkiem związku.
Dzięki temu sfałszowany rl_used/rl_count zostaje złapany w bloku
czas sprawdzania poprawności (ocfs2_error()), spójny z każdym innym uszkodzeniem
sprawdź tę funkcję, zamiast wjeżdżać na aut z wczytaniem na aut
ocfs2_find_refcount_rec_in_rl() i kolejna memmove() poza zakresem
w ocfs2_insert_refcount_rec().
Zweryfikowano na podstawie spreparowanego obrazu w wersji 6.19 KASAN (KASAN_GENERIC):
ponowne odtworzenie tego samego reflinku (FICLONE) niezawodnie trafiło w raport KASAN
__ocfs2_increase_refcount()/ocfs2_insert_refcount_rec() przed tą poprawką,
i nie generuje żadnego raportu, gdy ocfs2_validate_refcount_block() odrzuci
sfałszowany rl_used/rl_count.
>_ 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