节对象和视图的安全问题

创建不与用户模式共享的分区和视图的驱动程序在使用节和视图时必须使用以下协议:

  • 驱动程序在打开节对象的句柄时必须使用内核句柄。 驱动程序可以通过在系统进程中创建句柄或指定句柄的OBJ_KERNEL_HANDLE属性来确保句柄是内核句柄。 有关详细信息,请参阅 对象句柄

  • 视图必须仅从系统线程映射。 (否则,可以从创建其上下文的进程中访问视图。)驱动程序可以通过使用系统工作线程来执行映射操作,确保视图是从系统进程映射的。 有关详细信息,请参阅 系统工作线程驱动程序线程上下文

与用户模式进程共享视图的驱动程序在使用节和视图时必须遵循以下协议:

  • 驱动程序(而不是用户模式进程)必须创建节对象并映射视图。

  • 如前所述,驱动程序在打开节对象句柄时必须使用内核句柄。 驱动程序可以通过在系统进程中创建句柄或指定句柄的OBJ_KERNEL_HANDLE属性来确保句柄是内核句柄。 有关详细信息,请参阅 对象句柄

  • 该视图在共享视图的进程线程上下文中映射。 最高级别的驱动程序可以通过在调度例程(例如 DispatchDeviceControl)中执行映射作来保证视图在当前进程上下文中映射。 较低级别的驱动程序的调度例程在任意线程上下文中运行,因此无法在调度例程中安全地映射视图。 有关详细信息,请参阅 驱动程序线程上下文

  • 驱动程序中视图的所有内存访问必须通过 try-except 块进行保护。 恶意用户模式应用程序可以取消映射视图或更改视图的保护状态。 两者都会导致系统崩溃,除非被try-except 块保护。 有关详细信息,请参阅 处理异常

驱动程序还必须根据需要验证视图的内容。 驱动程序编写器不能假定只有受信任的用户模式组件有权访问视图。

必须与用户模式应用程序共享节对象的驱动程序(必须能够创建自己的视图)必须使用以下协议:

  • 驱动程序(而不是用户模式进程)必须创建节对象。 驱动程序绝不能使用从用户模式传递的句柄。

  • 在将句柄传递给用户模式之前,驱动程序必须调用 ObReferenceObjectByHandle 以获取对节对象的引用。 这样可以防止恶意应用程序通过关闭句柄来删除节对象。 对象引用应存储在驱动程序的设备扩展中。

  • 驱动程序不再使用 section 对象后,它必须调用 ObDereferenceObject 才能释放对象引用。

在运行 Microsoft Windows Server 2003 Service Pack 1(SP1)及更高版本的系统上,只有内核模式驱动程序才能打开 \Device\PhysicalMemory。 但是,驱动程序可以决定为用户应用程序提供句柄。 为了防止安全问题,只有驱动程序信任的用户应用程序才有权访问 \Device\PhysicalMemory