CVE-2026-98918 in Linux
Zusammenfassung
von VulDB • 23.10.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
mm/damon/ops-common: Verwenden einer seitenalignierten Adresse in damon_ptep_mkold()
__damon_va_prepare_access_check() wählt eine zufällige Byte-Adresse innerhalb der Region aus und speichert sie in r->sampling_addr. damon_va_mkold() übergibt diese an einen Page-Table-Walk, der sie als die zu samplende Seitenadresse an damon_ptep_mkold() weiterleitet:
damon_va_mkold(mm, r->sampling_addr) damon_va_walk_page_range(mm, addr, addr + 1) damon_mkold_pmd_entry() damon_ptep_mkold(pte, vma, addr) ptep_test_and_clear_young(vma, addr, pte) mmu_notifier_clear_young(mm, addr, addr + PAGE_SIZE)
Für arm64 war vor dem Commit 6f0e1142173a („arm64: mm: support batch clearing of the young flag for large folios“) der contpte-Helfer genau CONT_PTES-Einträge vom abgerundeten Page-Table-Zeiger durchlaufen und hat @addr nur zur Weitergabe an jeden Eintrag verwendet, sodass ein nicht alignierter Wert harmlos war:
ptep = contpte_align_down(ptep); addr = ALIGN_DOWN(addr, CONT_PTE_SIZE); for (i = 0; i < CONT_PTES; i++, ptep++, addr += PAGE_SIZE)
Jetzt wird der zu durchlaufende Bereich stattdessen aus @addr abgeleitet: end = addr + nr * PAGE_SIZE, aufgerundet auf CONT_PTE_SIZE. Für ein Sample im letzten Page eines contpte-Blocks führt die Subpage-Versatzposition dazu, dass end knapp über die Blockgrenze hinausreicht; das Auf-runden landet daher einen ganzen Block weiter und der Walk löscht PTE_AF in CONT_PTES-Einträgen jenseits des gesampleten Blocks. Für den letzten Block auf einer Page-Table-Seite liegen diese Einträge hinter dem Ende dieser Seite, sodass der Write in die folgende Page erfolgt.
Ausgelöst durch das vollständige 7.1/7.2 Kernel-Selftest-Suite auf arm64 (EC2 c/m6g.4xlarge). Der Kernel stürzt manchmal während oder kurz nach dem DAMON-Test ab.
Die Auswirkungen des Overruns hängen von der Page ab, die zufällig auf die Page-Table folgt, sodass es keine einzelne Signatur gibt. Ist diese Seite schreibgeschützt (read-only), führt dies im Sampling-Pfad selbst zu Write-Faults:
Unable to handle kernel write to read-only memory at virtual address ffff0003c5d2d000 FSC = 0x0f: level 3 permission fault CM = 0, WnR = 1, TnD = 0, TagAccess = 0 CPU: 10 UID: 0 PID: 3487 Comm: kdamond.2 pc : contpte_test_and_clear_young_ptes+0x70/0xc0 lr : damon_ptep_mkold+0x1e8/0x1f8 Call trace: contpte_test_and_clear_young_ptes+0x70/0xc0 (P) damon_mkold_pmd_entry+0x150/0x170 walk_pmd_range+0x110/0x2b0 walk_pud_range+0x10c/0x208 walk_pgd_range+0x134/0x258 __walk_page_range+0x98/0x1b0 walk_page_range_vma_unsafe+0x90/0x148 walk_page_range_vma+0x28/0x40 damon_va_walk_page_range+0x114/0x2b8 damon_va_prepare_access_checks+0xec/0x1a8 kdamond_fn+0x534/0x770 kthread+0x128/0x138 ret_from_fork+0x10/0x20
Ist die Seite andererseits beschreibbar, gelingt das Löschen von PTE_AF stillschweigend und der Schaden zeigt sich erst später bei dem Prozess oder Modul, das zufällig im Besitz dieser Page ist; daher ist der Backtrace nicht mit DAMON verwandt und variiert zwischen den Durchläufen.
Übergabe einer seitenalignierten Adresse an den Aufruf von ptep_test_and_clear_young() in damon_ptep_mkold(), welcher die einzige Stelle ist, über die DAMON contpte_test_and_clear_young_ptes() erreichen kann. Nichts anderes sieht die alignierte Adresse, und r->sampling_addr bleibt unverändert, sodass die Semantik des Sampling- und Region-Buchkeeping unbeeinträchtigt bleibt.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.