Hacker News

Top stories

Live mirror
30 storiesupdated just nowView source snapshot
  1. AMD's random number generator can't generate a 0?(flatassembler.net)
    56comments
  2. Can gzip be a language model?(nathan.rs)
    79comments
  3. MiMo v2.6(xiaomi.com)
    422comments
  4. 9 Ads per Minute: FIFA Cup 26 – "the price of the beautiful game"(bristol.ac.uk)
    96comments
  5. Type Punning in C and C++(pwkf.org)
    4comments
  6. Spymarks, Not Watermarks(brand.io)
    120comments
  7. Verda (Finland) raises $189M in Series B(verda.com)
    10comments
  8. JetBrains Air: A System of Products for Agentic Software Development(jetbrains.com)
    28comments
  9. I said no and Apple said yes(dbushell.com)
    225comments
  10. Transformers Explained Visually(poloclub.github.io)
    71comments
  11. Attention is all you have(alicegg.tech)
    256comments
  12. MiMo-v2.6-Pro: Intelligence, Performance and Price Analysis(artificialanalysis.ai)
    31comments
  13. What Sun got wrong(dtrace.org)
    351comments
  14. A font that reads what you wrote(rohanadwankar.github.io)
    17comments
  15. JavaFX 27 Native Image on a Raspberry Pi 5(ennerf.github.io)
    4comments
  16. I don't want to read what you didn't write(colinbreck.com)
    308comments
  17. AI coding has made CI a bottleneck, so we reworked ours to keep up(linear.app)
    300comments
  18. Divide by depth for instant 3D(gabrieloc.com)
    32comments
  19. Engineering Memory: On learning to memorize first 100 digits of pi (2024)(gregorygundersen.com)
    12comments
  20. A build graph that rolls dice(fzakaria.com)
    1comments
  21. What It's Like to Work in One of America's Data Centers(wsj.com)
    13comments
  22. World Wide Words(worldwidewords.org)
    2comments
  23. Looking forward to Git 2.56 – and 3.0(lwn.net)
    74comments
  24. NASA’s Mars Sample Return mission is dead(science.org)
    338comments
  25. The Advisory Group on Mathematics and Artificial Intelligence(terrytao.wordpress.com)
    71comments
  26. Claude Status – Elevated errors for multiple models(claude.com)
    93comments
  27. Python Workers are now generally available(cloudflare.com)
    38comments
  28. HERMES radio enables voice and data communication over vast distances(ieee.org)
    61comments
  29. Socrates vs. the Written Word (2011)(wondermark.com)
    29comments
  30. How do traffic signals work? (2019)(practical.engineering)
    65comments

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

109 pointsby 3h agoboard.flatassembler.net
56 comments
1h agoHN ↗

Embarrassing, but probably little practical impact, since these hardware random numbers are typically not used directly and instead seed a CSPRNG.

45m agoHN ↗

According to Theodore Ts there was pressure from Intel engineers to let /dev/random rely only on the RDRAND instruction.

" I am so glad I resisted pressure from Intel engineers to let /dev/random rely only on the RDRAND instruction. To quote from the article below:

"By this year, the Sigint Enabling Project had found ways inside some of the encryption chips that scramble information for businesses and governments, either by working with chipmakers to insert back doors...."

Relying solely on the hardware random number generator which is using an implementation sealed inside a chip which is impossible to audit is a BAD idea. "

https://web.archive.org/web/20180611180213/https://plus.goog...

Putting a backdoor into CSPRNG is a favored way to break crypto, for example Dual_EC_DRBG.

"

Weaknesses in the cryptographic security of the algorithm were known and publicly criticised well before the algorithm became part of a formal standard endorsed by the ANSI, ISO, and formerly by the National Institute of Standards and Technology (NIST). One of the weaknesses publicly identified was the potential of the algorithm to harbour a cryptographic backdoor advantageous to those who know about it—the United States government's National Security Agency (NSA)—and no one else. In 2013, The New York Times reported that documents in their possession but never released to the public "appear to confirm" that the backdoor was real, and had been deliberately inserted by the NSA as part of its Bullrun decryption program. In December 2013, a Reuters news article alleged that in 2004, before NIST standardized Dual_EC_DRBG, NSA paid RSA Security $10 million in a secret deal to use Dual_EC_DRBG as the default in the RSA BSAFE cryptography library, which resulted in RSA Security becoming the most important distributor of the insecure algorithm. RSA responded that they "categorically deny" that they had ever knowingly colluded with the NSA to adopt an algorithm that was known to be flawed, but also stated, "We have never kept this relationship [with the NSA] a secret and in fact have openly publicized it."

"

https://en.wikipedia.org/wiki/Dual_EC_DRBG

1h agoHN ↗

It is just possible they decided crypto code that uses it was safer to skip zeros. (Whist mathematically it should be no more likely; it is vastly more likely someone will actually try that key).

It is also possible that their code was generating too many zeros and the easiest fix was to discard them all.

1h agoHN ↗

Can you clarify what you mean by "it is vastly more likely someone will actually try that key"?

