exponenta event banner

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

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

Описание

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

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

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

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

Риск

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

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

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

Можно также использовать другой генератор случайных чисел, для которого не требуется начальное число. Например, функция Windows ® APIrand_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 предсказуемо, поскольку функция time генерирует его. Таким образом, злоумышленник может предсказать случайные числа, генерируемые srand.

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

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