CERT C: Rule MSC32-C

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

Описание

Управляйте определением

Правильно отберите псевдослучайное число generators.[1]

Реализация Polyspace

Это средство проверки проверяет на эти проблемы:

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

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

Примеры

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

Проблема

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

Риск

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

Фиксация

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

Фиксация

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

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

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

Пример - 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 Carnegie Mellon University, веб-сайт SEI CERT-C © 2017 Carnegie Mellon University”, CERT SEI C Кодирование Стандарта – Правил для Разработки безопасных, Надежных и Защищенных систем – 2 016 Выпусков”, © 2016 Carnegie Mellon University, and “CERT SEI Стандарт Кодирования C++ – Правил для Разработки безопасных, Надежных и Защищенных систем на C++ – 2 016 Выпусков” © 2016 Carnegie Mellon University, со специальным разрешением от его Института программной инженерии.

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

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