diff mbox series

icmp: randomize the global rate limiter

Message ID 20210222175500.6189-2-tim.gardner@canonical.com
State New
Headers show
Series icmp: randomize the global rate limiter | expand

Commit Message

Tim Gardner Feb. 22, 2021, 5:55 p.m. UTC
From: Eric Dumazet <edumazet@google.com>

BugLink: https://bugs.launchpad.net/bugs/1902115

[ Upstream commit b38e7819cae946e2edf869e604af1e65a5d241c5 ]

Keyu Man reported that the ICMP rate limiter could be used
by attackers to get useful signal. Details will be provided
in an upcoming academic publication.

Our solution is to add some noise, so that the attackers
no longer can get help from the predictable token bucket limiter.

Fixes: 4cdf507d5452 ("icmp: add a global rate limitation")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Reported-by: Keyu Man <kman001@ucr.edu>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Ian May <ian.may@canonical.com>
(cherry picked from focal/oracle-5.4 commit fc3d57b1e860f9bdd97bbbf14f1617e718fae7f3)
CVE-2020-25705
Signed-off-by: Tim Gardner <tim.gardner@canonical.com>

back port notes: This was a clean cherry pick of the Focal oracle-5.4 backport.
---
 Documentation/networking/ip-sysctl.txt | 4 +++-
 net/ipv4/icmp.c                        | 7 +++++--
 2 files changed, 8 insertions(+), 3 deletions(-)

Comments

Thadeu Lima de Souza Cascardo Feb. 22, 2021, 9:07 p.m. UTC | #1
On Mon, Feb 22, 2021 at 10:55:00AM -0700, Tim Gardner wrote:
> From: Eric Dumazet <edumazet@google.com>
> 
> BugLink: https://bugs.launchpad.net/bugs/1902115
> 
> [ Upstream commit b38e7819cae946e2edf869e604af1e65a5d241c5 ]
> 
> Keyu Man reported that the ICMP rate limiter could be used
> by attackers to get useful signal. Details will be provided
> in an upcoming academic publication.
> 
> Our solution is to add some noise, so that the attackers
> no longer can get help from the predictable token bucket limiter.
> 
> Fixes: 4cdf507d5452 ("icmp: add a global rate limitation")
> Signed-off-by: Eric Dumazet <edumazet@google.com>
> Reported-by: Keyu Man <kman001@ucr.edu>
> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Signed-off-by: Kamal Mostafa <kamal@canonical.com>
> Signed-off-by: Ian May <ian.may@canonical.com>
> (cherry picked from focal/oracle-5.4 commit fc3d57b1e860f9bdd97bbbf14f1617e718fae7f3)
> CVE-2020-25705
> Signed-off-by: Tim Gardner <tim.gardner@canonical.com>
> 
> back port notes: This was a clean cherry pick of the Focal oracle-5.4 backport.

As for the fix for CVE-2020-25668, I find it unusual to document the backport
like this. I do take backports from different series sometimes, making sure
they make sense for the different series I am applying them to.

However, the line I care about is present here and this is better documenting
the source of the backport than when only the code is taken from the different
series.

Acked-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>

