{"id":24590,"date":"2026-09-16T20:32:31","date_gmt":"2026-09-16T12:32:31","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-89903"},"modified":"2026-09-16T20:32:31","modified_gmt":"2026-09-16T12:32:31","slug":"cve-2026-89903","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-89903","title":{"rendered":"CVE-2026-89903 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nLoongArch: Do not sav"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>LoongArch: Do not save\/restore percpu base register in rethook trampoline<\/p>\n<p>The rethook trampoline saves $r21 ($u0), the percpu base, into its frame<br \/>\nat entry and restores it at exit. Inbetween rethook_trampoline_handler()<br \/>\nmay schedule via preempt_enable_notrace().<\/p>\n<p>If the task migrates to another CPU, the frame&#8217;s $r21 holds the old<br \/>\nCPU&#8217;s percpu base, and restoring it poisons $r21 on the new CPU. Until<br \/>\nthe next user-&gt;kernel transition heals $r21, all this_cpu_*() accesses<br \/>\n(runqueues, RCU per-CPU data, timer tick programming, FPU ownership)<br \/>\nhit the wrong CPU&#8217;s percpu area.<\/p>\n<p>Under kretprobe-heavy preemptible load this can corrupt scheduler and<br \/>\ntimer state: scheduling-while-atomic splats, wrong-CPU RCU warnings,<br \/>\nWARN_ON_ONCE(rq != this_rq()) in nohz_balance_exit_idle(), and CPUs<br \/>\nparking in the idle loop with the constant timer never re-armed (hard<br \/>\nlockup). Reproduces on a Loongson-3A6000 with kretprobes on VFS paths<br \/>\nplus heavy file churn (OS install \/ unsquashfs).<\/p>\n<p>By convention $r21 always holds the current CPU&#8217;s percpu base in kernel<br \/>\nmode: SAVE_SOME() at exception entry reloads it only when coming from<br \/>\nuser mode, and RESTORE_SOME() restores it only when returning to user<br \/>\nmode; the context-switch path never writes it. Therefore the live $r21<br \/>\nat trampoline exit is already correct, and nothing inbetween can change<br \/>\nit legitimately (kernel C code cannot write a global register variable).<br \/>\nThe same flaw existed even in the pre-rethook kretprobe trampoline since<br \/>\nv6.3; it was carried over when rethook replaced it. Drop both the save<br \/>\nand the restore here. Drop the restore is enough to solve the issue, and<br \/>\ndrop the save is to keep the code tidy and no need to clear it.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>LoongArch: Do not save\/restore percpu base register in rethook trampoline<\/p>\n<p>The rethook trampoline saves $r21 ($u0), the percpu base<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-24590","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/24590","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=24590"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=24590"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=24590"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}