{"id":25462,"date":"2026-09-18T04:31:25","date_gmt":"2026-09-17T20:31:25","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-90053"},"modified":"2026-09-18T04:31:25","modified_gmt":"2026-09-17T20:31:25","slug":"cve-2026-90053","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-90053","title":{"rendered":"CVE-2026-90053 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nnet\/sched: sch_htb: l"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>net\/sched: sch_htb: limit htb_classify inner-class filter hops<\/p>\n<p>htb_classify() follows each filter-selected inner class by switching<br \/>\nto cl-&gt;filter_list, but never bounds the number of hops. A filter on<br \/>\nan inner class can point back to itself or to another inner class that<br \/>\npoints back, creating an infinite loop in the packet classification<br \/>\npath with the qdisc lock held and BH disabled \u2014 a soft lockup \/ panic<br \/>\nfrom a single packet.<\/p>\n<p>Bound the traversal with a hop counter and drop the packet with a<br \/>\nrate-limited warning once the bound is exceeded. The counter is<br \/>\nincremented at the point the inner filter chain is picked up, after the<br \/>\nTC_ACT_* switch has consumed the classifier verdict, so a terminal<br \/>\nTC_ACT_QUEUED\/STOLEN\/TRAP on the last permitted chain still sets *qerr<br \/>\nto __NET_XMIT_STOLEN and the packet is not charged as a drop by this<br \/>\nqdisc or its parent.<\/p>\n<p>The bound is TC_HTB_MAXDEPTH, taken from HTB&#8217;s own parameters rather than<br \/>\nfrom the qdisc hierarchy depth limit. Class levels run from 0 to<br \/>\nTC_HTB_MAXDEPTH &#8211; 1, so a traversal that strictly descends in level can<br \/>\ntake at most TC_HTB_MAXDEPTH hops. That descent is what a sane<br \/>\nconfiguration does, but it is assumed here rather than enforced:<br \/>\nhtb_find() resolves a classid against every class in the qdisc, so a<br \/>\nfilter may equally select a sibling or an ancestor. The normal<br \/>\nroot -&gt; inner -&gt; leaf path takes a single hop, so the bound does not<br \/>\naffect legitimate classification.<\/p>\n<p>htb_classify() can now return NULL irrespective of CONFIG_NET_CLS_ACT,<br \/>\nwhereas previously every NULL return sat inside that ifdef. The NULL<br \/>\nhandler in htb_enqueue() therefore cannot stay conditional either, so<br \/>\ndrop the ifdef around it. This matches hfsc_enqueue(), which has always<br \/>\nhandled a NULL class unconditionally. Without it, a kernel built<br \/>\nwithout actions would dereference a NULL class instead of dropping.<\/p>\n<p>Conditions to recreate the bug:<br \/>\n&#8211; CONFIG_NET_SCHED, CONFIG_NET_SCH_HTB, CONFIG_NET_CLS_U32,<br \/>\n  CONFIG_LOCKUP_DETECTOR.<br \/>\n&#8211; Create an HTB qdisc on a device (e.g. lo), add an inner class<br \/>\n  1:1 with a leaf child 1:10, install a root u32 filter selecting<br \/>\n  1:1, and an inner-class u32 filter on 1:1 also selecting 1:1.<br \/>\n&#8211; Send one packet (ping). On the unfixed kernel the classify loop<br \/>\n  spins with the qdisc lock 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_htb: limit htb_classify inner-class filter hops<\/p>\n<p>htb_classify() follows each filter-selected inner class by switchin<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-25462","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/25462","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=25462"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=25462"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=25462"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}