CERT C: Rule MSC32-C

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

Описание

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

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

Реализация Polyspace

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

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

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

Примеры

расширить все

Проблема

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

Риск

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

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

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

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

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

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

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

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

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

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

Риск

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

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

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

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

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

Пример - Seed как аргумент
#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;
    }
}

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

Группа: Правило 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 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

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

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