exponenta event banner

CERT C: MSC32-C правил

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

Описание

Определение правила

Правильно затравить генераторы псевдослучайных чисел [1 ].

Внедрение Polyspace

Эта проверка проверяет наличие следующих проблем:

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

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

Примеры

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

Проблема

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

Риск

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

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

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

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

Пример - Инициализация генератора случайных чисел
#include <stdlib.h>

void random_num(void)
{
    srand(12345U);
    /* ... */
}

В этом примере инициализируется генератор случайных чисел с помощью srand с постоянным семенем. Генерация случайных чисел является детерминированной, делая эту функцию криптографически слабой.

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

Одной из возможных корректировок является использование генератора случайных чисел, который не требует начального числа. В этом примере используется 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;
    }
}
Проблема

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

Риск

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

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

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

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

Проверить информацию

Группа: Правило 48. Разное (MSC)
Представлен в R2019a

[1] Данное программное обеспечение было создано компанией MathWorks и включает в себя следующие компоненты: «Веб-сайт SEI CERT-C», © 2017 Университет Карнеги-Меллон, веб-сайт SEI CERT-C + + © 2017 Университет Карнеги-Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги-Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ МЕЛЛОНА И/ИЛИ ЕГО ПРОГРАММНОГО ИНЖЕНЕРНОГО ИНСТИТУТА, СОДЕРЖАЩИЙСЯ В НАСТОЯЩЕМ ДОКУМЕНТЕ, ПОСТАВЛЯЕТСЯ КАК ЕСТЬ. УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ, ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, В ОТНОШЕНИИ ЛЮБЫХ ВОПРОСОВ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИИ ПРИГОДНОСТИ ДЛЯ ЦЕЛЕЙ ИЛИ ТОВАРНОЙ ПРИГОДНОСТИ, ИСКЛЮЧИТЕЛЬНОСТИ ИЛИ РЕЗУЛЬТАТОВ, ПОЛУЧЕННЫХ ОТ ИСПОЛЬЗОВАНИЯ УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ В ОТНОШЕНИИ СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКИХ ПРАВ.

Данное программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллона или его Институтом разработки программного обеспечения.