驱动程序可以采取哪些防御措施来防止用户空间应用程序发出 ioctl 调用,该指针的指针的类型/大小与驱动程序期望/指定为其接口的一部分不同。
例如,IOCTL x 需要一个 (struct foo *) 但调用者使用 (unsigned long) ((struct bar *)&bar) 发出它。copy_from_user 会炸毁/损害系统稳定性吗?
也许一种方法是期望调用者拥有 CAP_SYS_ADMIN 并具有隐式信任,但是还有另一种/更好的方法吗?
谢谢。
驱动程序可以采取哪些防御措施来防止用户空间应用程序发出 ioctl 调用,该指针的指针的类型/大小与驱动程序期望/指定为其接口的一部分不同。
例如,IOCTL x 需要一个 (struct foo *) 但调用者使用 (unsigned long) ((struct bar *)&bar) 发出它。copy_from_user 会炸毁/损害系统稳定性吗?
也许一种方法是期望调用者拥有 CAP_SYS_ADMIN 并具有隐式信任,但是还有另一种/更好的方法吗?
谢谢。
copy_to/from_user
使用 void 指针,这意味着它们不知道您传递的任何数据类型。并以您的示例为例,即使他们知道数据类型,您仍然不能信任您的用户:他可以简单地转换为您想要的类型:
struct bar *x;
copy_to_kernel_aware_of_foo((struct foo*)x);
期望调用者拥有任何类型的 root 权限或能力也不能解决您的问题 - root 也可能犯错误或作恶。
可以帮助一点的事情:
copy_to/from_user
复制无类型字节缓冲区。不要依赖内核空间和用户空间具有相同的复杂数据结构概念。