Предсказуемый случайный вывод от предсказуемого seed

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

Описание

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

Риск

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

Фиксация

Можно использовать различную функцию, чтобы сгенерировать менее предсказуемые seed.

Можно также использовать различный генератор случайных чисел, который не требует seed. Например, API-функция Windows® rand_s отбирает себя по умолчанию. Это использует информацию от целой системы, например, системное время, идентификаторы потока, системный счетчик и кластеры памяти. Эта информация более случайна, и пользователь не может получить доступ к этой информации.

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

Примеры

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

#include <stdlib.h>
#include <time.h>

void seed_rng(int seed)
{
    srand(seed);
}

int generate_num(void)
{
    seed_rng(time(NULL) + 3);
    /* ... */
}

Этот пример использует srand, чтобы запустить генератор случайных чисел с seed как seed. Однако seed предсказуем, потому что функциональный time генерирует его. Так, атакующий может предсказать случайные числа, сгенерированные srand.

Исправление — использует различный генератор случайных чисел

Одно возможное исправление должно использовать генератор случайных чисел, который не требует seed. Этот пример использует rand_s.


#define _CRT_RAND_S

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

int generate_num(void)
{
    unsigned int number;
    errno_t err;
    err = rand_s(&number);

    if(err != 0)
    {
        return number;
    }
    else
    {
        return err;
    }
}

Информация о результате

Группа: безопасность
Язык: C | C++
Значение по умолчанию: 'off'
Синтаксис командной строки: RAND_SEED_PREDICTABLE
Влияние: носитель
ID CWE: 330, 337

Введенный в R2015b