ioctl有效负载类型/大小违规

时间:2012-08-17 17:52:34

标签: linux-kernel linux-device-driver

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

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

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

感谢。

1 个答案:

答案 0 :(得分:4)

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

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

期望调用者具有任何类型的root权限或功能也无法解决您的问题 - root也可能会出错或者是邪恶的。

可以帮助的事情:

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