{"id":14883,"date":"2026-09-04T19:02:16","date_gmt":"2026-09-04T11:02:16","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-63806"},"modified":"2026-09-04T19:02:16","modified_gmt":"2026-09-04T11:02:16","slug":"cve-2026-63806","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-63806","title":{"rendered":"CVE-2026-63806 [HIGH] &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nKVM: Replace guest-tr"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>KVM: Replace guest-triggerable BUG_ON() in ioeventfd datamatch with get_unaligned()<\/p>\n<p>Drop a BUG_ON() that has been reachable since it was first added, way back<br \/>\nin 2009, and instead use get_unaligned() to perform potentially-unaligned<br \/>\naccesses.<\/p>\n<p>For a given store, KVM x86&#8217;s emulator tracks the entire value in the<br \/>\ndestination operand, x86_emulate_ctxt.dst.  If the destination is memory,<br \/>\nand the target splits multiple pages and\/or is emulated MMIO, then KVM<br \/>\nhandles each fragment independently.  E.g. on a page split starting at page<br \/>\noffset 0xffc, KVM writes 4 bytes to the first page, then the remaining<br \/>\nbytes to the second page, using ctxt-&gt;dst as the source for both (with<br \/>\nappropriate offsets).<\/p>\n<p>If the destination splits a page *and* hits emulated MMIO on the second<br \/>\npage, then KVM will complete the write to the first page, then emulate the<br \/>\nMMIO access to the second page.  If there is a datamatch-enabled ioeventfd<br \/>\nat offset 0 of the second page, then KVM will process the remainder of the<br \/>\nstore as a potential ioeventfd signal.<\/p>\n<p>Putting it all together, if the guest emits a store that splits a page<br \/>\nstarting at page offset N, and the second page has a datamatch-enabled<br \/>\nioeventfd at offset 0, then KVM will check for datamatch using<br \/>\n&amp;dst.valptr[N] as the source.  Due to dst (and thus dst.valptr) being<br \/>\n32-byte aligned, if N is not aligned to @len, the BUG_ON() fires.<\/p>\n<p>E.g. with a 16-byte store at page offset 0xffc, to an ioeventfd of len 8,<br \/>\nall initial checks in ioeventfd_in_range() will succeed, and the BUG_ON()<br \/>\nfires due to @val being 4-byte aligned, but not 8-byte aligned.<\/p>\n<p>  &#8212;&#8212;&#8212;&#8212;[ cut here ]&#8212;&#8212;&#8212;&#8212;<br \/>\n  kernel BUG at arch\/x86\/kvm\/..\/..\/..\/virt\/kvm\/eventfd.c:783!<br \/>\n  Oops: invalid opcode: 0000 [#1] SMP<br \/>\n  CPU: 0 UID: 1000 PID: 615 Comm: repro Not tainted 7.1.0-rc2-ff238429d1ea #365 PREEMPT<br \/>\n  Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 0.0.0 02\/06\/2015<br \/>\n  RIP: 0010:ioeventfd_write+0x6c\/0x70 [kvm]<br \/>\n  Call Trace:<\/p>\n<p>   __kvm_io_bus_write+0x85\/0xb0 [kvm]<br \/>\n   kvm_io_bus_write+0x53\/0x80 [kvm]<br \/>\n   vcpu_mmio_write+0x66\/0xf0 [kvm]<br \/>\n   emulator_read_write_onepage+0x12a\/0x540 [kvm]<br \/>\n   emulator_read_write+0x109\/0x2b0 [kvm]<br \/>\n   x86_emulate_insn+0x4f8\/0xfb0 [kvm]<br \/>\n   x86_emulate_instruction+0x181\/0x790 [kvm]<br \/>\n   kvm_mmu_page_fault+0x313\/0x630 [kvm]<br \/>\n   vmx_handle_exit+0x18a\/0x590 [kvm_intel]<br \/>\n   kvm_arch_vcpu_ioctl_run+0xc81\/0x1c90 [kvm]<br \/>\n   kvm_vcpu_ioctl+0x2d5\/0x970 [kvm]<br \/>\n   __x64_sys_ioctl+0x8a\/0xd0<br \/>\n   do_syscall_64+0xb7\/0x890<br \/>\n   entry_SYSCALL_64_after_hwframe+0x4b\/0x53<br \/>\n  RIP: 0033:0x7f19c931a9bf<\/p>\n<p>  Modules linked in: kvm_intel kvm irqbypass<br \/>\n  &#8212;[ end trace 0000000000000000 ]&#8212;<\/p>\n<p>In a perfect world, the fix would be to simply delete the BUG_ON(), as KVM<br \/>\nx86 doesn&#8217;t perform alignment checks on &#8220;normal&#8221; memory accesses at CPL0.<br \/>\nSadly, C99 ruins all the fun; while the x86 architecture plays nice,<br \/>\ndereferencing an unaligned pointer directly is undefined behavior in C,<br \/>\ne.g. triggers splats when running with CONFIG_UBSAN_ALIGNMENT=y.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>KVM: Replace guest-triggerable BUG_ON() in ioeventfd datamatch with get_unaligned()<\/p>\n<p>Drop a BUG_ON() that has been reachable since <\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-14883","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/14883","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=14883"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=14883"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=14883"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}