Received: by 2002:ad5:4acb:0:0:0:0:0 with SMTP id n11csp2260641imw; Sun, 17 Jul 2022 05:10:29 -0700 (PDT) X-Google-Smtp-Source: AGRyM1t+4jmiUJUR78/cci7xWaAtP5s1aGXSNCmroQk+5cs9RfyjjYTmej9aYm1aX23jPug7Mgj+ X-Received: by 2002:a17:906:3f51:b0:712:3945:8c0d with SMTP id f17-20020a1709063f5100b0071239458c0dmr21568341ejj.302.1658059828689; Sun, 17 Jul 2022 05:10:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1658059828; cv=none; d=google.com; s=arc-20160816; b=0imyEOma2urYGepZ+XDec8QPMADbn/zUkxTpxpG6OCg3Z381lu3upSPb4z8gdJN3m8 s7pIeoSQAuWw7EnC2lwiySR1WPNk5xr2wFRC/6nBca6LeFPoKGe+tWp2qL1KItccj0Gf uT1Eay3tU5yD1SD/voo6lcfMk+ZpSy5ZNBmUNmbdr34qTM1bUNhVZ2vAnTtea2fTrGyv srdHAFtg3+MazZ7XjdueBItNN64lmY4K2owtTuz2LUdh8SBBUvm7mnd9Z2R3CfxDNZlb 3JQsKLAi9tv3g9iBjVDGkGbd29GR+8oIZ9a8e0ZBhA1hO1i+SsFIvquKj8WeH5wWGTHW EtqQ== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=brwdZATJTovt8GRY+M/HlMDnqYXX0lpO4VIGpnJMK2w=; b=am1MONvVMpDTKZD6NHfopilzfuRtkJ+OLiKFr6qLSqKkHdIkLc6XYQ7/aymN421E/I nWhOcmQSvnCnvt9ZA+7C8H5V2M9TDLqJjA/z5ldlyDcU+aPARvJlZdHlwaaq1lxCFN66 0bk0us8e6wUyeg3Tz6e91AsNU+8B/W/yUAeTxZCVMd+3v1CV6tiUWnefdv40eHwiNQTp dAWJE8Ir3EDgcBukBEOGtMt/jMnHr2JMT3J2tmrFwShvuY8FNbyC6ciRe+hE3xCyOP7N kyBk0edBbGRApgi0NXZhDaKWGXUAb0GjvwOn/CHHu8uEqbuLHZ81C2WMiSMVa7y/NhJf WrcQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@zx2c4.com header.s=20210105 header.b=Ekpjo7lB; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=zx2c4.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id z18-20020a05640235d200b0043a6f623f9dsi14597482edc.376.2022.07.17.05.10.03; Sun, 17 Jul 2022 05:10:28 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@zx2c4.com header.s=20210105 header.b=Ekpjo7lB; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=zx2c4.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232326AbiGQLjE (ORCPT + 99 others); Sun, 17 Jul 2022 07:39:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38240 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229698AbiGQLjA (ORCPT ); Sun, 17 Jul 2022 07:39:00 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8EF5ADFBC for ; Sun, 17 Jul 2022 04:38:59 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 29D4B61150 for ; Sun, 17 Jul 2022 11:38:59 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id DF8EAC3411E; Sun, 17 Jul 2022 11:38:57 +0000 (UTC) Authentication-Results: smtp.kernel.org; dkim=pass (1024-bit key) header.d=zx2c4.com header.i=@zx2c4.com header.b="Ekpjo7lB" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zx2c4.com; s=20210105; t=1658057935; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=brwdZATJTovt8GRY+M/HlMDnqYXX0lpO4VIGpnJMK2w=; b=Ekpjo7lByBisNMzUm5XQy62PLu/26VMspcznLPMfSQu1VVmozuRw8UZu3RW3c6yODcjuWg sIIHHo3dteMv5Y1sQGQFTFnQDKfec5rYINEmhOeUNDpiUUkdm57xGcIYUWdDxOamdWQyFT TYe6tQaNit9FVHZ42d8QXMHIDW1bK10= Received: by mail.zx2c4.com (ZX2C4 Mail Server) with ESMTPSA id e43c08d1 (TLSv1.3:AEAD-AES256-GCM-SHA384:256:NO); Sun, 17 Jul 2022 11:38:55 +0000 (UTC) From: "Jason A. Donenfeld" To: linux-kernel@vger.kernel.org Cc: "Jason A. Donenfeld" , x86@kernel.org, Theodore Ts'o , "H . Peter Anvin" , Borislav Petkov Subject: [PATCH v3] x86/rdrand: Remove "nordrand" flag in favor of "random.trust_cpu" Date: Sun, 17 Jul 2022 13:38:45 +0200 Message-Id: <20220717113845.8712-1-Jason@zx2c4.com> In-Reply-To: <20220709104306.1094431-1-Jason@zx2c4.com> References: <20220709104306.1094431-1-Jason@zx2c4.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-6.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, RCVD_IN_DNSWL_HI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The decision of whether or not to trust RDRAND is controlled by the "random.trust_cpu" boot time parameter or the CONFIG_RANDOM_TRUST_CPU compile time default. The "nordrand" flag was added during the early days of RDRAND, when there were worries that merely using its values could compromise the RNG. However, these days, RDRAND values are not used directly but always go through the RNG's hash function, making "nordrand" no longer useful. Rather, the correct switch is "random.trust_cpu", which not only handles the relevant trust issue directly, but also is general to multiple CPU types, not just x86. However, x86 RDRAND does have a history of being occasionally problematic. Prior, when the kernel would notice something strange, it'd warn in dmesg and suggest enabling "nordrand". We can improve on that by making the test a little bit better and then taking the step of automatically disabling RDRAND if we detect it's problematic. Also disable RDSEED if the RDRAND test fails. Cc: x86@kernel.org Cc: Theodore Ts'o Suggested-by: H. Peter Anvin Suggested-by: Borislav Petkov Acked-by: Borislav Petkov Signed-off-by: Jason A. Donenfeld --- Changes v2->v3: - We can't call rdseed in a loop like we can rdrand because it's meant to fail (return false) more often. .../admin-guide/kernel-parameters.txt | 5 -- arch/x86/kernel/cpu/amd.c | 2 +- arch/x86/kernel/cpu/rdrand.c | 57 +++++++------------ 3 files changed, 22 insertions(+), 42 deletions(-) diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt index f2d26cb7e853..1e2307f11105 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -3733,11 +3733,6 @@ noreplace-smp [X86-32,SMP] Don't replace SMP instructions with UP alternatives - nordrand [X86] Disable kernel use of the RDRAND and - RDSEED instructions even if they are supported - by the processor. RDRAND and RDSEED are still - available to user space applications. - noresume [SWSUSP] Disables resume and restores original swap space. diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index 35d5288394cb..48276c0e479d 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c @@ -808,7 +808,7 @@ static void clear_rdrand_cpuid_bit(struct cpuinfo_x86 *c) return; /* - * The nordrand option can clear X86_FEATURE_RDRAND, so check for + * The self-test can clear X86_FEATURE_RDRAND, so check for * RDRAND support using the CPUID function directly. */ if (!(cpuid_ecx(1) & BIT(30)) || rdrand_force) diff --git a/arch/x86/kernel/cpu/rdrand.c b/arch/x86/kernel/cpu/rdrand.c index 8f216669ecb8..26a427fa84ea 100644 --- a/arch/x86/kernel/cpu/rdrand.c +++ b/arch/x86/kernel/cpu/rdrand.c @@ -11,54 +11,39 @@ #include #include -static int __init x86_rdrand_setup(char *s) -{ - setup_clear_cpu_cap(X86_FEATURE_RDRAND); - setup_clear_cpu_cap(X86_FEATURE_RDSEED); - return 1; -} -__setup("nordrand", x86_rdrand_setup); - /* * RDRAND has Built-In-Self-Test (BIST) that runs on every invocation. - * Run the instruction a few times as a sanity check. - * If it fails, it is simple to disable RDRAND here. + * Run the instruction a few times as a sanity check. Also make sure + * it's not outputting the same value over and over, which has happened + * as a result of past CPU bugs. + * + * If it fails, it is simple to disable RDRAND and RDSEED here. */ -#define SANITY_CHECK_LOOPS 8 void x86_init_rdrand(struct cpuinfo_x86 *c) { - unsigned int changed = 0; - unsigned long tmp, prev; - int i; + enum { SAMPLES = 8, MIN_CHANGE = 5 }; + unsigned long sample, prev; + bool failure = false; + size_t i, changed; if (!cpu_has(c, X86_FEATURE_RDRAND)) return; - for (i = 0; i < SANITY_CHECK_LOOPS; i++) { - if (!rdrand_long(&tmp)) { - clear_cpu_cap(c, X86_FEATURE_RDRAND); - pr_warn_once("rdrand: disabled\n"); - return; + for (changed = 0, i = 0; i < SAMPLES; ++i) { + if (!rdrand_long(&sample)) { + failure = true; + break; } + changed += i && sample != prev; + prev = sample; } + if (changed < MIN_CHANGE) + failure = true; - /* - * Stupid sanity-check whether RDRAND does *actually* generate - * some at least random-looking data. - */ - prev = tmp; - for (i = 0; i < SANITY_CHECK_LOOPS; i++) { - if (rdrand_long(&tmp)) { - if (prev != tmp) - changed++; - - prev = tmp; - } + if (failure) { + clear_cpu_cap(c, X86_FEATURE_RDRAND); + clear_cpu_cap(c, X86_FEATURE_RDSEED); + pr_emerg("RDRAND is not reliable on this platform; disabling.\n"); } - - if (WARN_ON_ONCE(!changed)) - pr_emerg( -"RDRAND gives funky smelling output, might consider not using it by booting with \"nordrand\""); - } -- 2.35.1