{"id":7586,"date":"2026-09-04T18:49:36","date_gmt":"2026-09-04T10:49:36","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-74568"},"modified":"2026-09-04T18:49:36","modified_gmt":"2026-09-04T10:49:36","slug":"cve-2026-74568","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-74568","title":{"rendered":"CVE-2026-74568 [CRITICAL] &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nKVM: arm64: vgic: Fix"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>KVM: arm64: vgic: Fix race between LPI release and re-registration<\/p>\n<p>Fix a potential race between decrementing an LPI&#8217;s reference count and<br \/>\nevicting that structure from the LPI xarray.<\/p>\n<p>LPI structures are maintained in the VGIC LPI xarray (dist-&gt;lpi_xa).<br \/>\nWhen the reference count of an LPI structure drops to zero,<br \/>\nvgic_release_lpi_locked() removes the structure from the xarray and<br \/>\nfrees it under the xarray lock.<\/p>\n<p>However, the release of an LPI can race with a concurrent LPI<br \/>\nre-registration with the same INTID via vgic_add_lpi() on another CPU,<br \/>\nsince the reference count drop and the xarray eviction are not performed<br \/>\nin a single atomic step. This can happen e.g. if the guest issues a<br \/>\nDISCARD while the LPI is still referenced from a vCPU&#8217;s active-pending<br \/>\nlist (ap_list), and the same INTID is re-mapped via MAPTI.<\/p>\n<p>Particularly, vgic_release_lpi_locked() is called from two distinct<br \/>\npaths: direct release via vgic_put_irq(), and deferred release via<br \/>\nvgic_release_deleted_lpis(). During direct release, the issue can result<br \/>\nin deleting a newly registered LPI from the xarray:<\/p>\n<p>  CPU0 (Releasing LPI)                    CPU1 (Adding new LPI)<br \/>\n  ====================                    =====================<br \/>\n  vgic_put_irq()<br \/>\n      __vgic_put_irq()<br \/>\n          refcount_dec_and_test()<br \/>\n                                          vgic_add_lpi()<br \/>\n                                              xa_lock_irqsave()<br \/>\n                                              old_irq = xa_load(.., intid)<br \/>\n                                              vgic_try_get_irq_ref(old_irq) == false<br \/>\n                        new IRQ inserted &#8211;&gt;  __xa_store(.., intid, ..)<br \/>\n                                              xa_unlock_irqrestore()<br \/>\n  xa_lock_irqsave();<br \/>\n  vgic_release_lpi_locked()<br \/>\n      __xa_erase(.., irq-&gt;intid)   pending_release = true<br \/>\n                                          vgic_add_lpi()<br \/>\n                                              xa_lock_irqsave()<br \/>\n                                              old_irq = xa_load(.., intid)<br \/>\n                                              vgic_try_get_irq_ref(oldirq) == false<br \/>\n                 BUG: old IRQ overwritten &#8211;&gt; __xa_store(.., intid, ..)<br \/>\n                                              xa_unlock_irqrestore()<\/p>\n<p>  vgic_release_deleted_lpis()<br \/>\n      xa_lock_irqsave()<br \/>\n      xa_for_each() { .. } &lt;&#8211; old IRQ with pending_release = true<br \/>\n                               is gone, so it cannot be released<\/p>\n<p>To fix the direct release path, move the reference count drop inside<br \/>\nthe xarray lock, making sure that vgic_add_lpi() never encounters the<br \/>\nto-be-released LPI.<\/p>\n<p>In the deferred release path, the refcount drop must happen under a raw<br \/>\nspinlock, so the xarray lock cannot be grabbed, and the same solution<br \/>\ndoes not work. Instead, update vgic_add_lpi(), so that if it evicts<br \/>\nan LPI from the xarray, it takes on the responsibility of freeing it.<br \/>\nConsequently, an LPI may now be freed concurrently after a deferred<br \/>\nrelease drops the refcount, so accessing the pending_release field is no<br \/>\nlonger safe from use-after-free. Delete all uses of the flag, and update<br \/>\nvgic_release_deleted_lpis() to identify orphaned LPIs purely based on<br \/>\ntheir refcount.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>KVM: arm64: vgic: Fix race between LPI release and re-registration<\/p>\n<p>Fix a potential race between decrementing an LPI&#8217;s reference co<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-7586","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/7586","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=7586"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=7586"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=7586"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}