メインコンテンツ

定数シードからの確定的な乱数出力です

出力を確定的にする定数シードがシード ルーチンで使用されている

説明

この欠陥は、定数シードが与えられると出力が確定的になる標準乱数発生器関数が使用された場合に発生します。

チェッカーは、以下の乱数発生器関数を使用してこの問題を検出します。

  • srandsrandominitstate などの C 標準ライブラリ関数

  • RAND_seedRAND_add などの OpenSSL 関数

  • std::linear_congruential_engine<>::seed()std::mersenne_twister_engine<>::seed() などの C++ 標準ライブラリ関数 (およびこれらのクラス テンプレートのコンストラクター)

リスク

定数シードを使用した場合、乱数発生器関数は、プログラムが実行するたびに同じ出力を生成します。プログラムの動作がわかると、ハッカーはプログラムを中断できます。

修正方法

別の標準乱数関数を使用するか、非定数シードを使用します。

標準乱数ルーチンの一部は本質的に暗号面で脆弱なため、セキュリティ保護の目的では使用しないでください。

すべて展開する

#include <stdlib.h>

void random_num(void)
{
    srand(12345U);
    /* ... */
}

この例では、定数シードを指定して srand を使用する乱数発生器を初期化します。乱数発生は確定的であり、そのためこの関数は暗号面で脆弱になります。

修正 — 別の乱数発生器を使用

1 つの修正方法として、シードを必要としない乱数発生器を使用します。次の例では rand_s を使用しています。


#define _CRT_RAND_S
#include <stdlib.h>
#include <stdio.h>

unsigned int random_num_time(void)
{

    unsigned int number;
    errno_t err;
    err = rand_s(&number);

    if(err != 0)
    {
        return number;
    }
    else
    {
        return err;
    }
}

結果情報

グループ: セキュリティ
言語: C | C++
既定値: オフ
コマンド ライン構文: RAND_SEED_CONSTANT
影響度: Medium

バージョン履歴

R2015b で導入