Vulnerable pseudo-random number generator

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

Описание

Этот дефект возникает, когда вы используете криптографически слабый генератор псевдослучайных чисел (PRNG) стандартных программ.

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

  • rand, random

  • drand48, lrand48, mrand48, erand48, nrand48, jrand48и их _r эквиваленты, такие как drand48_r

  • RAND_pseudo_bytes

Риск

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

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

Используйте больше криптографически исправных генераторов случайных чисел, таких как CryptGenRandom (Windows), OpenSSL/RAND_bytes(Linux/UNIX).

Примеры

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

#include <stdio.h>
#include <stdlib.h>

volatile int rd = 1;
int main(int argc, char *argv[])
{   
    int j, r, nloops;
    struct random_data buf;
    int i = 0;
    
    nloops = rand();
    
    for (j = 0; j < nloops; j++) {
        if (random_r(&buf, &i))
            exit(1);
        printf("random_r: %ld\n", (long)i);
    }
    return 0;
}

Этот пример использует rand и random_r для генерации случайных чисел. Если вы используете эти функции в целях безопасности, эти PRNG могут быть источником вредоносных атак.

Коррекция - используйте более сильный PRNG

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

#include <stdio.h>
#include <stdlib.h>
#include <openssl/rand.h>

volatile int rd = 1;
int main(int argc, char* argv[])
{   
    int j, r, nloops;
    unsigned char buf;
    unsigned int seed;
    int i = 0;
    
    if (argc != 3) 
    {
        fprintf(stderr, "Usage: %s <seed> <nloops>\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    
    seed = atoi(argv[1]);
    nloops = atoi(argv[2]);
    
    for (j = 0; j < nloops; j++) {
        if (RAND_bytes(&buf, i) != 1)
            exit(1);
        printf("RAND_bytes: %u\n", (unsigned)buf);
    }
    return 0;
}

Информация о результатах

Группа: Безопасность
Язык: C | C++
По умолчанию: Off
Синтаксис командной строки: VULNERABLE_PRNG
Влияние: Средний
ИДЕНТИФИКАТОР CWE: 330, 338
Введенный в R2015b