Compartir a través de


Problemas de seguridad para objetos y vistas de sección

Los controladores que crean secciones y vistas que no se van a compartir con el modo de usuario deben usar el siguiente protocolo cuando trabajan con secciones y vistas:

  • El controlador debe usar un identificador de kernel cuando abra un identificador para el objeto section. Los controladores pueden asegurarse de que un identificador es un identificador de kernel creandolo en el proceso del sistema o especificando el atributo OBJ_KERNEL_HANDLE para el identificador. Para obtener más información, vea Identificadores de objeto.

  • La vista solo debe asignarse desde un subproceso del sistema. (De lo contrario, se puede acceder a la vista desde el proceso cuyo contexto se crea en). Un controlador puede asegurarse de que la vista está asignada desde el proceso del sistema mediante un subproceso de trabajo del sistema para realizar la operación de asignación. Para obtener más información, vea Subprocesos de trabajo del sistema y Contexto de subprocesos del controlador.

Los controladores que comparten una vista con un proceso en modo de usuario deben usar el siguiente protocolo cuando trabajen con secciones y vistas:

  • El controlador, no el proceso en modo de usuario, debe crear el objeto de sección y asignar las vistas.

  • Como se mencionó anteriormente, el controlador debe usar un identificador de kernel al abrir un identificador para el objeto de sección. Los controladores pueden asegurarse de que un identificador es un identificador de kernel creandolo en el proceso del sistema o especificando el atributo OBJ_KERNEL_HANDLE para el identificador. Para obtener más información, vea Identificadores de objeto.

  • La vista se asigna en el contexto de subproceso del proceso que comparte la vista. Un controlador de nivel superior puede garantizar que la vista se asigna en el contexto de proceso actual realizando la operación de asignación en una rutina de distribución, como DispatchDeviceControl. Las rutinas de envío de controladores de nivel inferior se ejecutan en un contexto de subproceso arbitrario y, por tanto, no pueden asignar de forma segura una vista en una rutina de envío. Para obtener más información, vea Contexto del subproceso del controlador.

  • Todos los accesos de memoria a la vista dentro del controlador deben estar protegidos por try-excepto los bloques. Una aplicación malintencionada en modo de usuario podría desasignación de la vista o cambiar el estado de protección de la vista. Cualquiera de los dos provocaría un bloqueo del sistema a menos que esté protegido por un intento-excepto un bloque. Para obtener más información, consulte Control de excepciones.

El controlador también debe validar el contenido de la vista según sea necesario. El escritor de controladores no puede suponer que solo un componente de modo usuario de confianza tendrá acceso a la vista.

Un controlador que debe compartir un objeto de sección con una aplicación en modo de usuario (que debe poder crear sus propias vistas) debe usar el protocolo siguiente:

  • El controlador, no el proceso en modo de usuario, debe crear el objeto section. Los controladores nunca deben usar un identificador que se pasó desde el modo de usuario.

  • Antes de pasar el identificador al modo de usuario, el controlador debe llamar a ObReferenceObjectByHandle para obtener una referencia al objeto section. Esto impide que una aplicación malintencionada elimine el objeto de sección cerrando el identificador. La referencia de objeto debe almacenarse en la extensión del dispositivo del controlador.

  • Una vez que el controlador ya no use el objeto section, debe llamar a ObDereferenceObject para liberar la referencia del objeto.

En sistemas que ejecutan Microsoft Windows Server 2003 con Service Pack 1 (SP1) y versiones posteriores, solo los controladores en modo kernel pueden abrir \Device\PhysicalMemory. Sin embargo, los controladores pueden decidir dar un identificador a una aplicación de usuario. Para evitar problemas de seguridad, solo las aplicaciones de usuario en las que confía el controlador deben tener acceso a \Device\PhysicalMemory.