{"id":25467,"date":"2026-09-18T04:31:25","date_gmt":"2026-09-17T20:31:25","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-90058"},"modified":"2026-09-18T04:31:25","modified_gmt":"2026-09-17T20:31:25","slug":"cve-2026-90058","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-90058","title":{"rendered":"CVE-2026-90058 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nnet\/sched: bound qdis"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>net\/sched: bound qdisc_pkt_len to prevent qdisc soft lockup<\/p>\n<p>qdisc_get_stab() accepts a user-supplied size table, and<br \/>\n__qdisc_calculate_pkt_len() amplifies qdisc_pkt_len() through the<br \/>\noverhead, the size-table data (u16), and size_log (up to<br \/>\nSTAB_SIZE_LOG_MAX). A crafted stab can therefore set qdisc_pkt_len()<br \/>\nto ~1 GiB for an ordinary skb. Per-flow deficit schedulers such as<br \/>\nDRR and ETS replenish one quantum per loop iteration; with a tiny<br \/>\nquantum (1) they spin billions of times under the qdisc lock,<br \/>\nproducing a soft lockup \/ RCU stall as illustrated by vega@nebusec.ai.<\/p>\n<p>Cap the final qdisc_pkt_len() to QDISC_PKT_LEN_MAX so the size-table<br \/>\namplification cannot drive deficit schedulers into an unbounded loop.<br \/>\nA legitimate size table (e.g. qfq&#8217;s overhead 999999999, which is<br \/>\nhandled by dropping) is still accepted.<\/p>\n<p>Introduce cap QDISC_PKT_LEN_MAX (1 &lt;len<br \/>\nis GSO_MAX_SIZE (524280), and an ATM-style size table (53\/48 cell tax)<br \/>\namplifies that to ~578 KB, both comfortably below 1 MiB. At the same<br \/>\ntime, 1 MiB bounds the deficit refill loop to ~1M iterations per<br \/>\npacket with quantum=1, which completes in a few milliseconds well<br \/>\nunder the demonstrated softlockup threshold (~10^9 iterations).<\/p>\n<p>Conditions to recreate the bug:<br \/>\n&#8211; CONFIG_NET_SCHED=y, CONFIG_NET_SCH_DRR=y (or CONFIG_NET_SCH_ETS=y).<br \/>\n&#8211; Attach a DRR (or ETS) root qdisc with a crafted TCA_STAB that<br \/>\n  amplifies qdisc_pkt_len to ~1 GiB (e.g. size_log=15, data=[32768]).<br \/>\n&#8211; Add a class with a tiny quantum of 1 and send one small packet; the<br \/>\n  deficit loop spins billions of times under the qdisc lock and trips<br \/>\n  the softlockup detector (panic with kernel.softlockup_panic=1).<br \/>\n&#8211; Reachable as root or from an unprivileged user in a fresh user+net<br \/>\n  namespace (unshare -Urn) with namespace-local 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: bound qdisc_pkt_len to prevent qdisc soft lockup<\/p>\n<p>qdisc_get_stab() accepts a user-supplied size table, and<br \/>\n__qdisc_calcu<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-25467","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/25467","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=25467"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=25467"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=25467"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}