]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
netfilter: ip6t_hbh: reject oversized option lists
authorZhengchuan Liang <zcliangcn@gmail.com>
Wed, 13 May 2026 07:57:17 +0000 (15:57 +0800)
committerPablo Neira Ayuso <pablo@netfilter.org>
Sat, 16 May 2026 11:21:41 +0000 (13:21 +0200)
struct ip6t_opts stores at most IP6T_OPTS_OPTSNR option descriptors,
but hbh_mt6_check() does not reject larger optsnr values supplied from
userspace.

Validate optsnr in the rule setup path so only match data that fits the
fixed-size opts array can be installed. This follows the existing xtables
pattern of rejecting invalid user-provided counts in checkentry() and
keeps the packet matching path unchanged.

`struct ip6t_opts` has a fixed `opts[IP6T_OPTS_OPTSNR]` array,
where `IP6T_OPTS_OPTSNR` is 16, then off-by-one array access is possible:

[  137.924693][ T8692] UBSAN: array-index-out-of-bounds in ../net/ipv6/netfilter/ip6t_hbh.c:110:29
[  137.926167][ T8692] index 16 is out of range for type '__u16 [16]'

Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Cc: stable@kernel.org
Reported-by: Yuan Tan <yuantan098@gmail.com>
Reported-by: Yifan Wu <yifanwucs@gmail.com>
Reported-by: Juefei Pu <tomapufckgml@gmail.com>
Reported-by: Xin Liu <bird@lzu.edu.cn>
Signed-off-by: Zhengchuan Liang <zcliangcn@gmail.com>
Signed-off-by: Ren Wei <n05ec@lzu.edu.cn>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
net/ipv6/netfilter/ip6t_hbh.c

index e7a3fb9355ee340e151e6cacad9c73566f8787be..450dd53846a2f77b81cb863fc62ad0236065f9c4 100644 (file)
@@ -168,6 +168,10 @@ static int hbh_mt6_check(const struct xt_mtchk_param *par)
                pr_debug("unknown flags %X\n", optsinfo->invflags);
                return -EINVAL;
        }
+       if (optsinfo->optsnr > IP6T_OPTS_OPTSNR) {
+               pr_debug("too many supported opts specified\n");
+               return -EINVAL;
+       }
 
        if (optsinfo->flags & IP6T_OPTS_NSTRICT) {
                pr_debug("Not strict - not implemented");