The Patching Friars' AlmanacA calendar of CVE saints

July 6

JanuscapeHoly card for januscape, generated with AI (Claude, Anthropic) for the Lunario dei Frati Patchatori.CC BY-NC-SA 4.0 Januscape DUO VULTUS
🤖 Image and text generated with AI

⬇ Download holy card: ·

Embed on your site

Saint Januscape, Who Looked Two Ways Out of the VM

Patron of KVM hypervisors on x86, shadow paging, and roles assigned by mistake.

Life

In July 2026 Hyunwoo Kim (v4bel) revealed Januscape (CVE-2026-53359), a use-after-free in KVM/x86 shadow paging. An unexpected role assigned to an MMU page broke the invariant between stored and computed GFNs, leaving a hole only partly closed by earlier patches. A guest could crash the host kernel, dragging down the other VMs, or aim for execution as root; where /dev/kvm is world-writable, it became local escalation too.

Prayer

O Saint Januscape, who looks inside and outside the virtual machine with two faces, let our roles always match what they represent. Amen.

How to celebrate

Celebrated by updating the kernel on x86 KVM hosts and checking that /dev/kvm is not within everyone's reach.

Who has two faces climbs over every wall.

Technical record

Disclosed on
July 6 2026
CVE
CVE-2026-53359
CVSS
8.8
Product
Linux · Linux

In the Linux kernel, the following vulnerability has been resolved: KVM: x86: Fix shadow paging use-after-free due to unexpected role Commit 0cb2af2ea66ad ("KVM: x86: Fix shadow paging use-after-free due to unexpected GFN") fixed a shadow paging mismatch between stored and computed GFNs; the bug could be triggered by changing a PDE mapping from outside the guest, and then deleting a memslot. The rmap_remove() call would miss entries created after the PDE change because the GFN of the leaf SPTE does not match the GFN of the struct kvm_mmu_page. A similar hole however remains if the modified PDE points to a non-leaf page. In this case the gfn can be made to match, but the role does not match: the original large 2MB page creates a kvm_mmu_page with direct=1, while the new 4KB needs a kvm_mmu_page with direct=0. However, kvm_mmu_get_child_sp() does not compare the role, and therefore reuses the page. The next step is installing a leaf (4KB) SPTE on the new path which records an rmap entry under the gfn resolved by the walk. But when that child is zapped its parent kvm_mmu_page has direct=1 and kvm_mmu_page_get_gfn() computes the gfn for the 4KB page as sp->gfn + index instead of using sp->shadowed_translation[] (or sp->gfns[] in older kernels). It therefore fails to remove the recorded entry. When the memslot is dropped the shadow page is freed but the rmap entry survives, as in the scenario that was already fixed. Code that later walks that gfn (dirty logging, MMU notifier invalidation, and so on) dereferences an sptep that lies in the freed page, causing the use-after-free.

Sources: januscape.io · github.com

Also remembered today

Shortcuts: ← → to move, D day, W week, M month, T today.

📅 Add to your calendar

SaintsGoogle CalendarApple, Outlook (.ics)

Observances (feasts, scourges and miracles)Google CalendarApple, Outlook (.ics)

In Google Calendar you can also paste the URL in Settings → Add calendar → From URL. The first sync can take a few hours.