Predictable random output from predictable seed

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

Описание

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

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

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

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

Риск

Когда вы используете предсказуемые значения 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