CERT C: Rule MSC30-C

Не используйте функцию rand () для генерации псевдослучайных чисел

Описание

Определение правила

Не используйте функцию rand () для генерации псевдослучайных чисел.[1]

Реализация Polyspace

Эта проверка проверяет на использование rand() для генерации псевдослучайного числа.

Примеры

расширить все

Проблема

Эта проблема возникает при использовании функции rand для генерации псевдослучайных чисел.

Риск

Функция rand является криптографически слабым. То есть числа, сгенерированные rand может быть предсказуемым. Не используйте псевдослучайные числа, сгенерированные из rand в целях безопасности. Когда предсказуемое случайное значение управляет потоком выполнения, ваша программа уязвима для атак.

Зафиксировать

Используйте больше криптографически надежных генераторов псевдослучайных чисел (PRNG), таких как 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();
	
	for (j = 0; j < nloops; j++) {
		i = rand();
		printf("random_r: %ld\n", (long)i);
	}
	return 0;
}

Этот пример использует rand для генерации случайных чисел nloops и i. Предсказуемость этих переменных делает эту функцию уязвимой для атак.

Коррекция - используйте более сильный PRNG

Одной из возможных коррекций является замена уязвимого PRNG на более сильный генератор случайных чисел. Например, этот код использует PRNG random() из библиотеки POSIX. 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;
}

Проверяйте информацию

Группа: Правило 48. Разное (MSC)
Введенный в R2019a

[1] Это программное обеспечение было создано MathWorks, включающее фрагменты: «Сайт SEI CERT-C», © 2017 Университет Карнеги Меллон, Веб-сайт SEI CERT-C + + © 2017 Университет Карнеги Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ МЕЛЛОН И/ИЛИ ЕГО ИНЖЕНЕРНОГО ИНСТИТУТА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, СОДЕРЖАЩИЙСЯ В НАСТОЯЩЕМ ДОКУМЕНТЕ, ПОСТАВЛЯЕТСЯ НА БАЗИСЕ «КАК ЕСТЬ». УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ, ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, В ОТНОШЕНИИ ЛЮБОГО ВОПРОСА, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЮ ПРИГОДНОСТИ ДЛЯ ЦЕЛЕЙ ИЛИ КОММЕРЧЕСКОЙ ВЫГОДЫ, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ В ОТНОШЕНИИ СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКИХ ПРАВ.

Это программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллон или его Институтом программной инженерии.