{"id":24615,"date":"2026-09-16T20:32:33","date_gmt":"2026-09-16T12:32:33","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-89928"},"modified":"2026-09-16T20:32:33","modified_gmt":"2026-09-16T12:32:33","slug":"cve-2026-89928","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-89928","title":{"rendered":"CVE-2026-89928 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nKVM: x86\/mmu: Consume"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>KVM: x86\/mmu: Consume the locked rmap value in the lockless rmap walk<\/p>\n<p>__kvm_rmap_lock() deliberately elides the rmap lock when it observes an<br \/>\nempty rmap.  In that case kvm_rmap_lock_readonly() also re-enables<br \/>\npreemption and returns zero, so the caller holds neither the rmap lock<br \/>\nnor a preemption reference.  The elision documents the invariant it<br \/>\nrelies on:<\/p>\n<p>\t * Elide the lock if the rmap is empty, as lockless walkers (read-only<br \/>\n\t * mode) don&#8217;t need to (and can&#8217;t) walk an empty rmap, nor can they add<br \/>\n\t * entries to the rmap.  I.e. the only paths that process empty rmaps<br \/>\n\t * do so while holding mmu_lock for write, and are mutually exclusive.<\/p>\n<p>kvm_rmap_age_gfn_range() ignores the returned value and unconditionally<br \/>\nenters for_each_rmap_spte_lockless().  The iterator started with<br \/>\nrmap_get_first(), which re-reads rmap_head-&gt;val rather than using the<br \/>\nvalue returned by the lock.  If a writer populates the rmap between the<br \/>\nlock&#8217;s read and the iterator&#8217;s re-read, the aging path walks the newly<br \/>\ninstalled rmap without holding its lock.<\/p>\n<p>For a KVM_RMAP_MANY rmap this leaves the walker following a<br \/>\npte_list_desc chain that it never locked.  A writer holding mmu_lock for<br \/>\nwrite may free that chain (e.g. kvm_zap_all_rmap_sptes() on the recycle<br \/>\npath, or any rmap zap) via kmem_cache_free() while the walk is in<br \/>\nprogress, giving a slab use-after-free.  Nothing serialises the two: the<br \/>\naging path runs without mmu_lock when CONFIG_KVM_MMU_LOCKLESS_AGING=y,<br \/>\nand the rmap lock that would otherwise exclude the writer was elided.<br \/>\nBecause the empty path re-enables preemption, the interval between the<br \/>\ntwo reads can span an arbitrary scheduling delay.<\/p>\n<p>Fix the class of bug by having the lockless walk consume the value<br \/>\nreturned by the lock instead of re-reading the rmap.  Split<br \/>\nrmap_get_first() into __rmap_get_first(), which starts an iterator from<br \/>\nan already-read rmap value, and make for_each_rmap_spte_lockless() take<br \/>\nthat value and call __rmap_get_first() directly.<br \/>\nkvm_rmap_age_gfn_range() passes the value returned by<br \/>\nkvm_rmap_lock_readonly(): when the lock was elided the value is zero,<br \/>\n__rmap_get_first() returns NULL, and the walk is skipped.  No lockless<br \/>\nwalker re-reads the rmap, so the lock-elision invariant cannot be<br \/>\nviolated, and no lock()-without-paired-unlock() path is added to the<br \/>\naging code.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>KVM: x86\/mmu: Consume the locked rmap value in the lockless rmap walk<\/p>\n<p>__kvm_rmap_lock() deliberately elides the rmap lock when it <\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-24615","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/24615","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln"}],"about":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/types\/vuln"}],"wp:attachment":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=24615"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=24615"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=24615"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}