Freigeben über


Isolierter Benutzermodus (IUM)-Prozesse

Windows 10 hat ein neues Sicherheitsfeature namens Virtual Secure Mode (VSM) eingeführt. VSM nutzt den Hyper-V Hypervisor und SLAT (Second Level Address Translation) zum Erstellen einer Reihe von Modi namens Virtual Trust Levels (VTLs). Diese neue Softwarearchitektur erstellt eine Sicherheitsgrenze, um zu verhindern, dass Prozesse, die in einer VTL ausgeführt werden, auf den Speicher einer anderen VTL zugreifen. Der Vorteil dieser Isolation umfasst zusätzliche Entschärfung von Kernel-Exploits und gleichzeitigen Schutz von Ressourcen wie Kennworthashes und Kerberos-Schlüsseln.

Diagramm 1 zeigt das herkömmliche Modell des Kernelmodus und des Benutzermoduscodes, der in CPU-Ring 0 bzw. Ring 3 ausgeführt wird. In diesem neuen Modell wird der code, der im herkömmlichen Modell ausgeführt wird, in VTL0 ausgeführt und kann nicht auf die höher privilegierte VTL1 zugreifen, wobei der sichere Kernel und der isolierte Benutzermodus (IUM) Code ausführen. Die VTLs sind hierarchisch, was bedeutet, dass jeder Code, der in VTL1 ausgeführt wird, privilegierter ist als Code, der in VTL0 ausgeführt wird.

Die VTL-Isolation wird vom Hyper-V Hypervisor erstellt, der beim Start mithilfe der SLAT (Second Level Address Translation) Arbeitsspeicher zuweist. Dies wird dynamisch fortgesetzt, während das System ausgeführt wird, und der Schutz des sicheren Kernels gibt an, dass der Schutz vor VTL0 erforderlich ist, da er verwendet wird, um geheime Schlüssel zu enthalten. Da separate Speicherblöcke für die beiden VTLs zugewiesen werden, wird eine sichere Laufzeitumgebung für VTL1 erstellt, indem exklusive Speicherblöcke mit den entsprechenden Zugriffsberechtigungen VTL1 und VTL0 zugewiesen werden.

Diagramm 1 – IUM-Architektur

Diagramm 1 – iumarchitektur

Trustlets

Trustlets (auch als vertrauenswürdige Prozesse, sichere Prozesse oder IUM-Prozesse bezeichnet) sind Programme, die als IUM-Prozesse in VSM ausgeführt werden. Sie führen Systemaufrufe durch Marshalling an den Windows-Kernel aus, der in VTL0 Ring 0 ausgeführt wird. VSM erstellt eine kleine Ausführungsumgebung, die den kleinen sicheren Kernel enthält, der in VTL1 ausgeführt wird (isoliert vom Kernel und treibern, die in VTL0 ausgeführt werden). Der klare Sicherheitsvorteil ist die Isolierung von Trustlet-Benutzermodusseiten in VTL1 von Treibern, die im VTL0-Kernel ausgeführt werden. Selbst wenn der Kernelmodus von VTL0 durch Schadsoftware kompromittiert wird, hat er keinen Zugriff auf die IUM-Prozessseiten.

Wenn VSM aktiviert ist, wird die Umgebung der lokalen Sicherheitsbehörde (Local Security Authority, LSASS) als Trustlet ausgeführt. LSASS verwaltet die lokale Systemrichtlinie, benutzerauthentifizierung und Überwachung bei der Verarbeitung vertraulicher Sicherheitsdaten wie Kennworthashes und Kerberos-Schlüssel. Um die Sicherheitsvorteile von VSM zu nutzen, wird ein Trustlet namens LSAISO.exe (LSA Isolated) in VTL1 ausgeführt und kommuniziert mit LSASS.exe, die in VTL0 über einen RPC-Kanal ausgeführt werden. Die LSAISO-Geheimnisse werden verschlüsselt, bevor sie an LSASS gesendet werden, die im VSM Normalmodus ausgeführt werden, und die Seiten von LSAISO sind vor bösartigem Code geschützt, der in VTL0 ausgeführt wird.

Diagramm 2 – LSASS Trustlet Design

Diagramm 2 – lsass trustlet design

Auswirkungen des isolierten Benutzermodus (IUM)

Es ist nicht möglich, an einen IUM-Prozess anzufügen, was die Möglichkeit zum Debuggen von VTL1-Code verhindert. Dies umfasst das Nachsterbendebugging von Speicherabbildern und das Anfügen der Debugtools für das Livedebugging. Es enthält auch Versuche von privilegierten Konten oder Kerneltreibern, eine DLL in einen IUM-Prozess zu laden, einen Thread einzufügen oder einen Benutzermodus-APC bereitzustellen. Solche Versuche können zur Destabilisierung des gesamten Systems führen. Windows-APIs, die die Sicherheit eines Trustlet gefährden würden, können auf unerwartete Weise fehlschlagen. Das Laden einer DLL in ein Trustlet stellt sie beispielsweise in VTL0, aber nicht in VTL1 zur Verfügung. QueueUserApc schlägt möglicherweise automatisch fehl, wenn sich der Zielthread in einem Trustlet befindet. Andere APIs wie CreateRemoteThread, VirtualAllocEx und Read/WriteProcessMemory funktionieren auch nicht wie erwartet, wenn sie für Trustlets verwendet werden.

Verwenden Sie den folgenden Beispielcode, um das Aufrufen von Funktionen zu verhindern, die versuchen, Code an einen IUM-Prozess anzufügen oder einzufügen. Dazu gehören Kerneltreiber, die APCs für die Ausführung von Code in einem Trustlet in die Warteschlange stellen.

Bemerkungen

Wenn der Rückgabestatus von IsSecureProcess erfolgreich ist, überprüfen Sie den Parameter SecureProcess _Out_, um zu ermitteln, ob der Prozess ein IUM-Prozess ist. IUM-Prozesse werden vom System als "Sichere Prozesse" gekennzeichnet. Ein boolesches Ergebnis von TRUE bedeutet, dass der Zielprozess vom Typ IUM ist.

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;
}

Das WDK für Windows 10, "Windows Driver Kit – Windows 10.0.15063.0", enthält die erforderliche Definition der PROCESS_EXTENDED_BASIC_INFORMATION-Struktur. Die aktualisierte Version der Struktur wird in ntddk.h mit dem neuen IsSecureProcess-Feld definiert.

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;