【问题标题】:ioctl payload type/size violationioctl 有效负载类型/大小违规
【发布时间】:2012-08-18 02:02:03
【问题描述】:

驱动程序可以采取哪些防御措施来防止用户空间应用程序发出 ioctl 调用,该指针的指针的类型/大小不同于驱动程序作为其接口的一部分所期望/指定的类型/大小。

例如说 IOCTL x 需要一个 (struct foo *) 但调用者用 (unsigned long) ((struct bar *)&bar) 发出它。 copy_from_user 会炸毁/损害系统稳定性吗?

也许一种方法是期望调用者拥有 CAP_SYS_ADMIN 并具有隐式信任,但还有另一种/更好的方法吗?

谢谢。

【问题讨论】:

    标签: linux-kernel linux-device-driver


    【解决方案1】:

    copy_to/from_user 使用 void 指针,这意味着它们不知道您传递的任何数据类型。鉴于您的示例,即使他们知道数据类型,您仍然不能信任您的用户:他可以简单地转换为您想要的类型:

    struct bar *x;
    copy_to_kernel_aware_of_foo((struct foo*)x);
    

    期望调用者拥有任何类型的 root 权限或能力也不能解决您的问题 - root 也可能犯错误或作恶。

    有点帮助的事情:

    • 仅使用copy_to/from_user 复制无类型字节缓冲区。不要依赖具有相同概念的复杂数据结构的内核和用户空间。
    • 如果您只担心数据类型错误,您可以考虑标记您的数据结构,使其在“真实”数据之间包含一些神奇的值。不过,这并不能帮助您防止调用者故意伪造数据。
    • 就攻击面而言,攻击者可能不会通过传递错误的数据类型来攻击您,而是提供错误的值。除了正确验证从用户空间传递给您的所有数据之外,没有什么可以帮助您。不检查就不要相信任何东西!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多