I'm guessing you don't think there are people calling rdrand in a loop and throwing away the output with high probability except when it is 0, but I can't see how else you imagine people would be vastly more likely to use the output when it is 0?

41m agoHN ↗

In lots of scenarios I know the software used to generate the key; the only unknown is the random numbers used. If I am searching for weaknesses it is highly likely I would try keys with different seeds; zero, one, are going to me much more likely choices here then hoping I can guess the right values.

1h agoHN ↗

The probability of generating a zero is incredibly low if you use the normal distribution curve.

So it is not necessarily that it doesn't generate zero, they did not run enough times to increase the probability of actually generating a zero.

1h agoHN ↗

should be a discrete uniform distribution right?

1h agoHN ↗

From what I can see they were trying to generate 16bit integers, so the probability is 1 in 65536 and they were running the test for 11 hours.

You definitely would expect a roughly equal number of 0s as any other of those numbers since it's uniformly distributed. And definitely not 0

10m agoHN ↗

You definitely would expect a roughly equal number of 0s as any other of those numbers since it's uniformly distributed.

How would random numbers be uniformly distributed?

1m agoHN ↗

So you think a weighted die is more random than a fair die? A uniform distribution means each outcome has equal probability; it doesn’t mean the outcome is predictable.

1h agoHN ↗

This also seems to happen for 16 and 32 bit numbers, so you should be able to see zeros easily.

They also write:

Running the same programs on an Intel processor, and the 0's are there with no problem.

1h agoHN ↗

I'm getting 16-bit zeros on my Zen 3 chip (+1:3821, 0:3893, -1:3895), I will wait to get some statistically significant samples for the 32-bit values and update the forum thread. Maybe it was fixed after Zen 2?

33m agoHN ↗

Does anyone have access to an HPC cluster with thousands of Zen2 chips? We might want to check 64-bit ones with that - should take just a couple years depending on the size of the machine.

Anyone from the High-Performance Computing Center Stuttgart willing to play on the 720,320 Zen2 cores?

1h agoHN ↗

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!

1h agoHN ↗

And for the full fail story behind it, fail0verflow hacking the PS3 presentation is great and covers the bug: https://youtu.be/DUGGJpn2_zY

Most of the console hacking talks are great, both informative and entertaining.

36m agoHN ↗

This comic predates that presentation, in fact they use it in their slide deck at 39:00 in your linked video.

That presentation is awesome though, worth a watch either way!

52m agoHN ↗

I think that one is referencing a run of six 9's in the digits of pi, which occur much earlier than one would "expect" them to show up in a truly uniform distribution.

52m agoHN ↗

CVE-2008-0166 (Debian OpenSSL Predictable PRNG Vulnerability) inspired xkcd/221 but this sort of thing happens a lot :)

1h agoHN ↗

Does rdrand32 and then taking the lowest 16 bits of its result yield any zeroes?

Basically I'm wondering if it's a bug in the version of the instruction that writes to a 16-bit reg, or a bug in the underlying RNG

1h agoHN ↗

Yes it does. rdrand32()%65535 was my first attempt, and generated zeroes at about the expected rate, that's why I initially erroneously thought my CPU did not have this problem.

1h agoHN ↗

How about* rdrand32()%65536? Taking the remainder by 65535 doesn't take the lowest 16 bits after all

*: missed a word the first time around

1h agoHN ↗

You should be using &0xFFFF for masking. Your mod is off by 1 too.

25m agoHN ↗

You're right, the code was correct but my comment above is wrong.

47m agoHN ↗

Even if you reproduce the issue, it is not a proof it can't generate a zero - just that it's very unlikely.

To prove it, we'd need to examine the chip and its microcode.

24m agoHN ↗

Zen 4 reporting in. I'm unable to reproduce it (7840U).

   $ ./a.out | rg '\b\-?\d\b' | sort -n | uniq -c
   15281 -2
   15192 -1
   15273 0
   15243 1
   15269 2

I used the GCC intrinsic ( _rdrand16_step ),

    #include <immintrin.h>
    
    short rdrand16() {     // gcc -mrdrnd
        short ret;
        while (1 != _rdrand16_step(&ret)) { }    
        return ret;
    }
10m agoHN ↗

I can reproduce it too with rdrand16 on Zen2.

But it looks like the rdrand16 instruction can produce zeros just fine, it just sets CF=0 erroneously (indicating an error and that the user program should retry).

So keep that in mind when you try to reproduce it too and use some abstraction that could implement retries internally.

1m agoHN ↗

Good observation, that seems like the most likely explanation. Do you ever see "true" CF=0 (with nonzero arg) or did they just take the lazy approach?

1h agoHN ↗

Usually you do "rdrand % <some-number>" anyways, and in that case you will still get zeroes. True, your result might be skewed by 1/(maxint/some-number) but I guess that's not a big problem in practice

1h agoHN ↗

I always wonder how hardware bugs like this happen with the sheer amount of hardware validation that's done. It'd be fascinating to know how it slipped through the cracks, though I know almost nothing about this side of the industry sadly

1h agoHN ↗

So what? The point is to be non predictable not to pick all the numbers in the range with exactly the same probability. Would it be a problem if it never generated 16542?

