exponenta event banner

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

Процедура посева использует постоянное начальное число, делающее вывод детерминированным

Описание

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

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

  • Стандартные библиотечные функции C, такие как srand, srandom и initstate

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

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

Риск

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

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

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

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

Примеры

развернуть все

#include <stdlib.h>

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

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

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

Одной из возможных корректировок является использование генератора случайных чисел, который не требует начального числа. В этом примере используется 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++
По умолчанию: Откл.
Синтаксис командной строки: RAND_SEED_CONSTANT
Воздействие: среднее
CWE ID: 330, 336
Представлен в R2015b