gpt4 book ai didi

copy_to_user 与 memcpy

转载 作者:太空狗 更新时间:2023-10-29 16:45:55 25 4
gpt4 key购买 nike

我一直被告知(在书籍和教程中)在将数据从内核空间复制到用户空间时,我们应该使用 copy_to_user() 并且使用 memcpy() 会给系统带来问题。最近我错误地使用了 memcpy(),它工作得很好,没有任何问题。 为什么我们应该使用 copy_to_user 而不是 memcpy()

我的测试代码(内核模块)是这样的:

static ssize_t test_read(struct file *file, char __user * buf,
size_t len, loff_t * offset)
{
char ani[100];

if (!*offset) {
memset(ani, 'A', 100);
if (memcpy(buf, ani, 100))
return -EFAULT;
*offset = 100;
return *offset;
}

return 0;
}

struct file_operations test_fops = {
.owner = THIS_MODULE,
.read = test_read,
};

static int __init my_module_init(void)
{
struct proc_dir_entry *entry;

printk("We are testing now!!\n");
entry = create_proc_entry("test", S_IFREG | S_IRUGO, NULL);
if (!entry)
printk("Failed to creats proc entry test\n");

entry->proc_fops = &test_fops;
return 0;
}
module_init(my_module_init);

从用户空间应用程序,我正在读取我的 /proc 条目,一切正常。

查看 copy_to_user() 的源代码表明它也是简单的 memcpy(),我们只是尝试使用 access_ok 检查指针是否有效并执行 memcpy。

所以我的理解目前是,如果我们确定我们正在传递的指针,则始终可以使用 memcpy() 代替 copy_to_user

如果我的理解不正确,请纠正我,而且,任何 copy_to_user 有效且 memcpy() 失败的示例都将非常有用。谢谢。

最佳答案

这有几个原因。

首先,安全。因为内核可以写入它想要的任何地址,如果您只使用您获得的用户空间地址并使用 memcpy,攻击者可以写入另一个进程的页面,这是一个巨大的安全问题。 copy_to_user 检查目标页面是否可由当前进程写入。

还有一些架构注意事项。例如,在 x86 上,目标页面必须固定在内存中。在某些体系结构上,您可能需要特殊说明。等等。 Linux 内核的便携性目标需要这种抽象。

关于copy_to_user 与 memcpy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14970698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com