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 функции генератора случайных чисел производят тот же выход каждый раз, когда ваша программа запущена. Хакер может разрушить вашу программу, если они знают, как ваша программа ведет себя.

Фиксация

Используйте различную случайную стандартную функцию или используйте непостоянный 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
Удар: Средняя
ID CWE: 330, 336
Введенный в R2015b