我有一个设备驱动程序,它允许用户空间应用程序使用 ioctl 机制执行各种操作。作为初始 ioctl 调用的一部分返回的是一个句柄,该句柄应该对应用程序在其他 ioctl 调用中提供的用户空间应用程序是不透明的。
在驱动程序内部,句柄是内核空间中某些控制/上下文块的地址。如果可以信任应用程序忠实地传回返回的句柄,那么一切都很好。担心的是如果应用程序是恶意的并传回一些任意句柄,然后驱动程序将其转换为适当的指针类型并取消引用它。
我正在考虑的一项健全性检查是与 PAGE_OFFSET 进行比较,如果小于则拒绝(以确保地址至少指向内核内存)。如果我认为在内核空间中不合法的页面错误怎么办?一个简单的方案可能是检查句柄是否先前已返回到用户空间,但搜索的开销可能很高(因为可能有很多这样的句柄)。
是否有一种强大而有效的方法来验证句柄?任何帮助表示赞赏。
谢谢。