メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

CERT C++: MSC32-C

Properly seed pseudorandom number generators

説明

ルール定義

疑似乱数発生器のシードを適切に設定します。1

Polyspace 実装

ルール チェッカーは以下の問題をチェックします。

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

  • 予測可能なシードによる予測可能な乱数出力です

すべて展開する

問題

定数シードからの確定的な乱数出力ですでは、定数シードが与えられると出力が確定的になる標準乱数関数を検出します。

リスク

srandsrandominitstate などの一部の乱数関数に定数シードがある場合、プログラムが実行されるたびに同じ出力が結果として生成されます。プログラムの動作がわかると、ハッカーはプログラムを中断できます。

修正方法

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

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

例 - 乱数発生器の初期化
#include <stdlib.h>

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

この例では、定数シードを指定して 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;
    }
}
問題

予測可能なシードによる予測可能な乱数出力ですは、非定数であっても予測可能なシードを使用する標準乱数関数を調べます。予測可能なシード発生器には、timegettimeofdaygetpid などがあります。

リスク

予測可能なシード値を乱数発生に使用すると、その乱数も予測可能になります。プログラムの動作がわかると、ハッカーはプログラムを中断できます。

修正方法

別の関数を使用して、予測しにくいシードを生成します。

また、シードを必要としない別の乱数発生器を使用することもできます。たとえば、Windows® API の関数 rand_s は、既定でそれ自体にシードします。システム時間、スレッド ID、システム カウンター、メモリ クラスターなど、システム全体からの情報が使用されます。こうした情報はよりランダムであり、ユーザーはこれにアクセスできません。

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

例 - 引数としてのシード
#include <stdlib.h>
#include <time.h>

void seed_rng(int seed)
{
    srand(seed); //Noncompliant
}

int generate_num(void)
{
    seed_rng(time(NULL) + 3);
    /* ... */
}

この例では srand を使用し、seed にシードを指定して乱数発生器を起動します。しかし、seed は関数 time によって生成されるため、予測可能です。そのため、攻撃者は srand によって生成される乱数を予測できます。

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

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



#define _CRT_RAND_S

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

int generate_num(void)
{
    unsigned int number;
    errno_t err;
    err = rand_s(&number);

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

チェック情報

グループ: 49.その他 (MSC)

バージョン履歴

R2019a で導入


1 This software has been created by MathWorks incorporating portions of: the “SEI CERT-C Website,” © 2017 Carnegie Mellon University, the SEI CERT-C++ Web site © 2017 Carnegie Mellon University, ”SEI CERT C Coding Standard – Rules for Developing safe, Reliable and Secure systems – 2016 Edition,” © 2016 Carnegie Mellon University, and “SEI CERT C++ Coding Standard – Rules for Developing safe, Reliable and Secure systems in C++ – 2016 Edition” © 2016 Carnegie Mellon University, with special permission from its Software Engineering Institute.

ANY MATERIAL OF CARNEGIE MELLON UNIVERSITY AND/OR ITS SOFTWARE ENGINEERING INSTITUTE CONTAINED HEREIN IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT.

This software and associated documentation has not been reviewed nor is it endorsed by Carnegie Mellon University or its Software Engineering Institute.