{"id":41082,"date":"2026-10-19T00:32:04","date_gmt":"2026-10-18T16:32:04","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-98610"},"modified":"2026-10-19T00:32:04","modified_gmt":"2026-10-18T16:32:04","slug":"cve-2026-98610","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-98610","title":{"rendered":"CVE-2026-98610 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nnet\/sched: sch_hfsc:"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>net\/sched: sch_hfsc: bound the classify inner-filter walk with a drift budget<\/p>\n<p>hfsc_classify() applies the &#8220;filter may only point downwards&#8221; level check<br \/>\nonly when the filter result carries no bound class. A filter created with<br \/>\na flowid gets res.class set once at bind time, so the check never runs for<br \/>\nit during classification. hfsc_adjust_levels() can later raise a class&#8217;s<br \/>\nlevel without revalidating existing bindings, leaving two binds that were<br \/>\neach legal at bind time pointing at each other; the classify walk then<br \/>\nbounces between two interior classes forever with the qdisc lock held and<br \/>\nBH disabled \u2014 a soft lockup from a single packet. The stuck walk trips<br \/>\nthe watchdog:<\/p>\n<p>  watchdog: BUG: soft lockup &#8211; CPU#3 stuck for 13s! [ping:444]<br \/>\n  RIP: 0010:u32_classify+0x542\/0x17f0<br \/>\n  &#8230;<br \/>\n  tcf_classify+0x66\/0xa0<br \/>\n  hfsc_enqueue+0x166\/0xdf0<\/p>\n<p>Bound the traversal with a budget of non-descending hops, the only way a<br \/>\nconfigured walk can move without descending the class tree once levels<br \/>\ndrift after bind time. The budget is cumulative over the whole walk and<br \/>\nis deliberately not reset on a descending hop: a chain that alternates a<br \/>\ndescent with a lateral hop would return the budget every lap and never<br \/>\ntrip. Descending hops never decrement it, so legitimately deep trees are<br \/>\nunaffected and a terminating lateral chain still classifies normally.<br \/>\nDrop the packet with a rate-limited warning once the budget is exhausted,<br \/>\nmirroring the merged HTB fix.<\/p>\n<p>This is a follow-up to commit 729c4896ab82 (&#8220;net\/sched: sch_htb: limit<br \/>\nhtb_classify inner-class filter hops&#8221;), which bounded the same classify<br \/>\nloop on the HTB side but left the HFSC walk unbounded.<\/p>\n<p>Conditions to recreate the bug:<br \/>\n&#8211; CONFIG_NET_SCHED, CONFIG_NET_SCH_HFSC, CONFIG_NET_CLS_U32,<br \/>\n  CONFIG_LOCKUP_DETECTOR.<br \/>\n&#8211; Build a cycle with two legal-at-bind-time flowid binds and a level<br \/>\n  drift: class X 1:1 (child of root) with leaf child 1:10; class Y 1:2<br \/>\n  (sibling of X) with children 1:20 and 1:200; root u32 filter flowid<br \/>\n  1:1; filter on X flowid 1:2 (legal when Y is a leaf); after Y&#8217;s level<br \/>\n  rises to 2, filter on Y flowid 1:1 (legal then). Send one packet (ping<br \/>\n  on the device). Unfixed kernel: classify spins with the qdisc lock<br \/>\n  held; with softlockup_panic=1 it panics.<br \/>\n&#8211; Reachable from unprivileged user via unshare -Urn (CAP_NET_ADMIN).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>net\/sched: sch_hfsc: bound the classify inner-filter walk with a drift budget<\/p>\n<p>hfsc_classify() applies the &#8220;filter may only point d<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-41082","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/41082","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=41082"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=41082"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=41082"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}