Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Windows 10 introdujo una nueva característica de seguridad denominada Modo seguro virtual (VSM). VSM aprovecha el Hyper-V hipervisor 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 vulnerabilidades de seguridad del kernel, al tiempo que protege recursos como hashes de contraseña y claves Kerberos.
En el diagrama 1 se muestra el modelo tradicional del modo kernel y el código de 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 tener acceso 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 aislamiento de VTL se crea mediante el hipervisor de Hyper-V que asigna memoria en tiempo de arranque mediante la traducción de direcciones de segundo nivel (SLAT). Esto continúa dinámicamente a medida que se ejecuta el sistema, protegiendo la memoria que el kernel seguro especifica la necesidad de protección de 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 asignando bloques de memoria exclusivos a VTL1 y VTL0 con los permisos de acceso adecuados.
Diagrama 1 de : arquitectura de IUM
diagrama de
Trustlets
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 VTL0 0. VSM crea un entorno de ejecución pequeño que incluye el kernel seguro pequeño 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 malware pone en peligro el modo de kernel de VTL0, 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 los 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 de : diseño de trustlets de LSASS
diagrama de de diseño de trustlets de lsass
Implicaciones del modo de usuario aislado (IUM)
No es posible adjuntar a un proceso IUM, inhibiendo 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 de 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 ponerían en peligro 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 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 adjuntar 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.
Observaciones
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;
}
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;