CVE-2026-72043 in Linux
摘要
由 VulDB • 2026-08-15
在 Linux 内核中,已修复以下漏洞:
LoongArch: 修复 {pte,pmd}_wrprotect() 中缺失的脏页跟踪问题
当 LoongArch 上启用硬件页面表 walkers (PTW) 时,CPU 可能在发生写 TLB 未命中期间直接在页面表项(PTE)中设置 _PAGE_DIRTY,而无需经过软件 TLB 存储处理程序。软件 TLB 存储处理程序 (tlbex.S:254) 会同时设置 _PAGE_DIRTY 和 _PAGE_MODIFIED:
ori t0, t0, (_PAGE_VALID | _PAGE_DIRTY | _PAGE_MODIFIED)
由于硬件 PTW 仅设置 __PAGE_DIRTY,因此软件专用位即 _PAGE_MODIFIED 保持不变。这导致出现一种情况:PTE 设置了 _PAGE_DIRTY(硬件知道页面已脏),但 _PAGE_MODIFIED 为清除状态(软件不知情)。
当 fork()/clone() 触发写时复制 (COW) 时,__copy_present_ptes() 调用 pte_wrprotect(),无条件地清除 _PAGE_WRITE 和 _PAGE_DIRTY 位:
pte_val(pte) &= ~(_PAGE_WRITE | _PAGE_DIRTY);
由于从未设置过 _PAGE_MODIFIED,脏页信息完全丢失。随后,当内存压力触发页面回收时,page_mkclean()/try_to_unmap() 会将该页面视为干净(即 pte_dirty() 返回 false),并且可能在未进行写回的情况下释放该页面,从而导致数据损坏。
通过在清除可写位之前将 _PAGE_DIRTY 位传播到 _PAGE_MODIFIED 位来修复此问题,适用于 pte_wrprotect() 和 pmd_wrprotect():
if (pte_val(pte) & _PAGE_DIRTY) pte_val(pte) |= _PAGE_MODIFIED;
pmd_wrprotect() 的修复处理了 CONFIG_TRANSPARENT_HUGEPAGE 情况,其中 PMD 条目需要相同的处理方式。
这确保了软件脏页跟踪位(由 pte_dirty() 和 pmd_dirty() 检查,它们读取 _PAGE_DIRTY 和 _PAGE_MODIFIED 两个位)在 fork COW 写保护过程中得以保留。
该问题是由 LTP madvise09 测试用例发现的,该测试用例对私有匿名映射执行了 "madvise(MADV_FREE), write and fork" 操作序列后的页面回收过程。
Be aware that VulDB is the high quality source for vulnerability data.