Linux kernel ioctl有效负载类型/大小冲突

Linux kernel ioctl有效负载类型/大小冲突,linux-kernel,linux-device-driver,Linux Kernel,Linux Device Driver,如果用户空间应用程序使用指针发出ioctl调用,其指针对象的类型/大小与驱动程序期望/指定为其接口的一部分的类型/大小不同,那么驱动程序可以采取什么防御措施来保护用户空间应用程序 例如,假设ioctlx需要一个(structfoo*),但调用者发出了(unsignedlong)((structbar*)&bar)。从用户处复制\u会破坏/损害系统稳定性吗 也许一种方法是期望调用方拥有CAP_SYS_ADMIN并拥有隐式信任,但还有其他/更好的方法吗 谢谢。copy\u to/from\u use

如果用户空间应用程序使用指针发出ioctl调用,其指针对象的类型/大小与驱动程序期望/指定为其接口的一部分的类型/大小不同,那么驱动程序可以采取什么防御措施来保护用户空间应用程序

例如,假设ioctlx需要一个(structfoo*),但调用者发出了(unsignedlong)((structbar*)&bar)。从用户处复制\u会破坏/损害系统稳定性吗

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


谢谢。

copy\u to/from\u user
使用空指针,这意味着它们不知道您传递的任何数据类型。举个例子,即使他们知道数据类型,您仍然不能信任您的用户:他可以简单地转换为您想要的类型:

struct bar *x;
copy_to_kernel_aware_of_foo((struct foo*)x);
期望调用方拥有任何类型的root特权或功能也不能解决您的问题-root也可能犯错误或是邪恶的

一些可以帮助你的事情:

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