AMD随机数生成器竟无法生成0?

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

AMD随机数生成器竟无法生成0?

我在测试汇编代码时意外发现,AMD处理器的RDRAND和RDSEED指令似乎存在一个奇怪的问题:它们完全无法生成数值0。相比之下,Intel处理器运行同样的程序却能正常生成0。我开发了一个测试应用来验证这一现象,结果显示在AMD主机上,代表0的柱状图始终无法变化。虽然AMD团队已收到我的反馈,但目前的回复似乎并未真正理解问题所在。这一发现引发了社区对硬件随机数生成器质量及“可信硬件”概念的广泛讨论。

我怀疑这是否是AMD某个愚蠢的决定,认为0不是一个随机数。
  1. jstanley

    这不是 Zen 2 上出现的第一个 RNG 漏洞。我记得刚拿到我的 CPU 时,某个应用在启动时会立即退出,因为 rdrand 总是返回 -1,也就是全 1。后来通过微码更新修复了这个问题。

    我们现在是不是发现,他们把“总是生成全 1”的 bug 修复成了“永远不生成全 0”?

    编辑:顺便提一下,我在我的 CPU 上无法复现这个问题。用的是 Ryzen 5 3600。

    编辑 2:好吧,更新一下,我可以用 rdrand16 复现,rdrand32 没问题,但 rdrand16 确实永远无法生成全 0。所以我的 CPU 确实存在这个问题!

  2. strenholme

    这就是为什么在我软件中涉及安全关键的内容(即生成的数字必须在计算上不可行)时,我会使用一种称为 XOF(可扩展输出函数)的随机数生成器。

    它从多个不同来源获取熵,将所有这些作为 XOF 的输入,然后 XOF 利用密码学输出一个随机流,其熵值等于所有随机源熵值的总和。因此,如果一个 XOF 例如接收了 100 次 rdrand16 的运行结果,加上微秒级的系统时间,以及接收 100 个网络数据包之间的毫秒间隔,那么即使 rdrand16 永远不输出 0x0000,XOF 也会输出一个完全随机的流,不会出现像“永远不返回 0x0000”这样的伪影。

  3. 349ru3h4f03

    https://www.amd.com/en/resources/product-security/bulletin/a...

  4. CodesInChaos

    很尴尬,但实际影响可能很小,因为这些硬件随机数通常不会直接使用,而是用来给 CSPRNG 提供种子。

  5. kevinwang

    我怀疑这个问题,或者类似的问题,是不是出在这里:

    > 32 位 XorShift 通常不应用来生成 32 位数字,因为它每个数字只生成一次,而且永远不会生成零。

    (这是我之前在尝试查找这是否是 PRNG 中的常见缺陷时找到的页面:https://www.pcg-random.org/other-rngs.html

  6. matja

    我在我的 Zen 3 芯片上测到了 16 位零(+1:3821, 0:3893, -1:3895),我会等 32 位值的样本达到统计显著性后再更新论坛帖子。也许 Zen 2 之后已经修复了?

  7. 20k

    我总是好奇,在进行了如此大量的硬件验证之后,这类硬件漏洞是怎么发生的。如果能知道它是如何漏网的,那将非常有趣,尽管遗憾的是我对行业这一侧几乎一无所知。

  8. hnacobsxph

    我曾经追踪过一个 KDF 中的类似漏洞,最终只能通过绘制 16 位抽样的直方图才发现,统计套件从未将其标记出来。

同日更多故事

2026-09-22