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