mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-10-31 06:14:39 +01:00
netfilter: bpf: reject invalid NAT manipulation types
As bpf_ct_set_nat_info() is not validating the NAT manipulation type a
wrong value can be passed directly to nf_nat_setup_info(). This triggers
the WARN_ON() at nf_nat_setup_info() and if panic_on_warn isn't set,
then IPS_SRC_NAT_DONE is set without adding nat_bysource and conntrack
cleanup tries to unlink an uninitialized hlist node.
Fix this by checking that NAT manipulation type is correct before
calling nf_nat_setup_info(). In addition, if the WARN_ON is hit, return
NF_DROP instead of continuing with the processing to avoid similar
situations in the future.
Reported-by: VEGA <[email protected]>
Fixes: 0fabd2aa19 ("net: netfilter: add bpf_ct_set_nat_info kfunc helper")
Signed-off-by: Fernando Fernandez Mancera <[email protected]>
Signed-off-by: Pablo Neira Ayuso <[email protected]>
This commit is contained in:
1 parent
86b6471e69
commit
16d464013e
2 files changed
+6
-2
No files matched your search
@@ -39,6 +39,9 @@ __bpf_kfunc int bpf_ct_set_nat_info(struct nf_conn___init *nfct,
|
||||
if (proto != NFPROTO_IPV4 && proto != NFPROTO_IPV6)
|
||||
return -EINVAL;
|
||||
|
||||
if (manip != NF_NAT_MANIP_SRC && manip != NF_NAT_MANIP_DST)
|
||||
return -EINVAL;
|
||||
|
||||
memset(&range, 0, sizeof(struct nf_nat_range2));
|
||||
range.flags = NF_NAT_RANGE_MAP_IPS;
|
||||
range.min_addr = *addr;
|
||||
|
||||
@@ -767,8 +767,9 @@ nf_nat_setup_info(struct nf_conn *ct,
|
||||
if (nf_ct_is_confirmed(ct))
|
||||
return NF_ACCEPT;
|
||||
|
||||
WARN_ON(maniptype != NF_NAT_MANIP_SRC &&
|
||||
maniptype != NF_NAT_MANIP_DST);
|
||||
if (WARN_ON(maniptype != NF_NAT_MANIP_SRC &&
|
||||
maniptype != NF_NAT_MANIP_DST))
|
||||
return NF_DROP;
|
||||
|
||||
if (WARN_ON(nf_nat_initialized(ct, maniptype)))
|
||||
return NF_DROP;
|
||||
|
||||
Reference in new issue
Block a user