CVE-2026-97945 in Linuxinfo

Zusammenfassung

von VulDB • 25.09.2026

Im Linux-Kernel wurde folgende Schwachstelle behoben:

x86/mm: Behebung des Datenverlusts im Benutzerbereich bei MADV_FREE und THP

Einige Nutzer von Polars (eine Bibliothek zur Datenanalyse) haben durch diesen Fehler Produktionsdaten verloren. Es scheint, dass sie genau die richtige Kombination aus großen Seiten (Huge Pages), MADV_FREE und starkem Speicherbereinigungsdruck aufwiesen.

pmd_modify() maskiert den alten Wert mit (_HPAGE_CHG_MASK & ~_PAGE_DIRTY) und verwirft dabei stillschweigend das Hardware-Dirty-Bit. Der nachfolgende Aufruf von pmd_mksaveddirty() sollte beim Schreibschutz _PAGE_DIRTY in _PAGE_SAVED_DIRTY übertragen, aber da das Dirty-Bit bereits vom Wert entfernt wurde, gibt es nichts mehr zu übertragen.

Im Gegensatz dazu behält pte_modify() die _PAGE_DIRTY_BITS in seiner Maske bei, und pud_modify() lässt _HPAGE_CHG_MASK unverändert: pmd_modify() ist hier der Ausreißer. Jeder Aufruf von pmd_modify() auf einem beschreibbaren, dirty PMD verliert den Dirty-Status.

Eine sichtbare Folge davon ist Datenverlust bei MADV_FREE auf mit PMD abgebildeten THP (Transparent Huge Pages):

memset(buf, 0x5A, size); // Mit PMD abgebildeter THP, PMD dirty madvise(buf, size, MADV_FREE); // PMD wird bereinigt, bleibt aber beschreibbar; // folio als lazyfree markiert memset(buf, 0x5A, size); // Hardware setzt _PAGE_DIRTY erneut mprotect(buf, size, PROT_READ); // pmd_modify() entfernt das Dirty-Bit mprotect(buf, size, PROT_READ|PROT_WRITE); // ... Speicherdruck ...

Die Bereinigung (z. B. unter memcg-Druck) findet daraufhin das lazyfree folio vor, bei dem nirgendwo ein Dirty-Bit gesetzt ist, und gibt es in __discard_anon_folio_pmd_locked() frei, obwohl die Daten nach MADV_FREE erneut beschrieben wurden; nachfolgende Lesezugriffe führen zu Fehlern (Faults), die frische Null-Seiten laden. Allein NUMA-Hinting kann denselben Verlust auslösen, da as_huge_pmd_numa_page() den PMD ebenfalls über pmd_modify() wiederherstellt.

Mit PMD abgebildete Datei-THPs sind ebenfalls betroffen: Das Entfernen des Dirty-Bits durch mprotect()/NUMA-Hinting bedeutet, dass erneut beschriebene Daten nie zurückgeschrieben werden.

Behoben wird dies dadurch, dass _PAGE_DIRTY in der zu erhaltenden Maske beibehalten wird, genau wie es pte_modify() und pud_modify() tun. Das bestehende Paar aus pmd_mksaveddirty()/pmd_clear_saveddirty() führt dann den Übergang zwischen hardware-dirty <-> saved-dirty basierend auf dem Schreibbit durch und bewahrt dabei die Kodierungsregeln für den Shadow-Stack.

If you want to get best quality of vulnerability data, you may have to visit VulDB.

Zuständig

Linux

Reservieren

25.09.2026

Veröffentlichung

25.09.2026

Moderieren

akzeptiert

Eintrag

VDB-409998

CPE

bereit

EPSS

0.00000

KEV

nein

Aktivitäten

very low

Quellen

Do you want to use VulDB in your project?

Use the official API to access entries easily!