]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
netfilter: nft_inner: Fix IPv6 inner_thoff desync
authorYizhou Zhao <zhaoyz24@mails.tsinghua.edu.cn>
Mon, 11 May 2026 17:30:41 +0000 (01:30 +0800)
committerPablo Neira Ayuso <pablo@netfilter.org>
Sat, 16 May 2026 10:19:56 +0000 (12:19 +0200)
In nft_inner_parse_l2l3(), when processing inner IPv6 packets,
ipv6_find_hdr() correctly computes the transport header offset
traversing all extension headers, but the result is immediately
overwritten with nhoff + sizeof(_ip6h) (40 bytes), which only
accounts for the IPv6 base header. This creates a desync between
inner_thoff (wrong — points to extension header start) and l4proto
(correct — e.g., IPPROTO_TCP), enabling transport header forgery
and potential firewall bypass. This issue affects stable versions
from Linux 6.2.

For comparison, the normal (non-inner) IPv6 path correctly
preserves ipv6_find_hdr()'s result. Removing the incorrect overwrite
ensures that ipv6_find_hdr()'s calculated transport header offset is
preserved, thereby fixing the desynchronization.

Fixes: 3a07327d10a0 ("netfilter: nft_inner: support for inner tunnel header matching")
Cc: stable@vger.kernel.org
Reported-by: Yizhou Zhao <zhaoyz24@mails.tsinghua.edu.cn>
Reported-by: Yuxiang Yang <yangyx22@mails.tsinghua.edu.cn>
Reported-by: Xuewei Feng <fengxw06@126.com>
Reported-by: Qi Li <qli01@tsinghua.edu.cn>
Reported-by: Ke Xu <xuke@tsinghua.edu.cn>
Assisted-by: GLM:5.1 Z.ai
Signed-off-by: Yizhou Zhao <zhaoyz24@mails.tsinghua.edu.cn>
Reviewed-by: Fernando Fernandez Mancera <fmancera@suse.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
net/netfilter/nft_inner.c

index 03ffb1159fc183f5aa85a149fedbe135a89b9126..859aa38e333b8de673a41e2673a9dbfa0e9cd3e1 100644 (file)
@@ -163,7 +163,6 @@ static int nft_inner_parse_l2l3(const struct nft_inner *priv,
                        return -1;
 
                if (fragoff == 0) {
-                       thoff = nhoff + sizeof(_ip6h);
                        ctx->flags |= NFT_PAYLOAD_CTX_INNER_TH;
                        ctx->inner_thoff = thoff;
                        ctx->l4proto = l4proto;