主要内容

易受攻击的伪随机数生成器

使用加密强度较弱的伪随机数生成器

描述

当您使用加密强度较弱的伪随机数生成器 (PRNG) 例程时,会出现此缺陷。

此检测项标记的加密强度较弱的例程列表包括:

  • rand, random

  • drand48lrand48mrand48erand48nrand48jrand48,以及它们的 _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++
默认值:关闭
命令行语法:VULNERABLE_PRNG
影响
PQL 名称:std.defects.VULNERABLE_PRNG

版本历史记录

在 R2015b 中推出