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

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

Описание

Детерминированный случайный вывод от постоянного seed обнаруживает случайные стандартные функции, что, когда дали постоянный seed, имейте детерминированный вывод.

Риск

Когда некоторые случайные функции, такие как srand, srandom, и initstate, имеют постоянные 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