1h agoHN ↗

What are you talking about? The point is in fact to pick all the numbers in the range with exactly the same probability.

See section 7.3.17 of the Intel SDM, and how NIST SP800-90A (which the SDM refers to) defines "random number".

1h agoHN ↗

Consider an 8-bit RNG.

By your argument, it would not be a problem if the RNG never generated 0. So, it must follow that it would also not be a problem if it never generated {1, 2, 3, ..., 253}.

That means that our RNG now only generates the values 254 and 255. Which of the values is generated is unpredictable on any given call. However, 7 of the 8 output bits are now always fixed and so completely predictable. Can you imagine how an attacker could exploit that?

Failing to generate only the number 0 is a weaker version of the same class of flaw.

43m agoHN ↗

This is the “what’s the big deal if I lost $100k in a casino, it’s really the same thing as if I had lost $5” argument.

I don’t think you can rebut “you only lose one of many values” with “it’s the same as only having one left”.

20m agoHN ↗

We are not talking about amounts lost, we're talking about probabilities and whether a modification of the expected probabilities changes the dynamics of the game. The example I gave was deliberately extreme, because that makes it easier to reason about.

If you want a casino example, then consider a roulette wheel that always lands on 36 but still pays out as usual. I think you'd want to play on it. Now consider one that always lands somewhere between 30 and 36. Still worth it, right? As in, with careful bets and a good starting float you're still coming away from the table up, with a very high probability.

The point I'm making is that bias is exploitable.

34m agoHN ↗

The value space goes from 2^16, 2^32, 2^64 to 2^16 - 1, 2^32 - 1, and 2^64 - 1 respectively.

The bug has zero practical impact.

25m agoHN ↗

It is absolutely untrue that a biased RNG has "zero practical impact." Modern cryptography has plenty of examples of relatively small biases leading to breaks. Check out Bleichenbacher's attack, for instance.

You could be correct that the very small bias here is not enough to be exploitable. But, given the history around this, it would be wrong to handwave it away as trivial.

32m agoHN ↗

What does Betty from accounting care about RNGs?

1h agoHN ↗

The OP says they discovered this on a Zen 2, which is not covered by that bulletin (?)

1h agoHN ↗

Chased a similar bug in a KDF once and only caught it by histogramming the 16 bit draws, statistical suites never flagged it.

51m agoHN ↗

This is why I use, in security critical contents of my software (where the numbers have to be computationally infeasible to produce), a type of random number generator called an XOF (extendable-output function).

It takes entropy from multiple different sources, makes it all input to the XOF, then the XOF uses cryptography to output a stream that has as much entropy as the combined entropy of all of its sources of randomness. So if an XOF, for example, takes 100 runs of rdrand16, along with the system time in microseconds and the number of milliseconds between receiving 100 packets over the network, the XOF will output a completely random stream without artifacts like never returning 0x0000, even if rdrand16 never outputs 0x0000.

45m agoHN ↗

Isn’t this effectively what systems like /dev/(u)rand do? Pool multiple random sources together to hedge against these things?

I fail to see why one should either rely on a single random source nor roll their own.

22m agoHN ↗

Yes, /dev/(u)random is supposed to do that, but what if there’s a bug in the kernel which causes /dev/(u)ramdom to be less than secure? There’s also issues where, for example, it may no longer be possible to read /dev/(u)random after putting the process in a chroot() sandbox (chroot() isn’t defined in POSIX so its behavior is not guaranteed to be consistent across multiple operating systems).

getrandom() is often times suggested, but alas isn’t a standardized function, i.e. it’s not part of the POSIX specification. Considering how the C23 changes to the C specification caused a lot of perfectly good C code to no longer compile, I’m very anal about sticking to specs; I use '-std=C99' for my code these days (even though it can compile as C23 code) and stick to POSIX functions (except chroot() and setgroups(), but both of those predate POSIX, and even here I have a compile-time option to compile my code without those non-POSIX syscalls).

The code using a secure XOF (the algorithm was developed by the same team which later on made SHA-3, and includes people who helped make AES) has been around for nearly two decades (the code where I roll my own RNG to make secure random numbers has been around for over 25 years, but used AES before XOFs existed) and not one security problem has found with the RNG code has ever been found. [1] “Don’t roll your own RNG” is a suggestion, but it is possible to do so securely if one knows what they are doing (i.e. they have read Applied Cryptography and keep current with cryptographic developments).

For anything vibe coded (my code is 100% human written, for the record), rolling one’s own RNG is a really bad idea.

[1] There was a theoretical issue with cache timing attacks over two decades ago, so I put mitigations in place, and then chose to use an XOF for newer code.

36m agoHN ↗

I have a couple questions:

Looks like they tried 16-bit numbers. Does the odd behavior happen also on 32 and 64 (might take a long time to check - I'd start scratching my head after a couple hundred years of no zeroes) ones? Is the zero masking as some other fixed number, increasing its output count? Is RDRAND implemented as multiple reads of an internal state so that a larger random number takes longer?

13m agoHN ↗

I would be very concerned if an RNG simply produced a natural 0.