CVE-2026-97945
Niskie ryzyko· EPSS 9%Prawdopodobieństwo exploitacji (EPSS)
Niskie ryzykoPercentyl 9 - wyżej niż 9% wszystkich znanych CVE
Streszczenie
W kernelu Linux wykryto podatność w funkcji pmd_modify() dla architektury x86, która powoduje utratę bitu dirty (brudnego) w PMD (Page Middle Directory) dla stron THP (Transparent Huge Pages). W rezultacie, po użyciu MADV_FREE i późniejszym zapisie danych, mechanizm reclaim (np. pod presją pamięci) może błędnie uznać strony za czyste i zwolnić je, co prowadzi do utraty danych użytkownika. Problem dotyczy również plikowych stron THP, gdzie zmodyfikowane dane nie są zapisywane z powrotem na dysk.
Ocena ryzyka
Organizacja może doświadczyć cichej utraty danych produkcyjnych, szczególnie w środowiskach z dużymi stronami (huge pages), użyciem MADV_FREE i intensywnym obciążeniem pamięci. Dotyczy to aplikacji takich jak Polars (biblioteka analityczna), co może skutkować uszkodzeniem wyników analiz lub utratą krytycznych danych.
Rekomendacja
Zaleca się natychmiastowe zastosowanie łatki z jądra Linux, która naprawia pmd_modify() poprzez zachowanie bitu _PAGE_DIRTY w masce. Należy również monitorować biuletyny bezpieczeństwa dystrybucji i przetestować poprawkę w środowisku testowym przed wdrożeniem produkcyjnym.
Inne podatności w Linux kernel
Zobacz wszystkie- CVE-2026-99259Nieznane
W jądrze Linux w sterowniku soc/tegra: pmc występuje problem z niezainicjalizowaną zmienną early_pmc->rate dla starszych 32-bitowych urządzeń Tegra. Zmienna nigdy nie jest ustawiana i pozostaje równa 0, co powoduje wyzwalanie ostrzeżenia w funkcji tegra_pmc_enter_suspend_mode(). Błąd pojawił się po zmianie sterownika PMC na dynamiczne tworzenie kontekstu, gdzie zaktualizowano rate tylko w nowym kontekście.
- CVE-2026-99258Nieznane
W jądrze Linux funkcja hv_apicid_to_vp_index() używa per-CPU stron wejściowych i wyjściowych hiperwywołań. W maszynie wirtualnej SEV-SNP CoCo bez paravisora strona wyjściowa nie jest alokowana, więc hipervisor zapisuje wynikowy indeks VP do niezaalokowanej pamięci gościa. Poprawka polega na użyciu tej samej strony wejściowej również jako wyjściowej.
- CVE-2026-99257Nieznane
W jądrze Linux mechanizm współdzielonych GPIO oparty na tablicach wyszukiwania platformy wymaga powiązanego struct device. Wywołanie wyszukiwania oparte na fwnode bez powiązanego urządzenia powoduje dereferencję wskaźnika NULL. Poprawka dodaje sprawdzenie, które pozwala jąderu łagodnie obsłużyć tę sytuację błędem.
- CVE-2026-99256Nieznane
W jądrze Linux moduł dm cache używał rw_semaphore do blokady background_work_lock, mimo że blokady zapisu rw_semaphore mają ścisłą semantykę właściciela. Proces blokujący nie zawsze był tym samym, który zwalniał blokadę, co przy CONFIG_DEBUG_RWSEMS wyzwalało ostrzeżenie podczas suspend/resume urządzenia cache. Poprawka zastępuje rw_semaphore spinlockiem i kolejką oczekujących.
- CVE-2026-99251Nieznane
W jądrze Linux funkcja init_vp_index() zawiera pętlę ponawiania, która usuwa CPU z danego węzła NUMA, jeśli są już w alokowanej masce cpumask lub poza maską housekeeping HK_TYPE_MANAGED_IRQ. Jeśli maska housekeeping nie zawiera żadnego CPU w danym węźle, pętla staje się nieskończona. Poprawka pomija węzły NUMA bez CPU housekeeping i wcześniej przerywa działanie, gdy brak jest online CPU housekeeping.
- CVE-2026-99250Nieznane
W jądrze Linux wątki jądra (kthreads) NBCON odpowiedzialne za drukowanie konsoli są uruchamiane bardzo wcześnie przez early_initcall(). Asynchroniczne włączanie i wyłączanie przerwań podczas wczesnego rozruchu może zakłócać konfigurację SMP na niektórych platformach sprzętowych, powodując zawieszanie się systemu. Poprawka opóźnia uruchomienie tych wątków do momentu zakończenia wszystkich arch initcalli.
- CVE-2026-99249Nieznane
W jądrze Linux funkcja zap_pid_ns_processes() oczekująca na zwolnienie PID-ów w przestrzeni nazw nie była przerywalna przez mechanizm zamrażania (freezer). Gdy tracer spoza przestrzeni nazw nie odbiera zombie, oczekiwanie nie ma górnej granicy, a każda próba zawieszenia systemu kończy się niepowodzeniem. Poprawka wprowadza stany TASK_FREEZABLE w pętlach oczekiwania, aby freezer mógł zamrozić zadania.
- CVE-2026-99248Nieznane
W jądrze Linux w sterowniku i2c: xiic przywrócono ręczne zarządzanie runtime PM zamiast wersji opartej na devres, aby naprawić lawinę ostrzeżeń clk. Zarządzane zwalnianie zasobów wyłączało runtime PM w niewłaściwej kolejności, co powodowało podwójne wyłączenie zegara i ostrzeżenia "clkN already disabled" przy każdym usuwaniu urządzenia.
- CVE-2026-99247Nieznane
W jądrze Linux, jeśli alokacja bufora śledzenia nie powiedzie się podczas wczesnego rozruchu, tracing_disabled pozostaje ustawione, a lista zdarzeń globalnego trace array pozostaje niezainicjalizowana. Funkcja tracer_init_tracefs_work_func() uruchamiana asynchronicznie nie sprawdza tego stanu i wywołuje event_trace_init() oraz init_tracer_tracefs(), co prowadzi do dereferencji NULL i Oops podczas rozruchu. Poprawka sprawdza tracing_disabled na początku funkcji roboczej.
- CVE-2026-99215Nieznane
W jądrze Linux w podsystemie power supply występuje luka use-after-free. Jeśli zasilacz zostanie wyrejestrowany (power_supply_unregister) w trakcie wykonywania callbacku external_power_changed(), sterownik może zwolnić dane, do których callback nadal próbuje uzyskać dostęp, co prowadzi do awarii jądra (NULL pointer dereference).
Oryginalny opis (angielski, źródło NVD)
In the Linux kernel, the following vulnerability has been resolved: x86/mm: Fix user-space data loss with MADV_FREE and THP Some of users of Polars (a data analytics library) have lost production data from this bug. They seem to have just the right combination of huge pages, MADV_FREE and heavy reclaim pressure. pmd_modify() masks the old value with (_HPAGE_CHG_MASK & ~_PAGE_DIRTY), silently discarding the hardware dirty bit. The subsequent pmd_mksaveddirty() call is supposed to transfer _PAGE_DIRTY into _PAGE_SAVED_DIRTY when write-protecting, but the dirty bit was already stripped from the value, so there is nothing left to transfer. Contrast with pte_modify(), which keeps _PAGE_DIRTY_BITS in its mask, and pud_modify(), which keeps _HPAGE_CHG_MASK untouched: pmd_modify() is the odd one out. Any pmd_modify() on a writable, dirty PMD loses the dirty state. One visible consequence is data loss with MADV_FREE on PMD-mapped THP: memset(buf, 0x5A, size); // PMD-mapped THP, PMD dirty madvise(buf, size, MADV_FREE); // PMD cleaned but left writable, // folio marked lazyfree memset(buf, 0x5A, size); // hardware sets _PAGE_DIRTY again mprotect(buf, size, PROT_READ); // pmd_modify() drops the dirty bit mprotect(buf, size, PROT_READ|PROT_WRITE); // ... memory pressure ... Reclaim (e.g. under memcg pressure) then finds the lazyfree folio with no dirty bit set anywhere and frees it in __discard_anon_folio_pmd_locked(), even though the data was rewritten after MADV_FREE; subsequent reads fault in fresh zero pages. NUMA hinting alone can trigger the same loss, as do_huge_pmd_numa_page() restores the PMD through pmd_modify() as well. PMD-mapped file THPs are affected too: mprotect()/NUMA hinting dropping the dirty bit means rewritten data is never written back. Fix it by keeping _PAGE_DIRTY in the preserved mask, exactly like pte_modify() and pud_modify() do. The existing pmd_mksaveddirty()/pmd_clear_saveddirty() pair then performs the hardware-dirty <-> saved-dirty transition based on the write bit, preserving the shadow-stack encoding rules.
Dane podatności pochodzą z NVD (NIST) · CISA KEV · EPSS

