Received: by 2002:a05:6a10:9e8c:0:0:0:0 with SMTP id y12csp157702pxx; Wed, 28 Oct 2020 01:02:40 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzhJrwJ7VvDBeK1Renn27fo4P2l6wGjqBGOsUXr2n6Jq+dYQmtf3844HsZ/49ks4l/XMj5J X-Received: by 2002:a05:6402:1158:: with SMTP id g24mr6256317edw.323.1603872160458; Wed, 28 Oct 2020 01:02:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1603872160; cv=none; d=google.com; s=arc-20160816; b=cBT7jmGdl71jUgtPbz0Q3HyIezWORoC1qCyqr/8+85O/2qXtgV6eKUpCdEwDdsB8Vp jrKPZlKam2GFwIeqRvQ3Od2A5LK82/3tcTuOxgJ7QpuzaG1D/ktjgocsgxPbpiS5NLYw XHXj8cSBs7coQeBSx71eg501gP/BbFztAdtRUk39WiauQvk6EWShjwx+cAN/x3Fmssb1 RVyCx6lDuvYxuxvnYXYkSJfxvx3ckvNbTGEQiqfEo3bYSg/hROC8m5M8yX/Q5t3yt0kY 7zMZ70VlpKb0vahiR5v2w3pN+2mDYsUcsxCSiHgNSKhUyhh3X13j83d08Ru6a+lOZyDP H4LQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=6IX5yRvKIqv/ncG/LZjX5Bny1D9x/tCP0A+4YpLsv58=; b=ymHsQ0occO09eA9UMzBVhJ9UrZuvBlUiNm2/iAokxeUmX14724h0icPQBHC127Knr4 LVPAsCa5iZ4rk/4THT09w4IyKl0tKVf+NsLmc0Tg6/EfKitEvH8oqE9NKMcHVc1WCoxA 62R5YGfCjGPpdZNoM/JM7pMQ4JM2gjyBz/06RNZ+fPcHm0+h0UixEZsSMG09DGM17gep k/duYDYlgDnraDJ+hrUMm/wQA8QfQuV7ok6XIDIrNJEJpRTpyNOb+1buRzECNJK2SwwV pyHyZcArdfUsg2TbTzW0vKhEKeKtbq1iDlttbKbHJzARLYRGcaJlrg5crSirqo/4pR69 3L1A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=obKqgNDA; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id l12si2820211edk.163.2020.10.28.01.02.18; Wed, 28 Oct 2020 01:02:40 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=obKqgNDA; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S368171AbgJ0N5R (ORCPT + 99 others); Tue, 27 Oct 2020 09:57:17 -0400 Received: from mail.kernel.org ([198.145.29.99]:43608 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S368145AbgJ0N5H (ORCPT ); Tue, 27 Oct 2020 09:57:07 -0400 Received: from localhost (83-86-74-64.cable.dynamic.v4.ziggo.nl [83.86.74.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 7654C21D41; Tue, 27 Oct 2020 13:57:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1603807027; bh=CQll37AdCLVTuqHDIp/Pd7pWl6MS3xUNi9cmgfRPQeI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=obKqgNDAAVuJIqhqb4pSjLlSxzdyVhQlpWQX3SbIi/B4OpueX/oLmOW1BUvHEfHXN v3GhYrU4dRvCGHHq06TrT04HAMEDkN2kZMvPkm2O+p+0Z35K7hSP6cB/J7iGXeTD32 c+eCksaOX/CWfQGmi8BW4jCVs8iu8VfwQToEBhdw= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Eric Dumazet , Keyu Man , Jakub Kicinski Subject: [PATCH 4.4 016/112] icmp: randomize the global rate limiter Date: Tue, 27 Oct 2020 14:48:46 +0100 Message-Id: <20201027134901.334203595@linuxfoundation.org> X-Mailer: git-send-email 2.29.1 In-Reply-To: <20201027134900.532249571@linuxfoundation.org> References: <20201027134900.532249571@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Eric Dumazet [ 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 Reported-by: Keyu Man Signed-off-by: Jakub Kicinski Signed-off-by: Greg Kroah-Hartman --- Documentation/networking/ip-sysctl.txt | 4 +++- net/ipv4/icmp.c | 7 +++++-- 2 files changed, 8 insertions(+), 3 deletions(-) --- a/Documentation/networking/ip-sysctl.txt +++ b/Documentation/networking/ip-sysctl.txt @@ -868,12 +868,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 --- a/net/ipv4/icmp.c +++ b/net/ipv4/icmp.c @@ -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);