> ---
>  Documentation/networking/ip-sysctl.txt | 4 +++-
>  net/ipv4/icmp.c                        | 7 +++++--
>  2 files changed, 8 insertions(+), 3 deletions(-)
> 
> diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt
> index 5f53faff4e25..151d6ad0e0a7 100644
> --- a/Documentation/networking/ip-sysctl.txt
> +++ b/Documentation/networking/ip-sysctl.txt
> @@ -1005,12 +1005,14 @@ icmp_ratelimit - INTEGER
>  icmp_msgs_per_sec - INTEGER
>  	Limit maximal number of ICMP packets sent per second from this host.
>  	Only messages whose type matches icmp_ratemask (see below) are
> -	controlled by this limit.
> +	controlled by this limit. For security reasons, the precise count
> +	of messages per second is randomized.
>  	Default: 1000
>  
>  icmp_msgs_burst - INTEGER
>  	icmp_msgs_per_sec controls number of ICMP packets sent per second,
>  	while icmp_msgs_burst controls the burst size of these packets.
> +	For security reasons, the precise burst size is randomized.
>  	Default: 50
>  
>  icmp_ratemask - INTEGER
> diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c
> index f369e7ce685b..dcffda472585 100644
> --- a/net/ipv4/icmp.c
> +++ b/net/ipv4/icmp.c
> @@ -239,7 +239,7 @@ static struct {
>  /**
>   * icmp_global_allow - Are we allowed to send one more ICMP message ?
>   *
> - * Uses a token bucket to limit our ICMP messages to sysctl_icmp_msgs_per_sec.
> + * Uses a token bucket to limit our ICMP messages to ~sysctl_icmp_msgs_per_sec.
>   * Returns false if we reached the limit and can not send another packet.
>   * Note: called with BH disabled
>   */
> @@ -267,7 +267,10 @@ bool icmp_global_allow(void)
>  	}
>  	credit = min_t(u32, icmp_global.credit + incr, sysctl_icmp_msgs_burst);
>  	if (credit) {
> -		credit--;
> +		/* We want to use a credit of one in average, but need to randomize
> +		 * it for security reasons.
> +		 */
> +		credit = max_t(int, credit - prandom_u32_max(3), 0);
>  		rc = true;
>  	}
>  	WRITE_ONCE(icmp_global.credit, credit);
> -- 
> 2.17.1
> 
> 
> -- 
> kernel-team mailing list
> kernel-team@lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team
Stefan Bader Feb. 23, 2021, 7:25 a.m. UTC | #2
On 22.02.21 22:07, Thadeu Lima de Souza Cascardo wrote:
> On Mon, Feb 22, 2021 at 10:55:00AM -0700, Tim Gardner wrote:
>> From: Eric Dumazet <edumazet@google.com>
>>
>> BugLink: https://bugs.launchpad.net/bugs/1902115
>>
>> [ Upstream commit b38e7819cae946e2edf869e604af1e65a5d241c5 ]
>>
>> Keyu Man reported that the ICMP rate limiter could be used
>> by attackers to get useful signal. Details will be provided
>> in an upcoming academic publication.
>>
>> Our solution is to add some noise, so that the attackers
>> no longer can get help from the predictable token bucket limiter.
>>
>> Fixes: 4cdf507d5452 ("icmp: add a global rate limitation")
>> Signed-off-by: Eric Dumazet <edumazet@google.com>
>> Reported-by: Keyu Man <kman001@ucr.edu>
>> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
>> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
>> Signed-off-by: Kamal Mostafa <kamal@canonical.com>
>> Signed-off-by: Ian May <ian.may@canonical.com>
>> (cherry picked from focal/oracle-5.4 commit fc3d57b1e860f9bdd97bbbf14f1617e718fae7f3)
>> CVE-2020-25705
>> Signed-off-by: Tim Gardner <tim.gardner@canonical.com>
>>
>> back port notes: This was a clean cherry pick of the Focal oracle-5.4 backport.

When bringing up backport notes I was saying that we document what we did *if*
we do backports. And I gave an exact example of how this is done by everybody else.

But regardless of that, once a thread is NACKed once it is dead. Re-submissions
go into a new thread. Having one thread with a mix of ok and rejected patches
mixed is just too dangerous.

-Stefan

