‹ BackHN Continuity

Thread

AMD's random number generator can't generate a 0?

288 points · 220 comments · BruceEel

  1. jstanley · · focus · HN ↗
    This is not the first RNG bug on Zen 2, I recall after I first got mine that some application or other would quit immediately at startup because rdrand always returned -1, i.e. all 1s. It was fixed with a microcode update.

    Do we now learn that they fixed "always generate all 1s" with "never generate all 0s"??

    EDIT: I've been unable to reproduce the problem on my CPU, FWIW. It's a Ryzen 5 3600.

    EDIT2: OK, update, I can reproduce it with rdrand16, rdrand32 is fine but rdrand16 can never generate all 0s. So my CPU does have this problem!

    1. jamesponddotco · · focus · HN ↗
      If I remember correctly, we had a setting in every Linux server we owned to remove CPU as a RNG seeder for the kernel because of those bugs with AMD CPUs.

      I.e., we had `random.trust_cpu=off nordrand` in `GRUB_CMDLINE_LINUX`.

      1. knorker · · focus · HN ↗
        Adding bad randomness can't degrade good randomness, can it?

        I thought the kernel would not replace anything just because it adds a potentially bad source.

        E.g. if you have rand source A, and xor it with rand source B, then you get, at worst, the best of A and B,

        1. edelbitter · · focus · HN ↗
          Careful, there is two different things going on here:

          a) whether you use the maybe-entropy provided by the CPU (and/or the bootloader)

          b) whether you credit that maybe-entropy towards your tracking of whether the pool should be considered sufficiently seeded

          random.trust_cpu/random.trust_bootloader configures b).

          nordrand has been removed from the kernel as it had become overloaded by meaning both a) and b)

          Under most circumstances, a) is harmless. You mostly want that off when the CPU exhibits some performance hiccups when asked.

          Under some circumstances, b) is outright dangerous. Some applications can work without seeded pool at some slightly reduced performance, but could be made to fail miserably if they had been made to believe that the pool was seeded yet it was not. This happens with hash tables when you skip some of the accounting because it seems no longer relevant. It really would not be relevant, once even a determined attacker should be unable to reliably trigger the worst-case-performance.

          1. mitxela · · focus · HN ↗
            Note that this issue doesn't make rdrand useless for entropy. It's still as useful as always if passing through any whitening or mixing algorithm.
Open on Hacker News to reply ↗

Unofficial Hacker News client; not affiliated with Y Combinator.