本文へ
ハクソク

世界を動かす技術を、日本語で。

AMDの乱数生成器は0を生成できないのか?

元記事: 原文(board.flatassembler.net)

概要

  • 乱数生成回路 の設計は電子工学とアセンブリ言語の知識で多様な手法が考えられる
  • AMD からのフィードバックはまだなく、ケースは内部でエスカレーション中
  • ベンチマーク結果 はCPUごとに大きな差異が存在
  • RNG回路 の実装は同一メーカー内でも世代やモデルで大きく異なる可能性
  • 詳細な技術情報 は公開されておらず、仕組みの全容は不明

乱数生成回路の多様性と技術的考察

  • 電子技術者 として、白色雑音(半導体の熱雑音など)を利用した 高品質な乱数生成器 の実装が可能
  • x86-64プロセッサ において乱数生成回路の設計は、IntelやAMDの エンジニアリングエリート にとって大きな技術的障壁ではない認識
  • 半導体ノイズ を利用したRNG回路は、予測困難性が極めて高い
  • ソフトウェアとハードウェア の両視点から設計アプローチの多様性

AMDへの問い合わせ状況

  • AMD からの公式な追加フィードバックは未受領
  • ケースは AMD内でエスカレーション されており、今後のアップデート待ち
  • テスト期間中 (投稿前9日間含む)、所有する2台のAMDプロセッサからは 一度も0が出力されていない 状況

ベンチマーク結果とプロセッサごとの差異

  • 新しいテストアプリケーション で、'rdseed'命令非搭載CPUでも 乱数生成ベンチマーク が可能
  • Core i5 (2012) :1秒間に約 12.6M個 の乱数生成
  • Core i7 7700 (2017) :1秒間に約 750k個 の乱数生成
  • AMD Ryzen 7 :1秒間に約 2.6M個 の乱数生成
  • クロック依存性 :Core i5は100%クロック依存、AMDはクロック変動に 全く影響されない 挙動
  • 同一メーカー内でも世代・モデルによるRNG回路の大きな違い

RNG回路の情報不足と考察

  • 公開情報 では、各プロセッサの RNGユニットの詳細な仕組み は不明
  • 異なるバージョンやリビジョン が存在し、設計思想や回路構成が大きく異なる可能性
  • エンジニア視点 で見ても、現状では 十分な技術的ドキュメント が見当たらない状況

提供: ハクソク · 要約更新:

AIによる日本語要約です。内容は原文とあわせてご確認ください。

Hacker Newsの議論を読む

Hackerたちの意見

恥ずかしいけど、実際にはあまり影響はないと思う。これらのハードウェア乱数は直接使われることは少なくて、CSPRNGのシードとして使われることが多いからね。

└

セオドア・ツによると、Intelのエンジニアからの圧力で、/dev/randomがRDRAND命令だけに依存するようにしようとしたらしい。「Intelのエンジニアからの圧力に抵抗できて本当に良かった。以下の記事から引用すると、『今年までに、Sigint Enabling Projectは、企業や政府のために情報を暗号化するチップの中に、バックドアを挿入する方法を見つけた。』ハードウェアの乱数生成器に完全に依存するのは、監査不可能なチップの中に封じ込められた実装を使っているから、悪いアイデアだよ。」https://web.archive.org/web/20180611180213/https://plus.goog... CSPRNGにバックドアを入れるのは、暗号を破るための好まれた方法だよ、例えばDual_EC_DRBGみたいに。「そのアルゴリズムの暗号セキュリティの弱点は、ANSI、ISO、そして以前はNISTによって承認された正式な標準の一部になる前から知られていて、公に批判されていた。公に特定された弱点の一つは、そのアルゴリズムが、知っている人にとって有利な暗号的バックドアを抱える可能性があることだった。2013年にニューヨークタイムズは、彼らが持っているが公にされていない文書が『バックドアが実在することを確認するように見える』と報じた。2013年12月、ロイターのニュース記事は、2004年にNISTがDual_EC_DRBGを標準化する前に、NSAがRSA Securityに1,000万ドルを支払って、RSA BSAFE暗号ライブラリのデフォルトとしてDual_EC_DRBGを使用する秘密の契約を結んだと主張した。RSAは、彼らがNSAと共謀して欠陥のあるアルゴリズムを採用したことを『明確に否定する』と応じたが、『NSAとの関係を秘密にしたことはなく、実際に公に広めてきた』とも述べた。」https://en.wikipedia.org/wiki/Dual_EC_DRBG

Zen 3チップで16ビットのゼロが出てるんだよね(+1:3821, 0:3893, -1:3895)。32ビットの値で統計的に有意なサンプルを集めるまで待って、フォーラムのスレッドを更新するつもり。もしかしたらZen 2の後に修正されたのかも?

└

誰か、数千のZen2チップを持つHPCクラスターにアクセスできる人いる?64ビットのものをチェックしたいんだけど - マシンのサイズによっては数年かかるはず。シュトゥットガルトの高性能計算センターの誰か、720,320のZen2コアで遊んでみない?

Zen 2でのRNGバグはこれが初めてじゃないよ。最初に手に入れたとき、あるアプリが起動時にすぐ落ちちゃったのを思い出す。なぜなら、rdrandが常に-1、つまり全て1を返してたから。マイクロコードのアップデートで修正されたんだよね。今度は「常に全て1を生成する」のが「決して全て0を生成しない」に修正されたってこと?追記:私のCPUでは問題を再現できなかったけど、参考までに。Ryzen 5 3600なんだ。追記2:あ、アップデート。rdrand16で再現できるけど、rdrand32は問題ない。rdrand16は全て0を生成することができないみたい。だから、私のCPUにはこの問題があるんだね!

└

4を返す # 公平なサイコロの結果によって決まる。

└

rdrand32を使って、その結果の下位16ビットを取ったらゼロが出るかな?基本的には、16ビットレジスタに書き込む命令のバージョンにバグがあるのか、それとも基盤のRNGにバグがあるのか疑問なんだ。

└

これ、覚えてるかもね。https://news.ycombinator.com/item?id=19848953

└

問題を再現できたとしても、それがゼロを生成できない証明にはならないよ。ただ、非常に可能性が低いってだけ。証明するには、チップとそのマイクロコードを調べる必要があるね。

└

Zen 4の報告です。再現できないんだけど(7840U)。$ ./a.out | rg '\b-?\d\b' | sort -n | uniq -c 15281 -2 15192 -1 15273 0 15243 1 15269 2 GCCのイントリンシック(_rdrand16_step)を使ったよ。

#include
short rdrand16() {
    short ret;
    while (1 != _rdrand16_step(&ret)) {
    }
    return ret;
}
└

Zen2でrdrand16を使うと再現できるよ。でも、rdrand16命令はゼロを普通に出せるみたいで、CF=0を誤って設定しちゃう(エラーを示して、ユーザープログラムが再試行すべきってこと)。だから、再現するときはそのことを考慮して、内部で再試行を実装できる抽象化を使ってね。

└

確か、私たちが持っていたすべてのLinuxサーバーには、AMD CPUのバグのせいでCPUをカーネルのRNGシーダーから外す設定があったよ。つまり、GRUB_CMDLINE_LINUXにrandom.trust_cpu=off nordrandって書いてた。

Hacker Newsで議論の続きを見る