萌えハッカーニュースリーダー

2025/08/31 18:49 Inverting the Xorshift128 random number generator

出典: https://littlemaninmyhead.wordpress.com/2025/08/31/inverting-the-xorshift128-random-number-generator/
hakase
博士

ロボ子、大変なのじゃ!Node.jsの`Math.random()`が予測可能になる脆弱性が見つかったらしいぞ!

roboko
ロボ子

それは大変ですね、博士。`Math.random()`はV8エンジンでXorshift128+アルゴリズムを使っているんですよね。

hakase
博士

そうそう!Xorshift128+は、2つの64ビットの状態(state0, state1)を使って乱数を生成するのじゃ。新しいstate0は古いstate1になって、新しいstate1は古いstate0とstate1の排他的論理和演算で決まるらしい。

roboko
ロボ子

64ビットの符号なし整数をdoubleに変換する際に、下位ビットが失われるのが問題なのですね。

hakase
博士

その通り!ブルートフォース攻撃で2<sup>128</sup>の組み合わせを試すのは大変だけど、実際にはR(state1)だけを探索すれば良いらしいぞ。

roboko
ロボ子

Rが正しければ、出力からL(state0)を決定できるからですね。2つの出力があれば、64ビットの状態の1つを知るだけで十分、と。

hakase
博士

新しいアルゴリズムでは、少なくとも2つの観測された出力から内部状態を決定するのじゃ。Rの下位26ビットを知るだけで、LとRの残りのビットを確実に決定できるらしい。

roboko
ロボ子

2<sup>26</sup>の可能性を探索するだけで済むんですね。帰納方程式を使うと、Rのビットインデックスj+26を、LとRのより小さいビットインデックスを使って計算できる、と。

hakase
博士

そう!`R[j+26] = L[j-23] ^ R[j-6] ^ L[j] ^ L[j+17] ^ R[j] ^ R[j]` この式がミソなのじゃ!

roboko
ロボ子

攻撃の疑似コードでは、Rの下位26ビットの可能なすべての推測について、帰納方程式を使って64ビットの候補L、R、Rを導出し、Xorshift128+(L, R)を計算して、出力合計を検証するんですね。

hakase
博士

速度最適化も重要じゃ。状態LとRの下位ビットの更新を遅延させたり、テーブルルックアップを使ってビットの計算を高速化するのじゃ。

roboko
ロボ子

Math.random()に適用する場合は、doubleに変換する際に失われる下位12ビットをブルートフォースで補い、3番目の出力を使って偽陽性を排除する必要があるかもしれない、と。

hakase
博士

探索空間は2<sup>50</sup>になるけど、それでも総当たりよりは全然マシなのじゃ!

roboko
ロボ子

記事によると、ChatGPTにアイデアを説明してフィードバックを得るのは有益だったけど、コードの生成は非効率だったそうですね。

hakase
博士

ふむ、AIも万能ではないということじゃな。でも、アイデア出しには使えるってことじゃ!

roboko
ロボ子

そうですね。今回の脆弱性、Node.jsのアップデートで修正されるんでしょうか。

hakase
博士

おそらくそうなるじゃろうな。しかし、`Math.random()`が予測できるなんて、まるで私が次に何を食べるか当てられるようなものじゃ!

roboko
ロボ子

博士の場合、それは簡単かもしれませんね。きっと、またチョコレートでしょう?

hakase
博士

むむ、読まれておったか!…って、プログラムの脆弱性より私の食生活の方が予測可能とは、これいかに!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search