From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Eric Dumazet <edumazet@google.com>,
Amit Klein <aksecurity@gmail.com>, Willy Tarreau <w@1wt.eu>,
"David S . Miller" <davem@davemloft.net>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Subject: [PATCH 4.4 42/57] inet: use bigger hash table for IP ID generation
Date: Mon, 28 Jun 2021 10:42:41 -0400 [thread overview]
Message-ID: <20210628144256.34524-43-sashal@kernel.org> (raw)
In-Reply-To: <20210628144256.34524-1-sashal@kernel.org>
From: Eric Dumazet <edumazet@google.com>
commit aa6dd211e4b1dde9d5dc25d699d35f789ae7eeba upstream.
In commit 73f156a6e8c1 ("inetpeer: get rid of ip_id_count")
I used a very small hash table that could be abused
by patient attackers to reveal sensitive information.
Switch to a dynamic sizing, depending on RAM size.
Typical big hosts will now use 128x more storage (2 MB)
to get a similar increase in security and reduction
of hash collisions.
As a bonus, use of alloc_large_system_hash() spreads
allocated memory among all NUMA nodes.
Fixes: 73f156a6e8c1 ("inetpeer: get rid of ip_id_count")
Reported-by: Amit Klein <aksecurity@gmail.com>
Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: Willy Tarreau <w@1wt.eu>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
net/ipv4/route.c | 42 +++++++++++++++++++++++++++++-------------
1 file changed, 29 insertions(+), 13 deletions(-)
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index ea1c319100a5..2ab2289d97a0 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -70,6 +70,7 @@
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/mm.h>
+#include <linux/bootmem.h>
#include <linux/string.h>
#include <linux/socket.h>
#include <linux/sockios.h>
@@ -463,8 +464,10 @@ static struct neighbour *ipv4_neigh_lookup(const struct dst_entry *dst,
return neigh_create(&arp_tbl, pkey, dev);
}
-#define IP_IDENTS_SZ 2048u
-
+/* Hash tables of size 2048..262144 depending on RAM size.
+ * Each bucket uses 8 bytes.
+ */
+static u32 ip_idents_mask __read_mostly;
static atomic_t *ip_idents __read_mostly;
static u32 *ip_tstamps __read_mostly;
@@ -474,12 +477,16 @@ static u32 *ip_tstamps __read_mostly;
*/
u32 ip_idents_reserve(u32 hash, int segs)
{
- u32 *p_tstamp = ip_tstamps + hash % IP_IDENTS_SZ;
- atomic_t *p_id = ip_idents + hash % IP_IDENTS_SZ;
- u32 old = ACCESS_ONCE(*p_tstamp);
- u32 now = (u32)jiffies;
+ u32 bucket, old, now = (u32)jiffies;
+ atomic_t *p_id;
+ u32 *p_tstamp;
u32 delta = 0;
+ bucket = hash & ip_idents_mask;
+ p_tstamp = ip_tstamps + bucket;
+ p_id = ip_idents + bucket;
+ old = ACCESS_ONCE(*p_tstamp);
+
if (old != now && cmpxchg(p_tstamp, old, now) == old)
delta = prandom_u32_max(now - old);
@@ -2936,18 +2943,27 @@ struct ip_rt_acct __percpu *ip_rt_acct __read_mostly;
int __init ip_rt_init(void)
{
+ void *idents_hash;
int rc = 0;
int cpu;
- ip_idents = kmalloc(IP_IDENTS_SZ * sizeof(*ip_idents), GFP_KERNEL);
- if (!ip_idents)
- panic("IP: failed to allocate ip_idents\n");
+ /* For modern hosts, this will use 2 MB of memory */
+ idents_hash = alloc_large_system_hash("IP idents",
+ sizeof(*ip_idents) + sizeof(*ip_tstamps),
+ 0,
+ 16, /* one bucket per 64 KB */
+ 0,
+ NULL,
+ &ip_idents_mask,
+ 2048,
+ 256*1024);
+
+ ip_idents = idents_hash;
- prandom_bytes(ip_idents, IP_IDENTS_SZ * sizeof(*ip_idents));
+ prandom_bytes(ip_idents, (ip_idents_mask + 1) * sizeof(*ip_idents));
- ip_tstamps = kcalloc(IP_IDENTS_SZ, sizeof(*ip_tstamps), GFP_KERNEL);
- if (!ip_tstamps)
- panic("IP: failed to allocate ip_tstamps\n");
+ ip_tstamps = idents_hash + (ip_idents_mask + 1) * sizeof(*ip_idents);
+ memset(ip_tstamps, 0, (ip_idents_mask + 1) * sizeof(*ip_tstamps));
for_each_possible_cpu(cpu) {
struct uncached_list *ul = &per_cpu(rt_uncached_list, cpu);
--
2.30.2
next prev parent reply other threads:[~2021-06-28 15:05 UTC|newest]
Thread overview: 65+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-28 14:41 [PATCH 4.4 00/57] 4.4.274-rc1 review Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 01/57] HID: hid-sensor-hub: Return error for hid_set_field() failure Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 02/57] HID: Add BUS_VIRTUAL to hid_connect logging Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 03/57] HID: usbhid: fix info leak in hid_submit_ctrl Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 04/57] ARM: OMAP2+: Fix build warning when mmc_omap is not built Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 05/57] HID: gt683r: add missing MODULE_DEVICE_TABLE Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 06/57] gfs2: Fix use-after-free in gfs2_glock_shrink_scan Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 07/57] scsi: target: core: Fix warning on realtime kernels Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 08/57] ethernet: myri10ge: Fix missing error code in myri10ge_probe() Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 09/57] net: ipconfig: Don't override command-line hostnames or domains Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 10/57] rtnetlink: Fix missing error code in rtnl_bridge_notify() Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 11/57] net/x25: Return the correct errno code Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 12/57] net: " Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 13/57] fib: " Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 14/57] dmaengine: stedma40: add missing iounmap() on error in d40_probe() Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 15/57] net: ipv4: fix memory leak in netlbl_cipsov4_add_std Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 16/57] net: rds: fix memory leak in rds_recvmsg Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 17/57] rtnetlink: Fix regression in bridge VLAN configuration Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 18/57] netfilter: synproxy: Fix out of bounds when parsing TCP options Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 19/57] net: stmmac: dwmac1000: Fix extended MAC address registers definition Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 20/57] qlcnic: Fix an error handling path in 'qlcnic_probe()' Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 21/57] netxen_nic: Fix an error handling path in 'netxen_nic_probe()' Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 22/57] net: cdc_ncm: switch to eth%d interface naming Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 23/57] net: usb: fix possible use-after-free in smsc75xx_bind Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 24/57] net/af_unix: fix a data-race in unix_dgram_sendmsg / unix_release_sock Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 25/57] be2net: Fix an error handling path in 'be_probe()' Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 26/57] net: hamradio: fix memory leak in mkiss_close Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 27/57] net: cdc_eem: fix tx fixup skb leak Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 28/57] net: ethernet: fix potential use-after-free in ec_bhf_remove Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 29/57] scsi: core: Put .shost_dev in failure path if host state changes to RUNNING Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 30/57] radeon: use memcpy_to/fromio for UVD fw upload Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 31/57] can: bcm: fix infoleak in struct bcm_msg_head Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 32/57] tracing: Do no increment trace_clock_global() by one Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 33/57] PCI: Mark TI C667X to avoid bus reset Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 34/57] PCI: Mark some NVIDIA GPUs " Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 35/57] ARCv2: save ABI registers across signal handling Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 36/57] dmaengine: pl330: fix wrong usage of spinlock flags in dma_cyclc Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 37/57] net: fec_ptp: add clock rate zero check Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 38/57] can: bcm/raw/isotp: use per module netdevice notifier Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 39/57] tracing: Do not stop recording cmdlines when tracing is off Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 40/57] tracing: Do not stop recording comms if the trace file is being read Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 41/57] x86/fpu: Reset state for all signal restore failures Sasha Levin
2021-07-03 15:22 ` Pavel Machek
2021-06-28 14:42 ` Sasha Levin [this message]
2021-06-28 14:42 ` [PATCH 4.4 43/57] ARM: 9081/1: fix gcc-10 thumb2-kernel regression Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 44/57] Makefile: Move -Wno-unused-but-set-variable out of GCC only block Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 45/57] Revert "PCI: PM: Do not read power state in pci_enable_device_flags()" Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 46/57] cfg80211: call cfg80211_leave_ocb when switching away from OCB Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 47/57] mac80211: drop multicast fragments Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 48/57] ping: Check return value of function 'ping_queue_rcv_skb' Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 49/57] inet: annotate date races around sk->sk_txhash Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 50/57] net: caif: fix memory leak in ldisc_open Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 51/57] r8152: Avoid memcpy() over-reading of ETH_SS_STATS Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 52/57] sh_eth: " Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 53/57] r8169: " Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 54/57] net: ll_temac: Avoid ndo_start_xmit returning NETDEV_TX_BUSY Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 55/57] nilfs2: fix memory leak in nilfs_sysfs_delete_device_group Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 56/57] i2c: robotfuzz-osif: fix control-request directions Sasha Levin
2021-06-28 14:42 ` [PATCH 4.4 57/57] Linux 4.4.274-rc1 Sasha Levin
2021-06-29 14:09 ` [PATCH 4.4 00/57] 4.4.274-rc1 review Guenter Roeck
2021-06-29 14:52 ` Naresh Kamboju
2021-06-29 18:18 ` Guenter Roeck
2021-06-29 23:42 ` Guenter Roeck
2021-07-01 10:21 ` Pavel Machek
2021-07-10 14:59 ` Naresh Kamboju
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=20210628144256.34524-43-sashal@kernel.org \
--to=sashal@kernel.org \
--cc=aksecurity@gmail.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=stable@vger.kernel.org \
--cc=w@1wt.eu \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox