Predictable random output from predictable 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