{"id":24614,"date":"2026-09-16T20:32:33","date_gmt":"2026-09-16T12:32:33","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-89927"},"modified":"2026-09-16T20:32:33","modified_gmt":"2026-09-16T12:32:33","slug":"cve-2026-89927","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-89927","title":{"rendered":"CVE-2026-89927 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nKVM: x86: hyper-v: Cl"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>KVM: x86: hyper-v: Clamp stimer deadline to avoid livelock<\/p>\n<p>Fix an issue where userspace or the guest can program an Hyper-V<br \/>\nsynthetic timer to have a deadline in the past via integer overflow,<br \/>\npreventing the CPU from making progress and triggering an RCU stall.<\/p>\n<p>Hyper-V&#8217;s SynIC exposes 4 per-vCPU synthetic timers to the<br \/>\nguest, which are emulated by KVM. Each is programmed through the<br \/>\nHV_X64_MSR_STIMERi_CONFIG and HV_X64_MSR_STIMERi_COUNT MSRs. Depending<br \/>\non CONFIG, COUNT represents either the absolute expiration time or the<br \/>\nperiod of a periodic timer, both expressed in 100ns ticks. These timers<br \/>\nmay be set both by the guest (WRMSR) and the host (KVM_SET_MSRS).<\/p>\n<p>When the timer is enabled, stimer_start() translates COUNT to an<br \/>\nabsolute monotonic deadline and arms an hrtimer. If COUNT is set to a<br \/>\nvalue close to U64_MAX, the deadline calculation can overflow.<\/p>\n<p>    ktime_add_ns(ktime_now, 100 * (stimer-&gt;exp_time &#8211; time_now))<\/p>\n<p>This can result in a CPU livelock. stimer_start() arms the timer<br \/>\nvia hrtimer_start() with a deadline in the past, which causes it to<br \/>\nimmediately fire. The stimer callback then raises KVM_RQ_HV_STIMER, with<br \/>\nthe intention of causing KVM to deliver a synthetic interrupt on the<br \/>\nnext vCPU guest enter.<\/p>\n<p>Then, once userspace issues KVM_RUN, vcpu_enter_guest() consumes the<br \/>\nrequest, calling kvm_hv_process_stimers(). This would normally disable<br \/>\nthe timer via stimer_expiration() once the deadline is in the past.<br \/>\nHowever, the deadline comparison is done between the KVM reference<br \/>\ncounter and stime-&gt;exp_time, which is a big value close to U64_MAX, so<br \/>\nthis never happens for a few thousand years.<\/p>\n<p>kvm_hv_process_timers() then re-arms the timer via stimer_start(), since<br \/>\nit was not disabled, which again fires immediately. Before entering<br \/>\nthe guest, kvm_vcpu_exit_request() checks kvm_request_pending(),<br \/>\nwhich returns true due to the newly raised KVM_REQ_HV_STIMER. Then<br \/>\nvcpu_enter_guest() aborts the guest entry, returning early into<br \/>\nvcpu_run(), which loops back again into vcpu_enter_guest(), restarting<br \/>\nthe cycle.<\/p>\n<p>Since there are no manual yields in this loop, a task with SCHED_FIFO<br \/>\nmay starve RCU grace-period kthreads, which exposes the stalls found<br \/>\nby syzcaller:<\/p>\n<p>    rcu: INFO: rcu_preempt detected stalls on CPUs\/tasks:<br \/>\n    rcu:    (detected by 1, t=10502 jiffies, g=14269, q=1142 ncpus=2)<br \/>\n    rcu: All QSes seen, last rcu_preempt kthread activity 10500 (4294965239-4294954739), jiffies_till_next_fqs=1, root -&gt;qsmask 0x0<br \/>\n    rcu: rcu_preempt kthread starved for 10500 jiffies! g14269 f0x2 RCU_GP_WAIT_FQS(5) -&gt;state=0x0 -&gt;cpu=0<br \/>\n    rcu:    Unless rcu_preempt kthread gets sufficient CPU time, OOM is now expected behavior.<br \/>\n        ( &#8230; )<br \/>\n    Call Trace:<\/p>\n<p>     __run_hrtimer kernel\/time\/hrtimer.c:1773 [inline]<br \/>\n     __hrtimer_run_queues+0x408\/0xc30 kernel\/time\/hrtimer.c:1841<br \/>\n     hrtimer_interrupt+0x45b\/0xaa0 kernel\/time\/hrtimer.c:1903<br \/>\n     local_apic_timer_interrupt arch\/x86\/kernel\/apic\/apic.c:1045 [inline]<br \/>\n     __sysvec_apic_timer_interrupt+0x102\/0x3e0 arch\/x86\/kernel\/apic\/apic.c:1062<br \/>\n     instr_sysvec_apic_timer_interrupt arch\/x86\/kernel\/apic\/apic.c:1056 [inline]<br \/>\n     sysvec_apic_timer_interrupt+0xa1\/0xc0 arch\/x86\/kernel\/apic\/apic.c:1056<\/p>\n<p>     asm_sysvec_apic_timer_interrupt+0x1a\/0x20 arch\/x86\/include\/asm\/idtentry.h:697<br \/>\n    RIP: 0010:__raw_spin_unlock_irqrestore include\/linux\/spinlock_api_smp.h:152 [inline]<br \/>\n    RIP: 0010:_raw_spin_unlock_irqrestore+0xa8\/0x110 kernel\/locking\/spinlock.c:194<br \/>\n    Code: 74 05 e8 0b f4 5f f6 48 c7 44 24 20 00 00 00 00 9c 8f 44 24 20 f6 44 24 21 02 75 4f f7 c3 00 02 00 00 74 01 fb bf 01 00 00 00  23 6b 27 f6 65 8b 05 7c 60 5a 07 85 c0 74 40 48 c7 04 24 0e 36<br \/>\n    RSP: 0018:ffffc900040a7320 EFLAGS: 00000206<br \/>\n    RAX: 5de15cb931505900 RBX: 0000000000000a06 RCX: 5de15cb931505900<br \/>\n    RDX: 0000000000000007 RSI: ffffffff8daa9dc3 RDI: 0000000000000001<br \/>\n    RBP: ffffc900040a73b0 R08: ffffffff8fc3d0<br \/>\n&#8212;truncated&#8212;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>KVM: x86: hyper-v: Clamp stimer deadline to avoid livelock<\/p>\n<p>Fix an issue where userspace or the guest can program an Hyper-V<br \/>\nsynthe<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-24614","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/24614","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=24614"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=24614"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=24614"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}