我必须制作一个设备驱动程序,它返回1到50之间的随机数,并且对我的设备驱动程序的缓冲区如何工作感到困惑,以及如何使其表现得像/dev/random.
我做了一个测试程序,看看/ dev / random是如何工作的:
int test_read = open("/dev/random", O_RDONLY);
int get_random_num(void) {
unsigned int random_num;
read(test_read, &random_num, sizeof(random_num));
return (random_num % 50) + 1;
}
然后这是我的设备驱动程序的读取功能(简明版):
my_random_read(struct file* file, char* buf,
size_t count, loff_t* ppos)
{
unsigned int random_num;
get_random_bytes(&random_num, 1);
int my_num = 1 + (random_num % 50)
int* my_num_pointer = &my_num;
copy_to_user(buf, my_num_pointer, count);
}
当我在QEMU上运行我的测试仪时,我得到-1074311964:/
我怎样才能做到这一点,我所要做的就是用/ dev / my_random替换/ dev / random?
这就是我从/ dev / my_random中读取的内容:
read(test_read, &random_number, sizeof(random_number), 0);
答案 0 :(得分:2)
unsigned int random_num;
get_random_bytes(&random_num, 1);
您错误地使用了get_random_bytes()
。第二个参数是字节数,而不是单词:
void get_random_bytes(void *buf, int nbytes)
您正在进一步将私有内核内存返回给用户空间:
my_random_read(struct file* file, char* buf,
size_t count, loff_t* ppos)
{
/* ... */
int* my_num_pointer = &my_num;
copy_to_user(buf, my_num_pointer, count);
}
您在count
上执行了 no 验证 - 此处您只有一个,也许两个字节的实际随机数据。其余数据是垃圾堆栈数据,您已将其泄露给用户空间。这是一个安全漏洞 - 内核不应该将未初始化的数据泄露给用户空间。 (自己依赖它可能是垃圾,但是从/dev/random
请求十页数据的攻击者不应该获得原始内核内存。)