制作我自己的/ dev / random,缓冲区不工作,c

时间:2012-04-01 01:29:18

标签: c random buffer driver device

我必须制作一个设备驱动程序,它返回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);

1 个答案:

答案 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请求十页数据的攻击者不应该获得原始内核内存。)