All of lore.kernel.org
 help / color / mirror / Atom feed
From: Fernando Fernandez Mancera <fmancera@suse.de>
To: Jiayuan Chen <jiayuan.chen@linux.dev>, netdev@vger.kernel.org
Cc: stable@vger.kernel.org, "David S. Miller" <davem@davemloft.net>,
	Eric Dumazet <edumazet@kernel.org>,
	Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
	Simon Horman <horms@kernel.org>, David Ahern <dsahern@kernel.org>,
	Ido Schimmel <idosch@nvidia.com>,
	Kuniyuki Iwashima <kuniyu@google.com>,
	Joel Granados <joel.granados@kernel.org>,
	Chia-Yu Chang <chia-yu.chang@nokia-bell-labs.com>,
	Wyatt Feng <bronzed_45_vested@icloud.com>,
	Yung Chih Su <yuuchihsu@gmail.com>,
	Hannes Frederic Sowa <hannes@stressinduktion.org>,
	Flavio Leitner <fbl@redhat.com>,
	"Paul E. McKenney" <paulmck@kernel.org>,
	Petr Mladek <pmladek@suse.com>,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH net 2/5] ipv4: fix shift-out-of-bounds in ip_rt_send_redirect()
Date: Fri, 23 Oct 2026 16:11:25 +0200	[thread overview]
Message-ID: <5dda588d-e6fa-420d-a73d-b5278094b59c@suse.de> (raw)
In-Reply-To: <20261023091419.167088-3-jiayuan.chen@linux.dev>

On 10/23/26 11:13 AM, Jiayuan Chen wrote:
> ip_rt_redirect_number is the max number of ICMP Redirects we send to one
> endpoint; once we hit it we stop. Before that, ip_rt_redirect_load gives
> the redirects an exponential backoff:
> 
> 	if (peer->n_redirects == 0 ||
> 	    time_after(jiffies,
> 		       (peer->rate_last +
> 			(ip_rt_redirect_load << peer->n_redirects)))) {
> 
> n_redirects only stops growing when it reaches ip_rt_redirect_number, and
> both redirect_number and redirect_load are plain proc_dointvec sysctls
> with no upper bound. Set redirect_number past 32 and n_redirects climbs
> past 31, so "ip_rt_redirect_load << peer->n_redirects" shifts a 32-bit
> int by >= 32 bits, which is UB:
> 
>    UBSAN: shift-out-of-bounds in net/ipv4/route.c:949:6
>    shift exponent 32 is too large for 32-bit type 'int'
>    CPU: 1 UID: 0 PID: 1845 Comm: ping Not tainted 7.3.0-rc7+ #364 PREEMPT
>    Call Trace:
>     <IRQ>
>     dump_stack_lvl+0xc1/0xf0
>     dump_stack+0x10/0x20
>     __ubsan_handle_shift_out_of_bounds+0x1d1/0x390
>     ip_rt_send_redirect.cold+0x2c/0x146
>     ip_forward+0x1ddc/0x2430
>     ip_rcv+0x2b1/0x320
>     __netif_receive_skb_one_core+0x16b/0x1c0
>     __netif_receive_skb+0x21/0x150
>     process_backlog+0x37e/0x1200
>     __napi_poll.constprop.0+0xa5/0x5e0
>     net_rx_action+0x4c0/0xf70
> 
> Fixing this from the sysctl side would mean bounding both knobs, e.g.
> redirect_load to [0, 65535] and redirect_number to [0, 16], which gets
> in the way of users who legitimately do not want to cap ICMP redirects.
> Instead compute the backoff in u64 with the shift count capped at 31,
> which cannot overflow since ip_rt_redirect_load is an int, and clamp the
> result to MAX_JIFFY_OFFSET.
> 

I think we should cap redirect_load with a minimum valid value of 0 on 
the sysctl. If the user want to disable ICMP redirects or do not cap 
them, they should use 0 or -1 in redirect_number IMHO.

What do you think?

> The clamp also fixes 32-bit kernels, where the same expression goes
> wrong long before the shift count reaches 32. With the default
> ip_rt_redirect_load of 20, from n_redirects == 27 on the result is
> either truncated or too large for time_after(), which then treats the
> deadline as already passed, and from 30 on it is 0, so every forwarded
> packet gets a redirect again until ip_rt_redirect_number is reached.
> This needs a raised redirect_silence to be reachable, otherwise
> n_redirects is reset long before. On 64-bit, ip_rt_redirect_load << 31
> stays below MAX_JIFFY_OFFSET, so nothing changes there.
> 

Isn't the same issue in 64-bit kernels too? In essence, it would be (int 
<< u32) which results in a negative value and that is later 
sign-extended to a corrupted 64-bit value. Am I missing something here?

> Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
> Cc: stable@vger.kernel.org
> Signed-off-by: Jiayuan Chen <jiayuan.chen@linux.dev>
> ---
>   net/ipv4/route.c | 7 ++++---
>   1 file changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/net/ipv4/route.c b/net/ipv4/route.c
> index 595a3b7f1783..76807b757046 100644
> --- a/net/ipv4/route.c
> +++ b/net/ipv4/route.c
> @@ -907,6 +907,7 @@ void ip_rt_send_redirect(struct sk_buff *skb)
>   	struct inet_peer *peer;
>   	int log_martians;
>   	struct net *net;
> +	u64 backoff;
>   	int vif;
>   
>   	rcu_read_lock();
> @@ -945,10 +946,10 @@ void ip_rt_send_redirect(struct sk_buff *skb)
>   	/* Check for load limit; set rate_last to the latest sent
>   	 * redirect.
>   	 */
> +	backoff = (u64)ip_rt_redirect_load << min(peer->n_redirects, 31U);
> +	backoff = min_t(u64, backoff, MAX_JIFFY_OFFSET);
>   	if (peer->n_redirects == 0 ||
> -	    time_after(jiffies,
> -		       (peer->rate_last +
> -			(ip_rt_redirect_load << peer->n_redirects)))) {
> +	    time_after(jiffies, peer->rate_last + (unsigned long)backoff)) {
>   		__be32 gw = rt_nexthop(rt, ip_hdr(skb)->daddr);
>   
>   		icmp_send(skb, ICMP_REDIRECT, ICMP_REDIR_HOST, gw);


  reply	other threads:[~2026-10-23 14:12 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-23  9:13 [PATCH net 0/5] net: fix misc signed overflows caused by bad sysctl values Jiayuan Chen
2026-10-23  9:13 ` [PATCH net 1/5] ipv6: restrict gc_elasticity to 31 Jiayuan Chen
2026-10-23 13:31   ` Fernando Fernandez Mancera
2026-10-26 12:15   ` netdev-bot+sashiko
2026-10-27  5:18   ` Kuniyuki Iwashima
2026-10-23  9:13 ` [PATCH net 2/5] ipv4: fix shift-out-of-bounds in ip_rt_send_redirect() Jiayuan Chen
2026-10-23 14:11   ` Fernando Fernandez Mancera [this message]
2026-10-23 14:38     ` Jiayuan Chen
2026-10-26 12:15   ` netdev-bot+sashiko
2026-10-23  9:13 ` [PATCH net 3/5] ipv6: restrict mld_qrv to 255 Jiayuan Chen
2026-10-23 14:13   ` Fernando Fernandez Mancera
2026-10-26 12:15   ` netdev-bot+sashiko
2026-10-27  5:24   ` Kuniyuki Iwashima
2026-10-23  9:13 ` [PATCH net 4/5] ipv4: restrict igmp_qrv " Jiayuan Chen
2026-10-23 14:14   ` Fernando Fernandez Mancera
2026-10-26 12:15   ` netdev-bot+sashiko
2026-10-27  5:25   ` Kuniyuki Iwashima
2026-10-23  9:13 ` [PATCH net 5/5] net: restrict message_cost and message_burst to non-negative values Jiayuan Chen
2026-10-23 12:19   ` Joel Granados
2026-10-23 12:55     ` Fernando Fernandez Mancera
2026-10-23 14:30       ` Jiayuan Chen

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=5dda588d-e6fa-420d-a73d-b5278094b59c@suse.de \
    --to=fmancera@suse.de \
    --cc=bronzed_45_vested@icloud.com \
    --cc=chia-yu.chang@nokia-bell-labs.com \
    --cc=davem@davemloft.net \
    --cc=dsahern@kernel.org \
    --cc=edumazet@kernel.org \
    --cc=fbl@redhat.com \
    --cc=hannes@stressinduktion.org \
    --cc=horms@kernel.org \
    --cc=idosch@nvidia.com \
    --cc=jiayuan.chen@linux.dev \
    --cc=joel.granados@kernel.org \
    --cc=kuba@kernel.org \
    --cc=kuniyu@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=paulmck@kernel.org \
    --cc=pmladek@suse.com \
    --cc=stable@vger.kernel.org \
    --cc=yuuchihsu@gmail.com \
    /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.