Odebrany

CVE-2026-89772

opublikowano:
modyfikacja:
Ocena CVSS
n/a
Brak oceny

>_ Opis

Tłumaczenie automatyczne – może zawierać nieścisłości.

W jądrze Linuksa usunięto następującą lukę:

btrfs: folio chroniące przed zapisem podczas zapisywania zwrotnego danych

zatwierdzenie 095be159f3eb („btrfs: ujednolicenie usuwania brudnej flagi folio”) zastąpiono
wywołanie folio_clear_dirty_for_io() w require_write_cache_pages() z
zwykła kontrola folio_test_dirty(). Oprócz usunięcia brudnej flagi,
folio_clear_dirty_for_io() wywołuje także folio_mkclean(), która chroni przed zapisem
udostępnione PTE mmap mapujące folio. Pamiętaj, że nadal dzwonimy
folio_clear_dirty_for_io() później w Submit_one_sector(), kiedy wyczyścimy
brudny w ostatnim sektorze folio (jedyny sektor dla nie-podstrony
przypadki). Ale straciliśmy to wczesne wywołanie w require_write_cache_pages().

Bez dodatkowej ochrony przed zapisem proces z plikiem mmap-ed może
modyfikować sektor podczas jego używania przez zapisywanie zwrotne w taki sposób, że
oczekuje stabilnego folio (sumowanie kontrolne, kompresja, kopiowanie itp.)
bez zarzutów, co objawia się garścią konkretnych błędów.

1. W przypadku dużych folio lub sektorów podstron istnieje możliwość przesłania biografii
co nie obejmuje całego folio. Kiedy to nastąpi, będziemy mieli
bio w locie po folio, do którego *nie* zadzwoniliśmy
folio_clear_dirty_for_io() włączone. Jeśli zadanie z istniejącym plikiem PTE z wersją mmap
pisze (bez błędów..) w tym oknie, może to skutkować
korupcja. Jeśli zapis nadejdzie podczas sumowania kontrolnego lub samego zapisu
trwa, może to skutkować nieprawidłową sumą kontrolną i późniejszym uszkodzeniem
raporty o przeczytaniu. Jeśli zapis nastąpi po zakończeniu sumowania kontrolnego/zapisu
ale zanim ostatni brudny sektor zostanie wyczyszczony, zapis jest obecny
w pamięci podręcznej strony, ale nie ma to wpływu na brudne śledzenie i zostanie utracone
kiedy folio jest całkowicie ukończone i przesyłane, a brudny kawałek
jest wyczyszczony. Powoduje to utratę zapisu, nawet jeśli zostanie wywołana funkcja fsync().

2. W przypadku zgłoszeń strefowych, które są dokonywane partiami oddzielnie od głównego
require_writepage() , ryzykujemy również naruszeniem csum w przypadku tych pętli
zgłoszenia. Zapisy strefowe są ograniczone do max_zone_append_size i są
nie są wyrównane z folio, więc przesłanie może obejmować dwa folio. Pierwszy
wywoła folio przetwarzane w require_write_cache_pages().
require_write_locked_range(), która prześle częściowy zakres
następne folio, podczas gdy reszta tego folio może być nadal brudna. Więc
czyszczenie brudnych przesłanych sektorów nie wymaga
folio_clear_dirty_for_io() i mamy ten sam problem. Od
require_write_cache_pages() pomija te folia przesłane wsadowo (są to
już zaznaczone do odpisu z przesłania w poprzednim folio), my
musi dodać dodatkową ochronę przed zapisem w lock_delalloc_folios().

3. W przypadku zakresów inline będzie to nieznacznie wiązać się z ryzykiem utraty zapisów
po/w trakcie kopiowania zakresu wbudowanego, ale przed usunięciem brudu
folio.

4. W przypadku folio obejmujących EOF, mmap może manipulować wcześniejszymi zerowanymi bajtami
EOF i spowodować ich utrwalenie tam, gdzie przyszłe błędy wystąpią nieprawidłowo
zobacz je zamiast zer.

5. Wreszcie, w przypadku skompresowanych zakresów, ryzykujemy modyfikację folio w trakcie
pracuj nad ich kompresją, co spowoduje uszkodzenie skompresowanych danych.
W szczególności w run_delalloc_compressed() ustawiamy w kolejce pracę do wykonania
compress_file_range() w fragmentach BTRFS_COMPRESSION_CHUNK_SIZE (512 KB), które
wywoła btrfs_folio_clamp_clear_dirty() w zakresie. W przypadku braku podstrony,
to zawsze bezpiecznie wyczyści całe folio. W przypadku podstrony ryzykujemy a
również tutaj częściowo jasne. W szczególności wyobraź sobie, że folio 2M jest podzielone
na fragmenty pracy o wielkości 512 tys., co może rozpocząć kompresję jednego fragmentu
zanim wszystkie fragmenty pracownicy compress_file_range() dotrą daleko
wystarczy, aby zakończyć czyszczenie wszystkich brudnych map bitowych folio i pobrać
do folio_clear_dirty_for_io(). Duże folio na krawędziach zgłoszenia
zakresy są podobnie narażone na ryzyko jedynie częściowego oczyszczenia.
Ta szczególna luka została wprowadzona przez drugą łatkę z tej samej serii:
zatwierdzenie a4ef54dbb576 („btrfs: make require_range_clear_dirty_for_io() do obsługi rozmiaru sektora < przypadki rozmiaru strony”)

Nie możemy po prostu przywrócić wywołania folio_clear
---obcięty---

>_ 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