安全でない乱数生成

安全でない乱数生成

説明

rand などの予測可能な乱数生成器をセキュリティトークン、セッション識別子、鍵の材料に使うと、値を推測されるおそれがあります。

想定される影響

  • トークンの予測、セッションの乗っ取り、暗号による保護の低下につながる可能性があります。

対処方法

OSのCSPRNGや、検証された暗号学的乱数APIを使用してください。要求したバイト数をすべて取得できたかを確認し、失敗したバッファーをトークンや鍵に使わないでください。

例

変更前

c
int token = rand();

変更後

Linuxで <sys/random.h> をインクルードし、エラー時に -1 を返す関数内の抜粋です。

c
unsigned char token[32];
if (getrandom(token, sizeof(token), 0) != (ssize_t)sizeof(token)) {
    return -1;
}

解説:

  • 変更前: 予測可能な汎用PRNGを、セキュリティ上重要な値の生成に使っています。
  • 変更後: OSの暗号学的乱数を使い、32バイトすべてを取得できなければ処理を中止します。

参考資料