{"id":25508,"date":"2026-09-18T04:31:29","date_gmt":"2026-09-17T20:31:29","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-90099"},"modified":"2026-09-18T04:31:29","modified_gmt":"2026-09-17T20:31:29","slug":"cve-2026-90099","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-90099","title":{"rendered":"CVE-2026-90099 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nnet\/sched: account cl"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>net\/sched: account classifier filter allocations to memcg<\/p>\n<p>Allocations in the tc classifier *_change() paths (filter objects,<br \/>\nper-CPU counters, and per-filter aux data) use plain GFP_KERNEL without<br \/>\n__GFP_ACCOUNT, allowing unprivileged users to pin kernel memory outside<br \/>\nmemcg charging. The shared tcf_exts_init_ex() action array allocation in<br \/>\ncls_api.c was also uncharged; this patch closes it along with the<br \/>\nper-classifier filter-object\/percpu\/aux allocations that remain<br \/>\nunaccounted.<\/p>\n<p>Add GFP_KERNEL_ACCOUNT to:<br \/>\n&#8211; the shared tcf_exts_init_ex() action array (cls_api.c), common to every<br \/>\n  filter of every classifier (32 pointers, 256 bytes);<br \/>\n&#8211; the filter-object, per-CPU-counter, and per-filter aux allocations in<br \/>\n  cls_basic, cls_bpf, cls_cgroup, cls_flow, cls_flower, cls_fw,<br \/>\n  cls_matchall, cls_route and cls_u32;<br \/>\n&#8211; the u32_init_knode() replace-path knode allocation (cls_u32.c), which<br \/>\n  allocates the same struct tc_u_knode + sel.keys on every replace of an<br \/>\n  existing knode and was missed by the create-path-only conversion.<\/p>\n<p>Also fix the cls_basic error path: basic_change() inserts fnew into the<br \/>\nIDR before allocating the per-CPU counter. If alloc_percpu() fails the<br \/>\nerrout path kfree&#8217;d fnew without idr_remove, leaving a dangling pointer<br \/>\nin the IDR. With GFP_KERNEL_ACCOUNT the percpu alloc becomes failable<br \/>\non demand (memcg at memory.max), making the dead path attacker-reachable<br \/>\nand burning the handle permanently. Add the idr_remove on the percpu<br \/>\nfailure path, matching the basic_set_parms failure-path pattern.<\/p>\n<p>Note: vega@nebusec.ai provided a poc for basic_cls, but it was easy to<br \/>\nextend to the other classifiers.<\/p>\n<p>Conditions to recreate the bug:<br \/>\n&#8211; CONFIG_NET_SCHED, CONFIG_NET_CLS_* (the classifier being used),<br \/>\n  CONFIG_NET_CLS_ACT, CONFIG_MEMCG, CONFIG_USER_NS, CONFIG_NET_NS.<br \/>\n&#8211; Unprivileged user in a fresh user+network namespace (unshare -Urn),<br \/>\n  or root with CAP_NET_ADMIN.<br \/>\n&#8211; Create a large number of tc filters (e.g. tc filter add dev lo<br \/>\n  ingress &#8230;  &#8230;) while watching a memcg-limited cgroup:<br \/>\n  system slab grows far faster than memory.current, pinning kernel<br \/>\n  memory outside memcg charging.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>net\/sched: account classifier filter allocations to memcg<\/p>\n<p>Allocations in the tc classifier *_change() paths (filter objects,<br \/>\nper-C<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-25508","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/25508","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=25508"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=25508"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=25508"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}