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@xxxxxxxxxx> --- 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.
Attachment:
signature.asc
Description: Digital signature
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list