> 
> As for the fix for CVE-2020-25668, I find it unusual to document the backport
> like this. I do take backports from different series sometimes, making sure
> they make sense for the different series I am applying them to.
> 
> However, the line I care about is present here and this is better documenting
> the source of the backport than when only the code is taken from the different
> series.
> 
> Acked-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
> 
>> ---
>>  Documentation/networking/ip-sysctl.txt | 4 +++-
>>  net/ipv4/icmp.c                        | 7 +++++--
>>  2 files changed, 8 insertions(+), 3 deletions(-)
>>
>> diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt
>> index 5f53faff4e25..151d6ad0e0a7 100644
>> --- a/Documentation/networking/ip-sysctl.txt
>> +++ b/Documentation/networking/ip-sysctl.txt
>> @@ -1005,12 +1005,14 @@ icmp_ratelimit - INTEGER
>>  icmp_msgs_per_sec - INTEGER
>>  	Limit maximal number of ICMP packets sent per second from this host.
>>  	Only messages whose type matches icmp_ratemask (see below) are
>> -	controlled by this limit.
>> +	controlled by this limit. For security reasons, the precise count
>> +	of messages per second is randomized.
>>  	Default: 1000
>>  
>>  icmp_msgs_burst - INTEGER
>>  	icmp_msgs_per_sec controls number of ICMP packets sent per second,
>>  	while icmp_msgs_burst controls the burst size of these packets.
>> +	For security reasons, the precise burst size is randomized.
>>  	Default: 50
>>  
>>  icmp_ratemask - INTEGER
>> diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c
>> index f369e7ce685b..dcffda472585 100644
>> --- a/net/ipv4/icmp.c
>> +++ b/net/ipv4/icmp.c
>> @@ -239,7 +239,7 @@ static struct {
>>  /**
>>   * icmp_global_allow - Are we allowed to send one more ICMP message ?
>>   *
>> - * Uses a token bucket to limit our ICMP messages to sysctl_icmp_msgs_per_sec.
>> + * Uses a token bucket to limit our ICMP messages to ~sysctl_icmp_msgs_per_sec.
>>   * Returns false if we reached the limit and can not send another packet.
>>   * Note: called with BH disabled
>>   */
>> @@ -267,7 +267,10 @@ bool icmp_global_allow(void)
>>  	}
>>  	credit = min_t(u32, icmp_global.credit + incr, sysctl_icmp_msgs_burst);
>>  	if (credit) {
>> -		credit--;
>> +		/* We want to use a credit of one in average, but need to randomize
>> +		 * it for security reasons.
>> +		 */
>> +		credit = max_t(int, credit - prandom_u32_max(3), 0);
>>  		rc = true;
>>  	}
>>  	WRITE_ONCE(icmp_global.credit, credit);
>> -- 
>> 2.17.1
>>
>>
>> -- 
>> kernel-team mailing list
>> kernel-team@lists.ubuntu.com
>> https://lists.ubuntu.com/mailman/listinfo/kernel-team
>
diff mbox series

Patch

diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt
index 5f53faff4e25..151d6ad0e0a7 100644
--- a/Documentation/networking/ip-sysctl.txt
+++ b/Documentation/networking/ip-sysctl.txt
@@ -1005,12 +1005,14 @@  icmp_ratelimit - INTEGER
 icmp_msgs_per_sec - INTEGER
 	Limit maximal number of ICMP packets sent per second from this host.
 	Only messages whose type matches icmp_ratemask (see below) are
-	controlled by this limit.
+	controlled by this limit. For security reasons, the precise count
+	of messages per second is randomized.
 	Default: 1000
 
 icmp_msgs_burst - INTEGER
 	icmp_msgs_per_sec controls number of ICMP packets sent per second,
 	while icmp_msgs_burst controls the burst size of these packets.
+	For security reasons, the precise burst size is randomized.
 	Default: 50
 
 icmp_ratemask - INTEGER
diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c
index f369e7ce685b..dcffda472585 100644
--- a/net/ipv4/icmp.c
+++ b/net/ipv4/icmp.c
@@ -239,7 +239,7 @@  static struct {
 /**
  * icmp_global_allow - Are we allowed to send one more ICMP message ?
  *
- * Uses a token bucket to limit our ICMP messages to sysctl_icmp_msgs_per_sec.
+ * Uses a token bucket to limit our ICMP messages to ~sysctl_icmp_msgs_per_sec.
  * Returns false if we reached the limit and can not send another packet.
  * Note: called with BH disabled
  */
@@ -267,7 +267,10 @@  bool icmp_global_allow(void)
 	}
 	credit = min_t(u32, icmp_global.credit + incr, sysctl_icmp_msgs_burst);
 	if (credit) {
-		credit--;
+		/* We want to use a credit of one in average, but need to randomize
+		 * it for security reasons.
+		 */
+		credit = max_t(int, credit - prandom_u32_max(3), 0);
 		rc = true;
 	}
 	WRITE_ONCE(icmp_global.credit, credit);