Processus en mode utilisateur isolé (IUM)
Windows 10 introduit une nouvelle fonctionnalité de sécurité nommée Mode sécurisé virtuel (VSM). VSM tire parti de l’hyperviseur Hyper-V et de la traduction d’adresses de deuxième niveau (SLAT) pour créer un ensemble de modes appelés niveaux de confiance virtuels (VTL). Cette nouvelle architecture logicielle crée une limite de sécurité pour empêcher les processus s’exécutant dans une VTL d’accéder à la mémoire d’une autre VTL. L’avantage de cette isolation inclut une atténuation supplémentaire des attaques de noyau tout en protégeant les ressources telles que les hachages de mot de passe et les clés Kerberos.
Le diagramme 1 illustre le modèle traditionnel du mode noyau et du code du mode utilisateur s’exécutant dans l’anneau 0 du processeur et l’anneau 3, respectivement. Dans ce nouveau modèle, le code s’exécutant dans le modèle traditionnel s’exécute dans VTL0 et il ne peut pas accéder à la VTL1 à privilèges supérieurs, où le noyau sécurisé et le mode utilisateur isolé (IUM) exécutent le code. Les VTL sont hiérarchiques, ce qui signifie que tout code s’exécutant dans VTL1 est plus privilégié que le code exécuté dans VTL0.
L’isolation VTL est créée par l’hyperviseur Hyper-V qui affecte la mémoire au démarrage à l’aide de la traduction d’adresses de deuxième niveau (SLAT). Il poursuit cette opération dynamiquement pendant l’exécution du système, en protégeant la mémoire spécifiée par le noyau sécurisé qui a besoin d’une protection contre VTL0, car elle sera utilisée pour contenir des secrets. Comme des blocs de mémoire distincts sont alloués pour les deux VTL, un environnement d’exécution sécurisé est créé pour VTL1 en affectant des blocs de mémoire exclusifs à VTL1 et VTL0 avec les autorisations d’accès appropriées.
Diagramme 1 - Architecture IUM
Trustlets
Les trustlets (également appelés processus approuvés, processus sécurisés ou processus IUM) sont des programmes exécutés en tant que processus IUM dans VSM. Ils terminent les appels système en les marshalant sur le noyau Windows s’exécutant dans L’anneau 0 VTL0. VSM crée un petit environnement d’exécution qui inclut le petit noyau sécurisé qui s’exécute dans VTL1 (isolé du noyau et des pilotes s’exécutant dans VTL0). L’avantage de sécurité clair est l’isolation des pages de mode utilisateur trustlet dans VTL1 des pilotes s’exécutant dans le noyau VTL0. Même si le mode noyau de VTL0 est compromis par un programme malveillant, il n’aura pas accès aux pages de processus IUM.
Avec VSM activé, l’environnement LSASS (Local Security Authority) s’exécute en tant que trustlet. LSASS gère la stratégie système locale, l’authentification utilisateur et l’audit tout en gérant les données de sécurité sensibles telles que les hachages de mot de passe et les clés Kerberos. Pour tirer parti des avantages en matière de sécurité de VSM, un trustlet nommé LSAISO.exe (LSA Isolé) s’exécute dans VTL1 et communique avec LSASS.exe en cours d’exécution dans VTL0 via un canal RPC. Les secrets LSAISO sont chiffrés avant de les envoyer à LSASS en mode normal VSM et les pages de LSAISO sont protégées contre le code malveillant s’exécutant dans VTL0.
Diagramme 2 – Conception du trustlet LSASS
Implications du mode utilisateur isolé (IUM)
Il n’est pas possible de l’attacher à un processus IUM, ce qui empêche la possibilité de déboguer du code VTL1. Cela inclut le débogage post mortem des vidages de mémoire et l’attachement des outils de débogage pour le débogage en direct. Il inclut également des tentatives par des comptes privilégiés ou des pilotes de noyau de charger une DLL dans un processus IUM, d’injecter un thread ou de fournir un APC en mode utilisateur. De telles tentatives peuvent entraîner une déstabilisation de l’ensemble du système. Les API Windows qui compromettraient la sécurité d’un trustlet peuvent échouer de manière inattendue. Par exemple, le chargement d’une DLL dans un trustlet la rend disponible dans VTL0, mais pas dans VTL1. QueueUserApc peut échouer en mode silencieux si le thread cible se trouve dans un trustlet. D’autres API, telles que CreateRemoteThread, VirtualAllocEx et Read/WriteProcessMemory, ne fonctionnent pas non plus comme prévu lorsqu’elles sont utilisées sur trustlets.
Utilisez l’exemple de code ci-dessous pour éviter d’appeler des fonctions qui tentent d’attacher ou d’injecter du code dans un processus IUM. Cela inclut les pilotes de noyau qui font la file d’attente des APC pour l’exécution du code dans un trustlet.
Notes
Si le status de retour d’IsSecureProcess réussit, examinez le paramètre SecureProcess _Out_ pour déterminer si le processus est un processus IUM. Les processus IUM sont marqués par le système comme « Processus sécurisés ». Un résultat booléen de TRUE signifie que le processus cible est de type 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;
}
Le WDK pour Windows 10, « Windows Driver Kit - Windows 10.0.15063.0 », contient la définition requise de la structure PROCESS_EXTENDED_BASIC_INFORMATION. La version mise à jour de la structure est définie dans ntddk.h avec le nouveau champ 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;