节对象和视图的安全问题
创建不与用户模式共享的节和视图的驱动程序在使用节和视图时必须使用以下协议:
驱动程序在打开 section 对象的句柄时必须使用内核句柄。 驱动程序可以通过在系统进程中创建句柄或指定句柄的 OBJ_KERNEL_HANDLE 属性来确保句柄是内核句柄。 有关详细信息,请参阅 对象句柄。
只能从系统线程映射视图。 (否则,可从其上下文中创建视图的进程进行访问。) 驱动程序可以使用系统工作线程执行映射操作,确保从系统进程映射视图。 有关详细信息,请参阅 系统辅助角色线程 和 驱动程序线程上下文。
与用户模式进程共享视图的驱动程序在使用节和视图时必须使用以下协议:
驱动程序(而不是用户模式进程)必须创建节对象并映射视图。
如前所述,驱动程序在打开 section 对象的句柄时必须使用内核句柄。 驱动程序可以通过在系统进程中创建句柄或指定句柄的 OBJ_KERNEL_HANDLE 属性来确保句柄是内核句柄。 有关详细信息,请参阅 对象句柄。
视图在共享视图的进程线程上下文中映射。 最高级别的驱动程序可以通过在调度例程(如 DispatchDeviceControl)中执行映射操作,保证视图在当前进程上下文中映射。 较低级别驱动程序的调度例程在任意线程上下文中运行,因此无法在调度例程中安全地映射视图。 有关详细信息,请参阅 驱动程序线程上下文。
必须尝试-保护对驱动程序中视图的所有内存访问(块除外)。 恶意用户模式应用程序可能会取消映射视图或更改视图的保护状态。 两者都会导致系统崩溃,除非受除阻止的尝试-保护。 有关详细信息,请参阅 处理异常。
驱动程序还必须根据需要验证视图的内容。 驱动程序编写器不能假定只有受信任的用户模式组件才能访问视图。
必须能够创建自己的视图的用户模式应用程序共享 section 对象的驱动程序 (必须能够创建自己的视图) 必须使用以下协议:
驱动程序(而不是用户模式进程)必须创建 section 对象。 驱动程序不得使用从用户模式传递的句柄。
在将句柄传递到用户模式之前,驱动程序必须调用 ObReferenceObjectByHandle 以获取对 section 对象的引用。 这可以防止恶意应用程序通过关闭句柄删除节对象。 对象引用应存储在驱动程序的设备扩展中。
驱动程序不再使用 section 对象后,它必须调用 ObDereferenceObject 来释放对象引用。
在运行 Microsoft Windows Server 2003 且 Service Pack 1 (SP1) 及更高版本的系统上,只有内核模式驱动程序可以打开 \Device\PhysicalMemory。 但是,驱动程序可以决定为用户应用程序提供句柄。 若要防止出现安全问题,应仅向驱动程序信任的用户应用程序授予对 \Device\PhysicalMemory 的访问权限。