{"id":77074,"date":"2026-02-13T16:59:55","date_gmt":"2026-02-13T13:29:55","guid":{"rendered":"https:\/\/afaghhosting.net\/blog\/cve-2026-23111-netfilter-nf_tables-fix-inverted-genmask-check-in-nft_map_catchall_activate\/"},"modified":"2026-02-13T16:59:55","modified_gmt":"2026-02-13T13:29:55","slug":"cve-2026-23111-netfilter-nf_tables-fix-inverted-genmask-check-in-nft_map_catchall_activate","status":"publish","type":"post","link":"https:\/\/afaghhosting.net\/blog\/cve-2026-23111-netfilter-nf_tables-fix-inverted-genmask-check-in-nft_map_catchall_activate\/","title":{"rendered":"CVE-2026-23111 &#8211; netfilter: nf_tables: fix inverted genmask check in nft_map_catchall_activate()"},"content":{"rendered":"<p>CVE ID : CVE-2026-23111<\/p>\n<p>Published :  Feb. 13, 2026, 1:29 p.m. | 59\u00a0minutes ago<\/p>\n<p>Description : In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>netfilter: nf_tables: fix inverted genmask check in nft_map_catchall_activate()<\/p>\n<p>nft_map_catchall_activate() has an inverted element activity check<br \/>\ncompared to its non-catchall counterpart nft_mapelem_activate() and<br \/>\ncompared to what is logically required.<\/p>\n<p>nft_map_catchall_activate() is called from the abort path to re-activate<br \/>\ncatchall map elements that were deactivated during a failed transaction.<br \/>\nIt should skip elements that are already active (they don&#8217;t need<br \/>\nre-activation) and process elements that are inactive (they need to be<br \/>\nrestored). Instead, the current code does the opposite: it skips inactive<br \/>\nelements and processes active ones.<\/p>\n<p>Compare the non-catchall activate callback, which is correct:<\/p>\n<p>  nft_mapelem_activate():<br \/>\n    if (nft_set_elem_active(ext, iter-&gt;genmask))<br \/>\n        return 0;   \/* skip active, process inactive *\/<\/p>\n<p>With the buggy catchall version:<\/p>\n<p>  nft_map_catchall_activate():<br \/>\n    if (!nft_set_elem_active(ext, genmask))<br \/>\n        continue;   \/* skip inactive, process active *\/<\/p>\n<p>The consequence is that when a DELSET operation is aborted,<br \/>\nnft_setelem_data_activate() is never called for the catchall element.<br \/>\nFor NFT_GOTO verdict elements, this means nft_data_hold() is never<br \/>\ncalled to restore the chain-&gt;use reference count. Each abort cycle<br \/>\npermanently decrements chain-&gt;use. Once chain-&gt;use reaches zero,<br \/>\nDELCHAIN succeeds and frees the chain while catchall verdict elements<br \/>\nstill reference it, resulting in a use-after-free.<\/p>\n<p>This is exploitable for local privilege escalation from an unprivileged<br \/>\nuser via user namespaces + nftables on distributions that enable<br \/>\nCONFIG_USER_NS and CONFIG_NF_TABLES.<\/p>\n<p>Fix by removing the negation so the check matches nft_mapelem_activate():<br \/>\nskip active elements, process inactive ones.<\/p>\n<p>Severity: 0.0 | NA<\/p>\n<p>Visit the link for more details, such as CVSS details, affected products, timeline, and more&#8230;\u00a0<\/p>\n","protected":false},"excerpt":{"rendered":"<p>CVE ID : CVE-2026-23111 Published : Feb. 13, 2026, 1:29 p.m. | 59\u00a0minutes ago Description : In the Linux kernel, the following vulnerability has been resolved: netfilter: nf_tables: fix inverted genmask check in nft_map_catchall_activate() nft_map_catchall_activate() has an inverted element activity check compared to its non-catchall counterpart nft_mapelem_activate() and compared to what is logically required. nft_map_catchall_activate() &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26],"tags":[],"class_list":["post-77074","post","type-post","status-publish","format-standard","hentry","category-vulnerability"],"_links":{"self":[{"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/posts\/77074","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/comments?post=77074"}],"version-history":[{"count":0,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/posts\/77074\/revisions"}],"wp:attachment":[{"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/media?parent=77074"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/categories?post=77074"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/tags?post=77074"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}