Received: by 2002:ac0:e34a:0:0:0:0:0 with SMTP id g10csp32831imn; Mon, 25 Jul 2022 09:29:54 -0700 (PDT) X-Google-Smtp-Source: AGRyM1vtK7iELNfW1HZJkcvPDAsT6UyXdtpQFcT0OeANQNKkj6zfzcuIG1aEpXcZR35Zs+TaAXIH X-Received: by 2002:a17:907:7637:b0:72b:3a3b:7d68 with SMTP id jy23-20020a170907763700b0072b3a3b7d68mr10243512ejc.566.1658766594380; Mon, 25 Jul 2022 09:29:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1658766594; cv=none; d=google.com; s=arc-20160816; b=ILCs+5/vc7BGE7N5mEwotwvv7Cy4WnFZ44gxESGi3h0rrB64xw11rVN6G4USr4mUvZ QFj8WIlalskQwWo4XNGDs6QQi5Os//xvT5x3eyEby2J8U+DeTHldr5bIEGrdqq7zw4pQ A40oNRe70I4Ph6C/BEhDRfq+KEmpMMrzrAL1fn7LqDLmqN8kLoPjk3gKDjQ4swq7SofW srpKEMwh3BlcoDNHgKm47gyA2kLBVktIRkHZUfbljgcJRwCMjLBJyUlxlYs71JsX7ZQM boxYN9zq5t/v80C163xZ4jBE+4Uty3SPi1s7Zme4lC24zb6arDNbp1e0S6isi7p2Tt9D YehQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:user-agent:in-reply-to:content-transfer-encoding :content-disposition:mime-version:references:message-id:subject:cc :to:from:date; bh=tGWM93ft7rcY2eHevOx3PGDwtr77xfratB+5j4gftLI=; b=j1mBJ1moaJYO4PuU5537ZYgKIRR7vlCfy35ke8Ydu7crUrjZnsAa76YWDqkzUVupyt 4YZlK5JWwfviXDDkfmaNkwpeHepXP9jSmBA+7WNkXe6wFBq42Qy+UgWjeWi23PmhEr7L k9juhzSJL5cnHLjBm0G3AgWMBJml+UuGACtYz11EvKc+vWzVsLLlWL+y538/XOilhUqS XH4QQursq8bYyxBP9JVDOuNXGTHCLYBpWJ8jFVye0tbNu3g2fmQb+iV87t3AewRRwLMO 6AA0CxhRpMpY6Mo9+yAUzN028QiM7NqDM8vqJj6qzhVoO3yecf5FcdCTbFiS4e2t1jEH oecQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-crypto-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-crypto-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id e32-20020a056402332000b0043ab664c9e7si11729835eda.282.2022.07.25.09.29.26; Mon, 25 Jul 2022 09:29:54 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-crypto-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; spf=pass (google.com: domain of linux-crypto-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-crypto-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235572AbiGYQYM (ORCPT + 99 others); Mon, 25 Jul 2022 12:24:12 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54254 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234315AbiGYQYK (ORCPT ); Mon, 25 Jul 2022 12:24:10 -0400 X-Greylist: delayed 1033 seconds by postgrey-1.37 at lindbergh.monkeyblade.net; Mon, 25 Jul 2022 09:24:08 PDT Received: from brightrain.aerifal.cx (brightrain.aerifal.cx [216.12.86.13]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 20C8017A8C for ; Mon, 25 Jul 2022 09:24:07 -0700 (PDT) Date: Mon, 25 Jul 2022 12:06:53 -0400 From: Rich Felker To: "Jason A. Donenfeld" Cc: Florian Weimer , Yann Droneaud , jann@thejh.net, "Jason A. Donenfeld via Libc-alpha" , linux-crypto@vger.kernel.org, Michael@phoronix.com Subject: Re: arc4random - are you sure we want these? Message-ID: <20220725160652.GG7074@brightrain.aerifal.cx> References: <87bktdsdrk.fsf@oldenburg.str.redhat.com> <87v8rlqscj.fsf@oldenburg.str.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,SPF_HELO_NONE, SPF_NONE 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-crypto@vger.kernel.org On Mon, Jul 25, 2022 at 03:43:57PM +0200, Jason A. Donenfeld via Libc-alpha wrote: > Hi Florian, > > On Mon, Jul 25, 2022 at 02:39:24PM +0200, Florian Weimer wrote: > > Below you suggest to use GRND_INSECURE to avoid deadlocks during > > booting. It's documented in the UAPI header as “Return > > non-cryptographic random bytes”. I assume it's broadly equivalent to > > reading from /dev/urandom (which we need to support for backwards > > compatibility, and currently use to avoid blocking). This means that we > > cannot really document the resulting bits as cryptographically strong > > from an application perspective because the kernel is not willing to > > make this commitment. > > Regarding the technical aspect, GRND_INSECURE is somewhat new-ish, but > > as I wrote above, it's UAPI documentation is a bit scary. Maybe it > > would be possible to clarify this in the manual pages a bit? I *assume* > > that if we are willing to read from /dev/urandom, we can use > > GRND_INSECURE right away to avoid that fallback path on sufficiently new > > kernels. But it would be nice to have confirmation. > > getrandom(GRND_INSECURE) is the same as getrandom(0), except before the > RNG is seeded, in which case the former will return ~garbage randomness > while the latter will block. The only current difference between > getrandom(GRND_INSECURE) and /dev/urandom is the latter will try for a > second to do the jitter entropy thing if the RNG isn't seeded yet. > > I agree that the documentation around this is really bad. Actually, so > much of the documentation is out of date or confusing. Thanks for the > kick on this: I really do need to rewrite that / clean it up. > > So with my random.c maintainer hat on: getrandom(GRND_INSECURE) will > return the same "quality" randomness as getrandom(0), except before > the RNG is initialized. I'll fix up the docs for that, but feel free to > refer to this statement ahead of that if you need. > > Code-wise, the only relevant branch related to GRND_INSECURE is: > > if (!crng_ready() && !(flags & GRND_INSECURE)) { > if (flags & GRND_NONBLOCK) > return -EAGAIN; > ret = wait_for_random_bytes(); > if (unlikely(ret)) > return ret; > } > > That means: if it's not ready, and you didn't pass _INSECURE, and you > didn't pass _NONBLOCK, then wait for the RNG to be ready, and error out > if that's interrupted by a signal. Other than that one block, it > continues on to do the same thing as getrandom(0). > > With that said, however, I think it'd be nice if you used only blocking > randomness, and shove the initialization problem at init systems and > bootloaders and such. In 5.20, for example, there'll be an x86 boot > protocol for GRUB and kexec and hypervisors and such to pass a seed, and > since a long time, there exists a device tree attribute for the same. > Proliferating "unsafe" /dev/urandom-style usage doesn't seem good for > the ecosystem at large. And I'm in general interest in seeing progress > on decades long initialization-time seeding concerns. arc4random's contract is supposed to be that it always succeeds and always produces cryptographic output. It cannot use GRND_INSECURE or other insecure fallback methods to avoid blocking. It has to block. This function (inherently, in its contract) is not usable for early boot stuff where one is pretending to want actual cryptographic entropy but is just as happy getting some "high quality" non-CS stuff, and thereby would be just as happy with rand() or likely even with "42". Programs that will run in that context on Linux need to be explicitly aware of the messy "early boot" situation and figure out how they're going to handle it securely or if they even wanted CS randomness to begin with. Fortunately virtually nothing has to do that. On most (non-embedded) systems, init can just bring up a rw filesystem with saved entropy on it early and load that, then provide a fully-working environment to programs it invokes. > > I had some patches with AT_RANDOM fallback, including overwriting > > AT_RANDOM with output from the seeded PRNG. It's certainly messy. I > > probably didn't bother to post these patches given how bizarre the whole > > thing was. I did have fallback to CPU instructions, but that turned out > > to be unworkable due to bugs in suspend on AMD CPUs (kernel or firmware, > > unclear). > > Yea, it's kind of tricky as other things might be using AT_RANDOM also > and then you have a whole race issue and domain separation and whatnot. > The thing in systemd isn't really good for crypto -- no forward secrecy > and such -- but it's ostensibly better than random(). AT_RANDOM is unusable as a fallback here because it's equivalent to GRND_INSECURE. It's silently broken at early boot time. In musl we're likely going to end up using the legacy SYS_sysctl on pre-getrandom kernels even though it spammed syslog just because it seems to be the only way to get blocking secure entropy on those kernels. Rich