AMDの乱数生成器、0を生成できない?
AMD's random number generator can't generate a 0?

アセンブリ開発者のJessé氏が、AMDのRDRAND/RDSEED命令で16ビットの0が全く生成されない現象を報告。Intelでは問題なく0が出力される。同氏のテストアプリでは、AMD環境で0のカウントバーが変化せず、9日間で一度も0が出なかった。AMDに問い合わせるも、AIが生成したような回答で、現在も調査中。
AMDから返信があったが、担当者は私の結果を完全に誤読しているか、AIを使って回答を作成したようだ。ChatGPTで以前に同じ問題を指摘した人がいないか確認したときの回答とあまりに似ていたからだ。
HNでの議論
166- jstanley
これはZen 2での最初のRNGバグではない。最初に手に入れた後、rdrandが常に-1(つまりすべて1)を返すために、何らかのアプリケーションが起動直後に終了するのを覚えている。それはマイクロコードアップデートで修正された。
今になって、彼らが「常にすべて1を生成する」を「決してすべて0を生成しない」で修正したと知るのか??
編集:ちなみに、私のCPUではこの問題を再現できなかった。Ryzen 5 3600だ。
編集2:OK、更新、rdrand16で再現できた。rdrand32は問題ないが、rdrand16は決してすべて0を生成できない。つまり私のCPUにはこの問題がある!
- strenholme
これが、私がソフトウェアのセキュリティ上重要な部分(計算上生成が不可能な数値が必要な場合)で、XOF(拡張出力関数)と呼ばれる種類の乱数生成器を使う理由だ。
それは複数の異なるソースからエントロピーを取り、すべてをXOFへの入力とし、XOFは暗号技術を使って、そのすべてのランダム性ソースの合計エントロピーと同じだけのエントロピーを持つストリームを出力する。たとえば、XOFがrdrand16の100回の実行と、マイクロ秒単位のシステム時刻、ネットワーク経由で100パケットを受信する間のミリ秒数を入力として受け取ると、XOFはrdrand16が0x0000を決して出力しないとしても、0x0000を決して返さないといったアーティファクトのない完全にランダムなストリームを出力する。
- 349ru3h4f03
https://www.amd.com/en/resources/product-security/bulletin/a...
- CodesInChaos
恥ずかしいが、おそらく実用的な影響はほとんどない。なぜなら、これらのハードウェア乱数は通常直接使われず、代わりにCSPRNGのシードとして使われるからだ。
- matja
私のZen 3チップでは16ビットのゼロが出ている(+1:3821、0:3893、-1:3895)。32ビット値について統計的に有意なサンプルが得られるまで待って、フォーラムスレッドを更新するつもりだ。もしかしたらZen 2の後に修正されたのか?
- 20k
これほどのハードウェア検証が行われているのに、どうしてこのようなハードウェアバグが起こるのかいつも不思議に思う。どうやって見逃されたのかを知るのは興味深いだろうが、残念ながら私は業界のこの側面についてほとんど何も知らない。
- fred_is_fred
「もしかしたらどこかのC?OがRDRANDを実行したのかも」
というのは、C?Oが日常的に何をしているかについての、面白いほどひどい誤解だ。
- hnacobsxph
かつてKDFで同様のバグを追跡し、16ビットのドローをヒストグラム化して初めて捕まえた。統計スイートは決してそれを指摘しなかった。