説明
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バイトすべてを取得できなければ処理を中止します。