mirror of
https://github.com/torvalds/linux.git
synced 2026-10-24 16:55:02 +02: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 <vega@nebusec.ai>
Fixes: 0fabd2aa19 ("net: netfilter: add bpf_ct_set_nat_info kfunc helper")
Signed-off-by: Fernando Fernandez Mancera <fmancera@suse.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
parent
86b6471e69
commit
16d464013e
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user