【问题标题】:Can I say copy_to_user()/copy_from_user() is a memcpy with access_ok()?我可以说 copy_to_user()/copy_from_user() 是带有 access_ok() 的 memcpy 吗?
【发布时间】:2017-03-17 20:05:42
【问题描述】:

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

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

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

【问题讨论】:

    标签: linux linux-kernel


    【解决方案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() 可能效率并不高。原则上,您可能会在这里和那里保存一些说明,但是一旦您复制的数据量超过了最少量的数据,这些设置和检查说明将可以忽略不计。

    【讨论】:

      猜你喜欢
      • 2013-02-04
      • 2015-12-05
      • 2015-06-06
      • 2023-03-20
      • 2020-11-13
      • 1970-01-01
      • 2015-10-04
      • 1970-01-01
      • 2018-02-21
      相关资源
      最近更新 更多