All of lore.kernel.org
 help / color / mirror / Atom feed
From: Pablo Neira Ayuso <pablo@netfilter.org>
To: Weiming Shi <bestswngs@gmail.com>
Cc: Florian Westphal <fw@strlen.de>,
	"David S . Miller" <davem@davemloft.net>,
	Eric Dumazet <edumazet@google.com>,
	Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
	Phil Sutter <phil@nwl.cc>, Simon Horman <horms@kernel.org>,
	netfilter-devel@vger.kernel.org, coreteam@netfilter.org,
	netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
	Xiang Mei <xmei5@asu.edu>
Subject: Re: [PATCH nf] netfilter: nf_conntrack_sip: fix use of uninitialized rtp_addr in process_sdp
Date: Thu, 26 Mar 2026 21:21:43 +0100	[thread overview]
Message-ID: <acWVV__8xRMezYrU@chamomile> (raw)
In-Reply-To: <20260323080727.2932866-3-bestswngs@gmail.com>

On Mon, Mar 23, 2026 at 04:07:29PM +0800, Weiming Shi wrote:
> process_sdp() declares union nf_inet_addr rtp_addr on the stack and
> passes it to the nf_nat_sip sdp_session hook after walking the SDP
> media descriptions. However rtp_addr is only initialized inside the
> media loop when a recognized media type with a non-zero port is found.
> 
> If the SDP body contains no m= lines, only inactive media sections
> (m=audio 0 ...) or only unrecognized media types, rtp_addr is never
> assigned. Despite that, the function still calls hooks->sdp_session()
> with &rtp_addr, causing nf_nat_sdp_session() to format the stale stack
> value as an IP address and rewrite the SDP session owner and connection
> lines with it.
> 
> With CONFIG_INIT_STACK_ALL_ZERO (default on most distributions) this
> results in the session-level o= and c= addresses being rewritten to
> 0.0.0.0 for inactive SDP sessions. Without stack auto-init the
> rewritten address is whatever happened to be on the stack.
> 
> Fix this by pre-initializing rtp_addr from the session-level connection
> address (caddr) when available, and tracking via a have_rtp_addr flag
> whether any valid address was established. Skip the sdp_session hook
> entirely when no valid address exists.
> 
> Fixes: 4ab9e64e5e3c ("[NETFILTER]: nf_nat_sip: split up SDP mangling")
> Reported-by: Xiang Mei <xmei5@asu.edu>
> Signed-off-by: Weiming Shi <bestswngs@gmail.com>
> ---
>  net/netfilter/nf_conntrack_sip.c | 14 ++++++++++----
>  1 file changed, 10 insertions(+), 4 deletions(-)
> 
> diff --git a/net/netfilter/nf_conntrack_sip.c b/net/netfilter/nf_conntrack_sip.c
> index 4ab5ef71d96db..17af0ff4ea7ab 100644
> --- a/net/netfilter/nf_conntrack_sip.c
> +++ b/net/netfilter/nf_conntrack_sip.c
> @@ -1040,6 +1040,7 @@ static int process_sdp(struct sk_buff *skb, unsigned int protoff,
>  	unsigned int port;
>  	const struct sdp_media_type *t;
>  	int ret = NF_ACCEPT;
> +	bool have_rtp_addr = false;
>  
>  	hooks = rcu_dereference(nf_nat_sip_hooks);
>  
> @@ -1056,8 +1057,11 @@ static int process_sdp(struct sk_buff *skb, unsigned int protoff,
>  	caddr_len = 0;
>  	if (ct_sip_parse_sdp_addr(ct, *dptr, sdpoff, *datalen,
>  				  SDP_HDR_CONNECTION, SDP_HDR_MEDIA,
> -				  &matchoff, &matchlen, &caddr) > 0)
> +				  &matchoff, &matchlen, &caddr) > 0) {
>  		caddr_len = matchlen;
> +		memcpy(&rtp_addr, &caddr, sizeof(rtp_addr));
> +		have_rtp_addr = true;
> +	}
>  
>  	mediaoff = sdpoff;
>  	for (i = 0; i < ARRAY_SIZE(sdp_media_types); ) {
> @@ -1091,9 +1095,11 @@ static int process_sdp(struct sk_buff *skb, unsigned int protoff,
>  					  &matchoff, &matchlen, &maddr) > 0) {
>  			maddr_len = matchlen;
>  			memcpy(&rtp_addr, &maddr, sizeof(rtp_addr));
> -		} else if (caddr_len)
> +			have_rtp_addr = true;
> +		} else if (caddr_len) {
>  			memcpy(&rtp_addr, &caddr, sizeof(rtp_addr));
> -		else {
> +			have_rtp_addr = true;

After this update, this loop sets over rtp_addr, but this was already
set by ct_sip_parse_sdp_addr() a bit above.

This new chunk results in:

                } else if (caddr_len) {
                       memcpy(&rtp_addr, &caddr, sizeof(rtp_addr));
                       have_rtp_addr = true;

which is not needed? Why does caddr need to be copied over and over
again to rtp_addr?

> +		} else {
>  			nf_ct_helper_log(skb, ct, "cannot parse SDP message");
>  			return NF_DROP;
>  		}

  reply	other threads:[~2026-03-26 20:21 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-23  8:07 [PATCH nf] netfilter: nf_conntrack_sip: fix use of uninitialized rtp_addr in process_sdp Weiming Shi
2026-03-26 20:21 ` Pablo Neira Ayuso [this message]
2026-03-26 20:44   ` Florian Westphal
2026-03-26 21:39     ` Pablo Neira Ayuso

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=acWVV__8xRMezYrU@chamomile \
    --to=pablo@netfilter.org \
    --cc=bestswngs@gmail.com \
    --cc=coreteam@netfilter.org \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=fw@strlen.de \
    --cc=horms@kernel.org \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=netfilter-devel@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=phil@nwl.cc \
    --cc=xmei5@asu.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.