Deterministic random output from constant seed

Стандартная программа посева использует постоянный seed, делая выход детерминированным

Описание

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

Проверка обнаруживает эту проблему со следующими функциями генератора случайных чисел:

  • Функции стандартной библиотеки C, такие как srand, srandom и initstate

  • Функции OpenSSL, такие как RAND_seed и RAND_add

  • Функции стандартной библиотеки C++, такие как std::linear_congruential_engine<>::seed() и std::mersenne_twister_engine<>::seed() (а также конструкторы этих шаблонов классов)

Риск

С постоянными началами функции генератора случайных чисел выдают одинаковый выход каждый раз, когда ваша программа запускается. Хакер может сорвать вашу программу, если узнает, как ведет себя ваша программа.

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

Используйте другую случайную стандартную функцию или неконстантный seed.

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

Примеры

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

#include <stdlib.h>

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

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

Коррекция - Используйте другой генератор случайных чисел

Одной из возможных коррекций является использование генератора случайных чисел, который не требует seed. Этот пример использует 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++
По умолчанию: Off
Синтаксис командной строки: RAND_SEED_CONSTANT
Влияние: Средний
ИДЕНТИФИКАТОР CWE: 330, 336
Введенный в R2015b