[libvirt] [PATCH 08/10] virrandom: Make virRandomBits better

Martin Kletzander mkletzan at redhat.com
Wed May 30 13:43:31 UTC 2018


On Wed, May 30, 2018 at 02:16:08PM +0200, Michal Privoznik wrote:
>On 05/29/2018 03:44 PM, Martin Kletzander wrote:
>> On Tue, May 29, 2018 at 10:24:44AM +0200, Michal Privoznik wrote:
>>> Now that we have strong PRNG generator implemented in
>>> virRandomBytes() let's use that instead of gnulib's random_r.
>>>
>>> Problem with the latter is in way we seed it: current UNIX time
>>> and libvirtd's PID are not that random as one might think.
>>> Imagine two hosts booting at the same time. There's a fair chance
>>> that those hosts spawn libvirtds at the same time and with the
>>> same PID. This will result in both daemons generating the same
>>> sequence of say MAC addresses [1].
>>>
>>> 1: https://www.redhat.com/archives/libvirt-users/2018-May/msg00097.html
>>>
>>> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
>>> ---
>>> src/util/virrandom.c | 63
>>> ++--------------------------------------------------
>>> 1 file changed, 2 insertions(+), 61 deletions(-)
>>>
>>
>> ACK to patches 1-7.  But for this one I'm "concerned" about few things.
>>
>> First of all, just so I don't forget it, random_r can be removed from
>> bootstrap.conf after this patch, right?
>
>Yes, I was meaning to make that change but then I forgot.
>
>>
>> Before this patch, and without gnutls, we wouldn't deplete the entropy
>> of the
>> kernel, (even though we're just using /dev/urandom and not /dev/random),
>> but now
>> we'd read everything from /dev/urandom.
>
>Unless we are built with gnutls. But I don't see much problem with that.
>

Yeah, it's not that big of a deal, just an extra point for the next thing I
mentioned below.

>>
>> Last but not least, if we completely drop the non-gnutls variants of
>> everything,
>> wouldn't everything be easier anyway?  Like the worrying about entropy
>> pool in
>> previous point?
>
>Sure. But requiring gnutls (like I'm suggesting in the cover letter) is
>orthogonal to these patches IMO.
>

My point was that the fixes might be could be cleaner and shorter, but that "not
that big of a deal" above would be fixed.  It also makes it kind of relevant.

Since /dev/urandom cannot be really exhausted in newer Linux kernels (not sure
for FreeBSD and others), I don't think that's a problem.  We should ensure,
however, that it is seeded properly.  It might not be when it's early during the
boot for Linux (although systemd and others seed it explicitly early enough),
that's what getrandom() is for as it ensures the seeding was done properly.  But
that's Linux-specific.  FreeBSD will apparently not give you any data until it's
seeded properly.

Anyway, I got a bit caught up there.  I also learned something new and I think
the patch can be used like this.  We might also ditch gnutls if we use
getrandom() on Linux before using /dev/urandom.  That should be fine if we want
to take the other approach.  But it looks like gnutls will be needed anyway,
so...

>>
>> And one thing below:
>>
>>> diff --git a/src/util/virrandom.c b/src/util/virrandom.c
>>> index 444b0f9802..01cc82a052 100644
>>> --- a/src/util/virrandom.c
>>> +++ b/src/util/virrandom.c
>>> @@ -108,26 +61,14 @@ VIR_ONCE_GLOBAL_INIT(virRandom)
>>> uint64_t virRandomBits(int nbits)
>>> {
>>>     uint64_t ret = 0;
>>> -    int32_t bits;
>>>
>>> -    if (virRandomInitialize() < 0) {
>>> +    if (virRandomBytes((unsigned char *) &ret, sizeof(ret)) < 0) {
>>>         /* You're already hosed, so this particular non-random value
>>>          * isn't any worse.  */
>>>         return 0;
>>
>> We definitely want to return an error here now IMHO.
>
>I'm not quite sure how to achieve that. The only thing I can think about
>is changing virRandomBits() signature. But since it is pre-existing I
>think it's safe to do in a follow up patch.
>

I thought of it differently.  The way it failed before was during
initialization, once per the daemon running for example, and then all the calls
to virRandomBytes were returning 0 all the time.  This way (although I have no
idea when gnutls_rnd can fail) it can be returning fine random numbers and then,
out of nowhere, return 0 few times, then continue with random numbers.

I just wanted so that we both understand what the change here is.  Since we're
logging the error already, maybe just resetting it is fine.  Or actually it
could be left there.

So ACK if you remove random_r from bootstrap.conf.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20180530/471d596e/attachment-0001.sig>


More information about the libvir-list mailing list