メインコンテンツ

CERT C: Rule MSC30-C

Do not use the rand() function for generating pseudorandom numbers

説明

ルール定義

疑似乱数を生成する関数 rand() を使用しないようにします。1

Polyspace 実装

ルール チェッカーは、"疑似乱数を生成するための rand() の使用" をチェックします。

すべて展開する

問題

この問題は、疑似乱数を生成するために関数 rand を使用した場合に発生します。

リスク

関数 rand は、暗号法的に脆弱です。つまり、rand によって生成される数は予測される可能性があります。rand から生成された疑似乱数をセキュリティの目的に使用しないでください。予測可能な乱数値で実行フローを制御する場合は、プログラムが攻撃に対して脆弱になります。

修正方法

CryptGenRandom (Windows)、OpenSSL/RAND_bytes(Linux/UNIX)、random (POSIX) などの暗号法的に堅牢な疑似乱数を使用します。

例 - ランダムなループ回数

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

volatile int rd = 1;
int main(int argc, char *argv[])
{   
	int j, r, nloops;
	struct random_data buf;
	int i = 0;
	
	nloops = rand(); //Noncompliant
	
	for (j = 0; j < nloops; j++) {
		i = rand(); //Noncompliant
		printf("random_r: %ld\n", (long)i);
	}
	return 0;
}

この例では、rand を使用して、乱数の nloopsi を生成します。これらの変数の予測可能性によって、これらの関数が攻撃に対して脆弱になります。

修正 — より強固な PRNG を使用

1 つの修正方法として、脆弱な PRNG を、より強固な乱数発生器に置き換えます。たとえば、このコードでは POSIX ライブラリの PRNG random() が使用されています。random は、呼び出されるたびに異なる数でシード値が生成されるため、非常に強力な PRNG です。


  
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define TIME_UTC 1
volatile int rd = 1;
int randomWrapper(){
	struct timespec ts;
  if (timespec_get(&ts, TIME_UTC) == 0) {
    /* Handle error */
  }
  srandom(ts.tv_nsec ^ ts.tv_sec);  /* Seed the PRNG */
	return random();
}
int main(int argc, char *argv[])
{   
    int j, r, nloops;
    struct random_data buf;
    int i = 0;
    
    nloops = randomWrapper();
    
    for (j = 0; j < nloops; j++) {
		i = randomWrapper();
        printf("random_r: %ld\n", (long)i);
    }
    return 0;
}

チェック情報

グループ: Rule 48.その他 (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.