Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 38537844 authored by Eric Dumazet's avatar Eric Dumazet Committed by urevanth
Browse files

icmp: randomize the global rate limiter



[ 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: 4cdf507d ("icmp: add a global rate limitation")
Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Reported-by: default avatarKeyu Man <kman001@ucr.edu>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Change-Id: I8accf5cc9b30c902989816ff7f81a2f359cc686f
Git-commit: d6c552505c0d1719dda42b4af2def0618bd7bf54
Git-repo: https://android.googlesource.com/kernel/msm


Signed-off-by: default avatarurevanth <urevanth@codeaurora.org>
parent 2d27b92b
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -912,12 +912,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
+5 −2
Original line number Diff line number Diff line
@@ -246,7 +246,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
 */
@@ -274,7 +274,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);