mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 12:44:03 +02:00
netfilter: nf_nat_sip: rewind offset when NAT shrinks the packet
sashiko says:
If map_addr() changes the packet length, such as when the public NAT IP
string is shorter or longer than the internal IP, coff will still point to
the offset relative to the pre-mangled packet.
If the packet shrinks, coff could overshoot the correct position,
potentially causing the next ct_sip_parse_header_uri() call to silently
skip bytes and miss subsequent Contact headers. Could this lead to a
failure to NAT those subsequent headers and leak internal network details?
Fixes: c978cd3a93 ("[NETFILTER]: nf_nat_sip: translate all Contact headers")
Assisted-by: Claude:claude-sonnet-4-6
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
parent
4172fd3697
commit
16aecbe303
|
|
@ -273,12 +273,17 @@ static unsigned int nf_nat_sip(struct sk_buff *skb, unsigned int protoff,
|
|||
SIP_HDR_CONTACT, &in_header,
|
||||
&matchoff, &matchlen,
|
||||
&addr, &port) > 0) {
|
||||
int old_len = skb->len, delta;
|
||||
|
||||
if (!map_addr(skb, protoff, dataoff, dptr, datalen,
|
||||
matchoff, matchlen,
|
||||
&addr, port)) {
|
||||
nf_ct_helper_log(skb, ct, "cannot mangle contact");
|
||||
return NF_DROP;
|
||||
}
|
||||
|
||||
delta = (int)skb->len - old_len;
|
||||
coff += delta;
|
||||
}
|
||||
|
||||
if (!map_sip_addr(skb, protoff, dataoff, dptr, datalen, SIP_HDR_FROM) ||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user