From: Yu Junzhe <junzheyu1@gmail.com>
To: stable@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Sasha Levin <sashal@kernel.org>,
Pablo Neira Ayuso <pablo@netfilter.org>,
Florian Westphal <fw@strlen.de>,
netfilter-devel@vger.kernel.org
Subject: [PATCH request stable 6.12 6.6 6.1] netfilter: nf_tables_netdev_event UAF of binding chain
Date: Fri, 25 Sep 2026 02:00:25 +0000 [thread overview]
Message-ID: <20260925020025.616-1-junzheyu1@gmail.com> (raw)
Hello,
Please consider a backport of the following use-after-free to the
longterm trees that still have it: 6.12, 6.6, and 6.1. 6.18 and newer
are not affected.
There is no single upstream commit to cherry-pick. On current linux.git
the netdev notifier no longer calls __nft_release_basechain(); it only
unregisters the per-device hook. That change arrived as part of the
netdev-hook rework and does not apply to these stable trees.
Bug
===
nf_tables_netdev_event() walks table->chains with
list_for_each_entry_safe. On NETDEV_UNREGISTER of the last hook,
nft_netdev_event() calls __nft_release_basechain(). Releasing the base
chain deactivates a JUMP to an NFT_CHAIN_BINDING chain, which
nft_chain_del()s that successor and nft_immediate_destroy() kfree()s
it. The walker's saved nr still points at the freed nft_chain.
Still present in:
linux-6.12.y (6.12.111) nft_chain_filter.c: __nft_release_basechain()
linux-6.6.y (6.6.157)
linux-6.1.y (6.1.188)
Gone in linux-6.18.y and linux-7.0.y.
Reproducer (nftables 1.0.9)
===========================
An anonymous jump is what sets NFT_CHAIN_BINDING (chain flags 0x4).
Commit the base chain first, then add the jump in a second command.
Chains are appended to table->chains, and the walker frees the chain
that follows the base chain. One nft -f that contains both creates the
binding chain first and does not hit this path.
ip link add br0 type bridge
ip link set br0 up
nft -f - <<'EOF'
table netdev t {
chain in {
type filter hook ingress device "br0" priority 0; policy accept;
}
}
EOF
nft add rule netdev t in 'jump { accept; }'
ip link del br0
The namespace must still be alive. Netns teardown is too late: nft
pernet exit wins that race. Needs CAP_NET_ADMIN. Do not run on a host
kernel.
Confirmed on Linux 6.6.144 KASAN (same __nft_release_basechain() walk
as 6.6.y and 6.12.y). I have not booted 6.12.111 or 6.1.188.
BUG: KASAN: slab-use-after-free in nf_tables_netdev_event+0x635/0x970
Read of size 8 at addr ff110000037faa20 by task ip/229
Freed by task 229:
nft_immediate_destroy
__nft_release_basechain_now
__nft_release_basechain
nf_tables_netdev_event
The read is 8 bytes at offset 32 of a kmalloc-128 object
(nft_chain.list).
Thanks,
Yu Junzhe
FuzzAnything <fuzzanything@gmail.com>
next reply other threads:[~2026-09-25 2:00 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-25 2:00 Yu Junzhe [this message]
2026-09-25 5:07 ` [PATCH request stable 6.12 6.6 6.1] netfilter: nf_tables_netdev_event UAF of binding chain Greg Kroah-Hartman
2026-09-25 7:51 ` Yu Junzhe
2026-09-25 7:51 ` [PATCH 6.12 1/2] netfilter: nf_tables: Tolerate chains with no remaining hooks Yu Junzhe
2026-09-25 7:51 ` [PATCH 6.12 2/2] netfilter: nf_tables: Simplify chain netdev notifier Yu Junzhe
2026-09-25 7:51 ` [PATCH 6.6 6.1 1/2] netfilter: nf_tables: Tolerate chains with no remaining hooks Yu Junzhe
2026-09-25 18:47 ` Sasha Levin
2026-10-01 3:51 ` [PATCH 6.1] netfilter: nf_tables: fix UAF in nf_tables_netdev_event walker Ma Xinmeng
2026-10-01 8:46 ` Pablo Neira Ayuso
2026-10-02 4:25 ` [PATCH 6.1 1/2] netfilter: nf_tables: allow to create netdev chain without device Ma Xinmeng
2026-10-02 21:10 ` Sasha Levin
2026-10-02 21:44 ` Pablo Neira Ayuso
[not found] ` <20261002042509.711-1-1564938642@qq.com>
2026-10-02 4:25 ` [PATCH 6.1 2/2] netfilter: nf_tables: support for adding new devices to an existing netdev chain Ma Xinmeng
2026-09-25 7:51 ` [PATCH 6.6 6.1 2/2] netfilter: nf_tables: Simplify chain netdev notifier Yu Junzhe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260925020025.616-1-junzheyu1@gmail.com \
--to=junzheyu1@gmail.com \
--cc=fw@strlen.de \
--cc=gregkh@linuxfoundation.org \
--cc=netfilter-devel@vger.kernel.org \
--cc=pablo@netfilter.org \
--cc=sashal@kernel.org \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.