Compartir a través de


Procesos de modo de usuario aislado (IUM)

Windows 10 introdujo una nueva característica de seguridad denominada Modo seguro virtual (VSM). VSM aprovecha el hipervisor de Hyper-V y la traducción de direcciones de segundo nivel (SLAT) para crear un conjunto de modos denominados Niveles de confianza virtual (VTL). Esta nueva arquitectura de software crea un límite de seguridad para evitar que los procesos que se ejecutan en un VTL accedan a la memoria de otro VTL. La ventaja de este aislamiento incluye mitigación adicional de las vulnerabilidades de seguridad del kernel, al tiempo que protege recursos como hash de contraseña y claves Kerberos.

En el diagrama 1 se muestra el modelo tradicional del modo kernel y el código del modo usuario que se ejecuta en el anillo de CPU 0 y el anillo 3, respectivamente. En este nuevo modelo, el código que se ejecuta en el modelo tradicional se ejecuta en VTL0 y no puede acceder al VTL1 con privilegios más elevados, donde el kernel seguro y el modo de usuario aislado (IUM) ejecutan código. Las VTL son jerárquicos, lo que significa que cualquier código que se ejecuta en VTL1 tiene más privilegios que el código que se ejecuta en VTL0.

El hipervisor de Hyper-V crea el aislamiento de VTL, que asigna memoria en tiempo de arranque mediante traducción de direcciones de segundo nivel (SLAT). Continúa dinámicamente a medida que se ejecuta el sistema, protegiendo la memoria que el kernel seguro especifica que se necesita protección contra VTL0 porque se usará para contener secretos. A medida que se asignan bloques de memoria independientes para las dos VTL, se crea un entorno de tiempo de ejecución seguro para VTL1 mediante la asignación de bloques de memoria exclusivos a VTL1 y VTL0 con los permisos de acceso adecuados.

Diagrama 1: Arquitectura de IUM

diagrama 1: arquitectura de ium

Trustlets

Los trustlets (también conocidos como procesos de confianza, procesos seguros o procesos IUM) son programas que se ejecutan como procesos IUM en VSM. Completan las llamadas del sistema serializandolas en el kernel de Windows que se ejecuta en el anillo 0 de VTL0. VSM crea un entorno de ejecución pequeño que incluye el pequeño kernel seguro que se ejecuta en VTL1 (aislado del kernel y los controladores que se ejecutan en VTL0). La ventaja de seguridad clara es el aislamiento de las páginas del modo de usuario trustlet en VTL1 de los controladores que se ejecutan en el kernel VTL0. Incluso si el modo kernel de VTL0 está en peligro por malware, no tendrá acceso a las páginas de proceso de IUM.

Con VSM habilitado, el entorno de la autoridad de seguridad local (LSASS) se ejecuta como un trustlet. LSASS administra la directiva del sistema local, la autenticación de usuario y la auditoría, a la vez que controla datos de seguridad confidenciales, como los hash de contraseña y las claves Kerberos. Para aprovechar las ventajas de seguridad de VSM, un trustlet denominado LSAISO.exe (aislado de LSA) se ejecuta en VTL1 y se comunica con LSASS.exe que se ejecuta en VTL0 a través de un canal RPC. Los secretos de LSAISO se cifran antes de enviarlos a LSASS que se ejecutan en el modo normal de VSM y las páginas de LSAISO están protegidas contra código malintencionado que se ejecuta en VTL0.

Diagrama 2: Diseño de trustlets de LSASS

diagrama 2: diseño de trustlets de lsass

Implicaciones del modo de usuario aislado (IUM)

No es posible asociarse a un proceso IUM, inhibindo la capacidad de depurar código VTL1. Esto incluye la depuración post mortem de volcados de memoria y la asociación de las herramientas de depuración para la depuración en vivo. También incluye intentos por cuentas con privilegios o controladores de kernel para cargar un archivo DLL en un proceso IUM, insertar un subproceso o entregar un APC en modo de usuario. Estos intentos pueden dar lugar a una desestabilización de todo el sistema. Las API de Windows que comprometerían la seguridad de un Trustlet pueden producir errores de maneras inesperadas. Por ejemplo, cargar un archivo DLL en un Trustlet hará que esté disponible en VTL0, pero no en VTL1. QueueUserApc puede producir un error en modo silencioso si el subproceso de destino está en un Trustlet. Otras API, como CreateRemoteThread, VirtualAllocEx y Read/WriteProcessMemory, tampoco funcionarán según lo previsto cuando se usen en Trustlets.

Use el código de ejemplo siguiente para evitar llamar a cualquier función que intente asociar o insertar código en un proceso de IUM. Esto incluye controladores de kernel que ponen en cola las API para la ejecución del código en un trustlet.

Comentarios

Si el estado devuelto de IsSecureProcess es correcto, examine el parámetro SecureProcess _Out_ para determinar si el proceso es un proceso IUM. Los procesos IUM están marcados por el sistema para que sean "Procesos seguros". Un resultado booleano de TRUE significa que el proceso de destino es de tipo IUM.

NTSTATUS
IsSecureProcess(
   _In_ HANDLE ProcessHandle,
   _Out_ BOOLEAN *SecureProcess
   )
{
   NTSTATUS status;

       // definition included in ntddk.h  
   PROCESS_EXTENDED_BASIC_INFORMATION extendedInfo = {0};
 
   PAGED_CODE(); 
  
   extendedInfo.Size = sizeof(extendedInfo);

   // Query for the process information  
   status = ZwQueryInformationProcess(
                  ProcessHandle, ProcessBasicInformation, &extendedInfo,
                  sizeof(extendedInfo), NULL);

   if (NT_SUCCESS(status)) {
      *SecureProcess = (BOOLEAN)(extendedInfo.IsSecureProcess != 0);
   }
 
          return status;
}

El WDK para Windows 10, "Kit de controladores de Windows: Windows 10.0.15063.0", contiene la definición necesaria de la estructura de PROCESS_EXTENDED_BASIC_INFORMATION. La versión actualizada de la estructura se define en ntddk.h con el nuevo campo IsSecureProcess.

typedef struct _PROCESS_EXTENDED_BASIC_INFORMATION {
    SIZE_T Size;    // Ignored as input, written with structure size on output
    PROCESS_BASIC_INFORMATION BasicInfo;
    union {
        ULONG Flags;
        struct {
            ULONG IsProtectedProcess : 1;
            ULONG IsWow64Process : 1;
            ULONG IsProcessDeleting : 1;
            ULONG IsCrossSessionCreate : 1;
            ULONG IsFrozen : 1;
            ULONG IsBackground : 1;
            ULONG IsStronglyNamed : 1;
            ULONG IsSecureProcess : 1;
            ULONG IsSubsystemProcess : 1;
            ULONG SpareBits : 23;
        } DUMMYSTRUCTNAME;
    } DUMMYUNIONNAME;
} PROCESS_EXTENDED_BASIC_INFORMATION, *PPROCESS_EXTENDED_BASIC_INFORMATION;