Isolierte Benutzermodusprozesse (IUM)
Windows 10 ein neues Sicherheitsfeature namens Virtual Secure Mode (VSM) eingeführt. VSM nutzt den Hyper-V-Hypervisor und die Second Level Address Translation (SLAT), um eine Reihe von Modi zu erstellen, die als virtuelle Vertrauensstufen (Virtual Trust Levels, VTLs) bezeichnet werden. Diese neue Softwarearchitektur schafft eine Sicherheitsgrenze, um zu verhindern, dass Prozesse, die in einer VTL ausgeführt werden, auf den Arbeitsspeicher einer anderen VTL zugreifen. Der Vorteil dieser Isolation umfasst eine zusätzliche Entschärfung durch Kernel-Exploits, während Ressourcen wie Kennworthashes und Kerberos-Schlüssel geschützt werden.
Diagramm 1 zeigt das herkömmliche Modell des Kernelmodus und des Benutzermoduscodes, die in CPU-Ring 0 bzw. Ring 3 ausgeführt werden. In diesem neuen Modell wird der code, der im herkömmlichen Modell ausgeführt wird, in VTL0 ausgeführt und kann nicht auf die VTL1 mit höheren Berechtigungen zugreifen, auf der der Sichere Kernel und der isolierte Benutzermodus (IUM) Code ausführen. Die VTLs sind hierarchisch, d. h. jeder code, der in VTL1 ausgeführt wird, hat mehr Berechtigungen als Code, der in VTL0 ausgeführt wird.
Die VTL-Isolation wird vom Hyper-V-Hypervisor erstellt, der beim Start mithilfe von Second Level Address Translation (SLAT) Arbeitsspeicher zuweist. Dies wird dynamisch fortgesetzt, während das System ausgeführt wird, und schützt den Speicher, den der sichere Kernel angibt, der Schutz vor VTL0 benötigt, da er verwendet wird, um Geheimnisse zu enthalten. Da für die beiden VTLs separate Speicherblöcke zugeordnet werden, wird eine sichere Laufzeitumgebung für VTL1 erstellt, indem VTL1 und VTL0 exklusive Speicherblöcke mit den entsprechenden Zugriffsberechtigungen zugewiesen werden.
Diagramm 1: IUM-Architektur
Trustlets
Trustlets (auch bekannt als vertrauenswürdige Prozesse, sichere Prozesse oder IUM-Prozesse) sind Programme, die als IUM-Prozesse in VSM ausgeführt werden. Sie schließen Systemaufrufe ab, indem sie sie zum Windows-Kernel übertragen, der in VTL0 ring 0 ausgeführt wird. VSM erstellt eine kleine Ausführungsumgebung, die den kleinen secure 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 Isolation von Seiten im Trustlet-Benutzermodus 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 LSASS-Umgebung (Local Security Authority) als Trustlet ausgeführt. LSASS verwaltet die lokale Systemrichtlinie, die Benutzerauthentifizierung und die Überwachung und verarbeitet vertrauliche Sicherheitsdaten wie Kennworthashes und Kerberos-Schlüssel. Um die Sicherheitsvorteile von VSM zu nutzen, wird ein Trustlet mit dem Namen LSAISO.exe (LSA Isolated) in VTL1 ausgeführt und kommuniziert mit LSASS.exe, die in VTL0 ausgeführt werden, über einen RPC-Kanal. Die LSAISO-Geheimnisse werden vor dem Senden an LSASS verschlüsselt, das im VSM-Normalmodus ausgeführt wird, und die Seiten von LSAISO werden vor schädlichem Code geschützt, der in VTL0 ausgeführt wird.
Diagramm 2: LSASS Trustlet-Entwurf
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 post mortem-Debuggen von Speicherabbildern und das Anfügen der Debugtools für das Livedebuggen. Es umfasst 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 zu einer Destabilisierung des gesamten Systems führen. Windows-APIs, die die Sicherheit eines Trustlets gefährden würden, können auf unerwartete Weise fehlschlagen. Wenn Sie beispielsweise eine DLL in ein Trustlet laden, wird sie in VTL0, aber nicht in VTL1 verfügbar. QueueUserApc schlägt möglicherweise automatisch fehl, wenn sich der Zielthread in einem Trustlet befindet. Andere APIs wie CreateRemoteThread, VirtualAllocEx und Read/WriteProcessMemory funktionieren ebenfalls 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. Dies schließt Kerneltreiber ein, die APCs für die Ausführung von Code in einem Trustlet in die Warteschlange stellen.
Bemerkungen
Wenn die Rückgabe status von IsSecureProcess erfolgreich ist, überprüfen Sie den SecureProcess _Out_-Parameter, um zu ermitteln, ob es sich bei dem Prozess um einen IUM-Prozess handelt. 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;