Partager via


Processus de mode utilisateur isolé (IUM)

Windows 10 a introduit une nouvelle fonctionnalité de sécurité nommée Virtual Secure Mode (VSM). VSM tire parti de l'Hyper-V hyperviseur et de la traduction d’adresses de deuxième niveau (SLAT) pour créer un ensemble de modes appelés niveaux de confiance virtuelle (VTL). Cette nouvelle architecture logicielle crée une limite de sécurité pour empêcher les processus s’exécutant dans une durée de vie virtuelle d’accéder à la mémoire d’une autre durée de vie virtuelle. 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 de processeur 0 et l’anneau 3, respectivement. Dans ce nouveau modèle, le code en cours d’exécution dans le modèle traditionnel s’exécute dans VTL0 et il ne peut pas accéder au VTL1 privilégié supérieur, où le noyau sécurisé et le mode utilisateur isolé (IUM) exécutent du code. Les VTL sont hiérarchiques, ce qui signifie que tout code exécuté dans VTL1 est plus privilégié que le code exécuté dans VTL0.

L’isolation de la durée de vie virtuelle est créée par l’hyperviseur Hyper-V qui affecte de la mémoire au moment du démarrage à l’aide de la traduction d’adresses de deuxième niveau (SLAT). Il continue de cette façon dynamique à mesure que le système s’exécute, protégeant la mémoire du noyau sécurisé qui spécifie la nécessité d’une protection contre VTL0, car il sera utilisé 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

diagramme 1 - Architecture ium

Trustlets

Les trustlets (également appelés processus approuvés, processus sécurisés ou processus IUM) sont des programmes qui s’exécutent 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 VTL0 0. VSM crée un environnement d’exécution de petite taille qui inclut le petit noyau sécurisé s’exécutant dans VTL1 (isolé du noyau et des pilotes s’exécutant dans VTL0). L’avantage de sécurité clair est l’isolation des pages en 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 les programmes malveillants, 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 qu’approbationlet. 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 de sécurité de VSM, un trustlet nommé LSAISO.exe (LSA Isolé) s’exécute dans VTL1 et communique avec LSASS.exe s’exécutant dans VTL0 via un canal RPC. Les secrets LSAISO sont chiffrés avant de les envoyer à LSASS s’exécutant 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 d’un trustlet LSASS

diagramme 2 : conception de lsass trustlet

Implications du mode utilisateur isolé (IUM)

Il n’est pas possible d’attacher à un processus IUM, ce qui empêche le débogage 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 de comptes privilégiés ou de pilotes de noyau pour charger une DLL dans un processus IUM, pour injecter un thread ou fournir un APC en mode utilisateur. Ces 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 le 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 comme prévu lorsqu’elles sont utilisées sur trustlets.

Utilisez l’exemple de code ci-dessous pour empêcher l’appel de toutes les fonctions qui tentent d’attacher ou d’injecter du code dans un processus IUM. Cela inclut les pilotes de noyau qui filent d’attente des API pour l’exécution du code dans un trustlet.

Remarques

Si l’état de retour de IsSecureProcess est réussi, 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, « Kit de pilotes Windows - 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;