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

标签 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);

最佳答案

unsigned int random_num; 
get_random_bytes(&random_num, 1);

您错误地使用了 get_random_bytes()。第二个参数是字节数,不是字数:

void get_random_bytes(void *buf, int nbytes)

您进一步将私有(private)内核内存返回给用户空间:

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

关于c - 制作我自己的/dev/random,缓冲区不工作,c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9961199/

相关文章:

python - 通过替换对 2D numpy 数组中的行进行采样

c++ - Nix Gradle dist - 无法为 Linux amd64 加载 native 库 'libnative-platform.so'

将 uint8_t 连接到一个 char*

c - 为 stdin、stdout 和 stderr 定义和初始化数组

java - 有没有办法在另一种方法中使用随机数组方法中的现有变量?

javascript - 如何随机排序列表项?

log4j - "BufferSize"在 log4j appender 中代表什么?

c - 如何确定 SQLBindCol 的正确缓冲区大小

java - 使用缓冲区将字符串转换为 UTF-8

c - C 中最快的去交织操作?