Odebrany

CVE-2026-97945

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ę:

x86/mm: Napraw utratę danych w przestrzeni użytkownika za pomocą MADV_FREE i THP

Niektórzy użytkownicy Polars (biblioteki do analizy danych) stracili produkcję
dane z tego błędu. Wydaje się, że mają odpowiednią kombinację
ogromne strony, MADV_FREE i duża presja odzyskiwania.

pmd_modify() maskuje starą wartość za pomocą (_HPAGE_CHG_MASK i ~_PAGE_DIRTY),
po cichu odrzucając brudny kawałek sprzętu. Kolejne
Wywołanie pmd_mksaveddirty() ma przenieść _PAGE_DIRTY do
_PAGE_SAVED_DIRTY podczas ochrony przed zapisem, ale brudny bit już był
pozbawiony wartości, więc nie ma już nic do przeniesienia.

Porównaj z pte_modify(), która przechowuje _PAGE_DIRTY_BITS w swojej masce,
i pud_modify(), która utrzymuje _HPAGE_CHG_MASK nietknięte: pmd_modify()
jest dziwny. Każda funkcja pmd_modify() na zapisywalnym, brudnym PMD przegrywa
stan brudny.

Jedną widoczną konsekwencją jest utrata danych z MADV_FREE na THP mapowanym na PMD:

memset(buf, 0x5A, rozmiar); // THP mapowany na PMD, brudny PMD
madvise(buf, rozmiar, MADV_FREE); // PMD wyczyszczony, ale pozostawiony do zapisu,
// folio oznaczone jako leniwe
memset(buf, 0x5A, rozmiar); // sprzęt ponownie ustawia _PAGE_DIRTY
mprotect(buf, rozmiar, PROT_READ); // pmd_modify() usuwa brudny bit
mprotect(buf, rozmiar, PROT_READ|PROT_WRITE);
// ... obciążenie pamięci ...

Reclaim (np. pod ciśnieniem memcg), a następnie znajduje leniwe folio za pomocą
żaden brudny bit nie jest nigdzie osadzony i uwalnia go
__discard_anon_folio_pmd_locked(), mimo że dane zostały przepisane
po MADV_FREE; kolejny błąd odczytu na świeżych stronach zerowych. NUMA
sama podpowiedź może spowodować tę samą stratę, co do_huge_pmd_numa_page()
przywraca PMD również poprzez pmd_modify().

Ma to również wpływ na THP plików mapowanych przez PMD: pomijanie podpowiedzi mprotect()/NUMA
brudny bit oznacza, że przepisane dane nigdy nie zostaną zapisane ponownie.

Napraw to, zachowując _PAGE_DIRTY w zachowanej masce, dokładnie tak jak
pte_modify() i pud_modify() tak. Istniejący
następnie para pmd_mksaveddirty()/pmd_clear_saveddirty() wykonuje
przejście hardware-dirty <-> zapisane-brudne na podstawie bitu zapisu,
zachowując reguły kodowania stosu cieni.

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