我可以说copy_to_user()/ copy_from_user()是一个带有access_ok()的memcpy吗?

时间:2016-11-04 03:57:29

标签: linux linux-kernel

我们知道,对于安全问题,如果我们想在用户空间和内核空间之间进行内存复制,我们应该使用copy_to_user()/ copy_from_user()。

我的问题是,所以memcpy()应该比copy_to_user()/ copy_from_user()具有更好的性能?因为memcpy()没有做任何事情来保护系统,我是对的吗?

如果我们不关心安全问题,我们可以使用memcpy()而不是copy_to_user()/ copy_from_user()来获得更好的性能吗? (这是一个坏主意,我知道,只是问它是否正确)

1 个答案:

答案 0 :(得分:1)

答案是:不,因为安全问题在内核中从不相关。

memcpy()特别是使用不好的函数,因为第三个参数是有符号整数。如果用户可以以任何方式影响第三个参数的值,那么如果有人试图复制负数字节,您就会面临严重的责任问题。

许多严重的缓冲区溢出错误都归因于memcpy()

的签名

另一个答案:不,因为copy_to_user()copy_from_user()不是access_ok()。前两个函数确保您当前正在尝试实现的副本将成功或失败。这不是access_ok()为您做的事情。 access_ok()的文档明确指出此函数不能保证内存访问实际上会成功:

Note that, depending on architecture, this function probably just 
checks that the pointer is in the user space range - after calling 
this function, memory access functions may still return -EFAULT.

例如,对于x86,我最新的源代码的运行时检查超出了access_ok()https://lwn.net/Articles/612153/

然而第三个答案:memcpy()可能效率更高。原则上你可以在这里和那里保存一些指令,但是一旦你复制了超过最小数量的数据,那些设置和检查指令就可以忽略不计了。