午前I問題
コンピュータにおける乱数生成に関する記述として、適切なものはどれか。
ア)真性乱数(True Random Number)は、放射性崩壊や熱雑音など物理現象を利用して生成される乱数であり、疑似乱数と異なり再現性を持たない。
イ)疑似乱数生成器(PRNG)はアルゴリズムによって決定論的に数列を生成するため、同一のシード値を与えれば常に同一の数列が再現される。この性質はどのような用途でも問題にならない。
ウ)擬似乱数と真性乱数は生成方式が異なるだけで、暗号用途における安全性には一切差がない。
エ)乱数のシード値には、常にシステム起動時刻など予測が容易な値を用いるべきである。
午前I の解答・解説を見る
正解: ア
解説:
- ア)正解。真性乱数は放射性崩壊のタイミング、熱雑音、大気ノイズなど物理現象由来のエントロピー(不確実性)を元に生成される乱数であり、原理的に再現性を持ちません。これに対し疑似乱数はアルゴリズムによる決定論的な計算で生成されます。
- イ)不正解。前半の「同一シードから同一数列が再現される」という性質自体は正しいですが、この性質は暗号鍵生成やセッションIDの発行など「予測不可能性」が求められる用途では致命的な弱点になります。「どのような用途でも問題にならない」という結論は誤りです。
- ウ)不正解。暗号用途においては、生成方式の違いが安全性に直結します。一般的なPRNG(線形合同法等)は数列から内部状態を逆算できる場合があり、暗号論的に安全とはみなされません。真性乱数や暗号論的疑似乱数生成器(CSPRNG)を用いる必要があります。
- エ)不正解。システム起動時刻のような予測が容易な値をシードに使うと、攻撃者がシード値を推測でき、生成される乱数列(延いては暗号鍵等)を再現される危険があります。シードにはエントロピーの高い予測困難な値を使うべきです。
午前II問題
暗号論的に安全な疑似乱数生成器(CSPRNG)に関する記述のうち、適切なものはどれか。
ア)CSPRNGは一般的なPRNG(メルセンヌ・ツイスタ等)と同様に統計的な偏りのなさのみが要件であり、内部状態から過去または未来の出力を予測できないという要件は課されない。
イ)CSPRNGは、生成された出力の一部(過去の乱数値)が漏えいしても、そこから内部状態やこれから生成される将来の乱数値を予測できない性質(前方予測不可能性・後方予測不可能性)が求められる。
ウ)OSが提供する/dev/urandom(Linux)やCryptGenRandom(Windows。現在はBCryptGenRandom)などのAPIは暗号用途に不十分であり、アプリケーション開発者は独自の乱数生成アルゴリズムを実装すべきである。
エ)暗号鍵やセッションIDの生成には、rand()関数やメルセンヌ・ツイスタ等の一般的なPRNGを用いても、シード値さえ秘匿すれば十分な安全性が確保できる。
午前II の解答・解説を見る
正解: イ
解説:
- ア)不正解。CSPRNGには統計的偏りのなさに加えて、「次の出力予測不可能性(next-bit test:過去の出力列から次のビットを有意に高い確率で予測できないこと)」という暗号学的要件が課されます。メルセンヌ・ツイスタのような一般的PRNGは統計的性質は優れていても、内部状態が推測されると将来の出力が予測できてしまうため、CSPRNGとしては不適格です。
- イ)正解。CSPRNGには「過去の出力が漏れても将来の出力を予測できない(前方予測不可能性)」「現在の内部状態が漏れても過去の出力を逆算できない(後方予測不可能性、Backtracking Resistance)」という2つの性質が求められます。これにより一時的な内部状態の漏えいが起きても被害を限定できます。
- ウ)不正解。OSが提供する
/dev/urandomやBCryptGenRandom(Windows)はCSPRNGとして設計・実装された標準APIであり、暗号用途に適した乱数源として広く推奨されています。「独自実装すべき」という記述は誤りであり、実務では車輪の再発明(独自の乱数アルゴリズム実装)はむしろ脆弱性の温床になりがちなため避けるべきとされています。 - エ)不正解。
rand()関数やメルセンヌ・ツイスタは統計的品質は高くても暗号論的安全性(予測不可能性)を満たさないため、シード値を秘匿しても出力列から内部状態が推測されるリスクが残ります。暗号鍵やセッションIDの生成には必ずCSPRNG(言語・OS標準の暗号用APIなど)を使用すべきです。
| 用語 | 意味 |
|---|---|
| PRNG | 疑似乱数生成器。統計的品質は求められるが暗号論的安全性は保証されない場合がある |
| CSPRNG | 暗号論的に安全な疑似乱数生成器。予測不可能性(前方・後方)が要件 |
| エントロピー | 乱数源が持つ不確実性・予測困難性の度合い |
午後問題
L社が開発したWebアプリケーションにおいて、パスワードリセット機能で発行されるトークンが第三者に推測され、アカウント乗っ取り被害が発生した。インシデント対応チームが調査した結果、以下が判明した。
(調査結果1)パスワードリセットトークンは、言語標準のMath.random()関数(一般的なPRNGであり暗号論的安全性を保証しないもの)の出力を16進数文字列に変換して生成されていた。
(調査結果2)このPRNGの内部状態(シード)は、Webサーバプロセスの起動時刻をミリ秒単位で用いて初期化されていた。攻撃者はサーバのHTTPレスポンスヘッダに含まれるサーバ日時とサービスの応答パターンから、起動時刻を数秒程度の誤差で絞り込めることを実証した。
(調査結果3)攻撃者は絞り込んだシード候補を総当たりし、PRNGの出力アルゴリズムを再現することで、特定ユーザ宛に発行されたリセットトークンを数分以内に導出できた。
設問1
本インシデントの根本原因を、CSPRNGの要件(前方・後方予測不可能性)と対比させながら50字以内で述べよ。
設問1の解答・解説を見る
正解例: 一般的なPRNGを使用し、かつシードが予測可能な値だったため、内部状態が推測されトークンが予測可能となった。
解説: 根本原因は2点の複合です。第一に、トークン生成に暗号論的安全性を持たないPRNG(Math.random()等)を用いたこと。このPRNGは統計的な均一性はあっても、内部状態(シード)が分かれば出力列全体を再現できるアルゴリズムであり、CSPRNGが備えるべき「予測不可能性」の要件を満たしません。第二に、シード値としてサーバ起動時刻という低エントロピーかつ外部から推測可能な値を用いたこと。攻撃者はHTTPヘッダ等の副次的な情報からシード候補を絞り込めたため、総当たりでシードを特定でき、結果としてリセットトークンという「秘密であるべき値」が予測可能になってしまいました。
採点基準(12点):
- 「暗号論的に安全でないPRNGを使用した」(6点)
- 「シード(起動時刻)が予測可能な低エントロピー値だった」(6点)
設問2
本インシデントの再発防止策を、トークン生成方式の観点から2つ、あわせて70字以内で述べよ。
設問2の解答・解説を見る
正解例: ①トークン生成にはOS/言語標準のCSPRNG(例:crypto.randomBytes())を用いる。②トークンに十分なビット長(128ビット以上)とサーバ側での有効期限・一度きりの利用制限を設ける。
解説: 再発防止策の第一は、トークン生成のアルゴリズムそのものをCSPRNGに置き換えることです。Node.jsであればcrypto.randomBytes()、Javaであればjava.security.SecureRandom、Pythonであればsecretsモジュールなど、各言語・プラットフォームが提供する暗号論的に安全な乱数APIを利用することで、内部状態の推測によるトークン予測を防止できます。第二に、トークン自体の設計として、十分なビット長(一般に128ビット以上)を持たせて総当たり攻撃を計算量的に不可能にすることに加え、有効期限(例えば発行から15分以内)の設定や、一度使用されたトークンを即座に無効化する(使い回し防止)といった多層的な対策を組み合わせることが重要です。これらはOWASPのパスワードリセットに関するベストプラクティスとしても推奨されています。
採点基準(14点):
- 「CSPRNG(暗号論的に安全な乱数生成API)への置き換え」を具体例とともに説明(8点)
- 「十分なビット長」「有効期限・使い捨て運用」等の補完的対策(6点)
重要キーワード
| 用語 | 説明 |
|---|---|
| PRNG(疑似乱数生成器) | アルゴリズムで決定論的に数列を生成する乱数生成器。暗号論的安全性は保証されない場合がある |
| CSPRNG(暗号論的擬似乱数生成器) | 前方・後方予測不可能性を満たす、暗号用途に適した乱数生成器 |
| エントロピー | 乱数源・シード値が持つ不確実性の度合い。低いと予測攻撃を受けやすい |
| シード値 | PRNGの初期状態を決定する値。予測可能な値を使うと出力全体が推測されうる |
| 前方予測不可能性・後方予測不可能性 | 過去の出力から将来を、または現在の状態から過去を推測できない性質 |
| ハッシュ関数 | トークン生成や乱数値の後処理で用いられることもある一方向性関数 |
まとめ
- 午前I視点: 真性乱数と疑似乱数の違い、シード値の予測可能性が暗号安全性に与える影響を理解しておく
- 午前II視点: CSPRNGに求められる「予測不可能性」の要件と、一般的PRNG(メルセンヌ・ツイスタ等)との違いを正確に説明できるようにする
- 午後視点: 「一般PRNGの利用」「予測可能なシード」という組み合わせがトークン推測攻撃を招くパターンを理解し、CSPRNGへの置き換えとトークン設計(ビット長・有効期限)をセットで答えられるよう準備する