Received: by 2002:a05:6a10:a0d1:0:0:0:0 with SMTP id j17csp1137856pxa; Thu, 20 Aug 2020 03:40:25 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzH4JGFZN8Gwc3w0BSqoXN0Nml8kidkB/1y1PPpuBW4Fc6QLiR/E6/0cCBdyt3sS5rnf7LM X-Received: by 2002:a17:906:8318:: with SMTP id j24mr2505676ejx.409.1597920025295; Thu, 20 Aug 2020 03:40:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1597920025; cv=none; d=google.com; s=arc-20160816; b=jfVXxA+gb7Dx/t9WksDMjU6qsoaWWNJ0AUHzOJteMIMkZwx5quYEPWEctLulA1NkM5 NY5LdrT922gpSBjTAEK9+1xn7biUAZnFx8Pvb3UBFkbpsVL4c8i8EGks+0tsJjSDnwz4 y8r5zby3RYhPVRdwjTz6UgVyTcgENCDrl15tsUMySa0Tz9JgR4LlvjD0XnPEUewFxnfw 6dbuxfeso007s6zSA0tBW8sW39xvxX4gTG4TtTgHZVuhEGJ9oWaFwRIT8Tr+QzDFT2Ev hrxeQDyz8n3pTdiLg1HuYlCRIce1tmo4DxWtnMOhmclbgA0ijASsDWRrJbN+cIlm1bMP PouA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=dzuT4UC6/RBdzRezGTTiVVurjDVYvRu/UsI3FMMphrI=; b=0lUn80NkyLHkG01kW0JSRstNyRtKiNidjScNpAJLn1ULxTEmDvWjDnFqMT8oVzNuCQ eAQDfvzkJ0BDoh5/xJ3DzxKMIh1TtXz1diZ0ttQmqBx6AFPRgi/iyCw8hfOm05zvhQ4s qsZ5Y0V1sCDx4V0QLTJ2k8tZjzG+UlEKZt0ZLe78odO3kqeMgmuMl8oDVvEPimWeIFOy 7afMgN0nqBM0jlibrVDtmTlq6wi2gQwHY8Y9LzS7W/xDGH3yRYtwsU+elKSgHehZWUfU FqNcPl30ovC+NLF+EqxvaLMGDecbcLUd12Oy4DNNmazy/M+WtnMhYI6mNkrHT38qMtAn oEbA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=Kq7xYh7E; 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 j11si1108007edq.584.2020.08.20.03.40.00; Thu, 20 Aug 2020 03:40:25 -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=Kq7xYh7E; 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 S1729335AbgHTKjc (ORCPT + 99 others); Thu, 20 Aug 2020 06:39:32 -0400 Received: from mail.kernel.org ([198.145.29.99]:39882 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730718AbgHTKSB (ORCPT ); Thu, 20 Aug 2020 06:18:01 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (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 4B461206DA; Thu, 20 Aug 2020 10:18:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1597918680; bh=+tGt9QvKfbJmgHO7ABz1hcb4WZF2zIHG+IUSXqmo5a8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Kq7xYh7EMraWPFpNEUZ7LPhSJB8EVWfKWN+BdSvXW8X/N9ImQfi1iEML7OY6VLjoy 4zyBU4Q6/DBISUDYjfw+KzWlBfTykllWxgNZRsYBNJjVDSUp64Tbvr73N8KA1Vh/un 8GGA3D3R1+0Ye9RSRERGVxFagOlvIuldMhXMG6xw= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Amit Klein , Linus Torvalds , Eric Dumazet , "Jason A. Donenfeld" , Andy Lutomirski , Kees Cook , Thomas Gleixner , Peter Zijlstra , Willy Tarreau Subject: [PATCH 4.4 027/149] random32: update the net random state on interrupt and activity Date: Thu, 20 Aug 2020 11:21:44 +0200 Message-Id: <20200820092127.037471387@linuxfoundation.org> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20200820092125.688850368@linuxfoundation.org> References: <20200820092125.688850368@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Willy Tarreau commit f227e3ec3b5cad859ad15666874405e8c1bbc1d4 upstream. This modifies the first 32 bits out of the 128 bits of a random CPU's net_rand_state on interrupt or CPU activity to complicate remote observations that could lead to guessing the network RNG's internal state. Note that depending on some network devices' interrupt rate moderation or binding, this re-seeding might happen on every packet or even almost never. In addition, with NOHZ some CPUs might not even get timer interrupts, leaving their local state rarely updated, while they are running networked processes making use of the random state. For this reason, we also perform this update in update_process_times() in order to at least update the state when there is user or system activity, since it's the only case we care about. Reported-by: Amit Klein Suggested-by: Linus Torvalds Cc: Eric Dumazet Cc: "Jason A. Donenfeld" Cc: Andy Lutomirski Cc: Kees Cook Cc: Thomas Gleixner Cc: Peter Zijlstra Cc: Signed-off-by: Willy Tarreau Signed-off-by: Linus Torvalds Signed-off-by: Greg Kroah-Hartman --- drivers/char/random.c | 1 + include/linux/random.h | 3 +++ kernel/time/timer.c | 8 ++++++++ lib/random32.c | 2 +- 4 files changed, 13 insertions(+), 1 deletion(-) --- a/drivers/char/random.c +++ b/drivers/char/random.c @@ -923,6 +923,7 @@ void add_interrupt_randomness(int irq, i fast_mix(fast_pool); add_interrupt_bench(cycles); + this_cpu_add(net_rand_state.s1, fast_pool->pool[cycles & 3]); if ((fast_pool->count < 64) && !time_after(now, fast_pool->last + HZ)) --- a/include/linux/random.h +++ b/include/linux/random.h @@ -8,6 +8,7 @@ #include #include +#include #include @@ -46,6 +47,8 @@ struct rnd_state { __u32 s1, s2, s3, s4; }; +DECLARE_PER_CPU(struct rnd_state, net_rand_state) __latent_entropy; + u32 prandom_u32_state(struct rnd_state *state); void prandom_bytes_state(struct rnd_state *state, void *buf, size_t nbytes); void prandom_seed_full_state(struct rnd_state __percpu *pcpu_state); --- a/kernel/time/timer.c +++ b/kernel/time/timer.c @@ -42,6 +42,7 @@ #include #include #include +#include #include #include @@ -1431,6 +1432,13 @@ void update_process_times(int user_tick) #endif scheduler_tick(); run_posix_cpu_timers(p); + + /* The current CPU might make use of net randoms without receiving IRQs + * to renew them often enough. Let's update the net_rand_state from a + * non-constant value that's not affine to the number of calls to make + * sure it's updated when there's some activity (we don't care in idle). + */ + this_cpu_add(net_rand_state.s1, rol32(jiffies, 24) + user_tick); } /* --- a/lib/random32.c +++ b/lib/random32.c @@ -47,7 +47,7 @@ static inline void prandom_state_selftes } #endif -static DEFINE_PER_CPU(struct rnd_state, net_rand_state); +DEFINE_PER_CPU(struct rnd_state, net_rand_state); /** * prandom_u32_state - seeded pseudo-random number generator.