Procesy izolovaného uživatelského režimu (IUM)
Windows 10 zavedl novou funkci zabezpečení s názvem Virtuální zabezpečený režim (VSM). Virtuální počítač využívá Hyper-V hypervisoru a překladu adres druhé úrovně (SLAT) k vytvoření sady režimů označovaných jako úrovně virtuální důvěryhodnosti (VTLs). Tato nová softwarová architektura vytvoří hranici zabezpečení, která brání procesům spuštěným v jedné hodnotě VTL v přístupu k paměti jiné hodnoty VTL. Výhodou této izolace je další zmírnění zneužití jádra a ochrana prostředků, jako jsou hodnoty hash hesel a klíče Kerberos.
Diagram 1 znázorňuje tradiční model režimu jádra a kódu uživatelského režimu spuštěného v okruhu procesoru 0 a okruhu 3. V tomto novém modelu se kód spuštěný v tradičním modelu spouští v hodnotě VTL0 a nemá přístup k vyšší privilegované hodnotě VTL1, kde kód IUM (Secure Kernel and Isolated User Mode). Seznamy VTLs jsou hierarchický, což znamená, že jakýkoli kód spuštěný v hodnotě VTL1 je privilegovaný než kód spuštěný v síti VTL0.
Izolace VTL je vytvořená Hyper-V Hypervisorem, který při spuštění přiřazuje paměť pomocí překladu adres druhé úrovně (SLAT). Pokračuje to dynamicky při spuštění systému a ochrana paměti, které zabezpečené jádro určuje, že vyžaduje ochranu z VTL0, protože se použije k zahrnutí tajných kódů. Vzhledem k tomu, že jsou pro dva virtuální seznamy VTL přiděleny samostatné bloky paměti, vytvoří se pro VTL1 zabezpečené prostředí runtime přiřazením výhradních bloků paměti k VTL1 a VTL0 s příslušnými přístupovými oprávněními.
diagram 1 – architektura IUM
Vztahy důvěryhodnosti
Vztahy důvěryhodnosti (označované také jako důvěryhodné procesy, zabezpečené procesy nebo procesy IUM) jsou programy spuštěné jako procesy IUM ve VSM. Dokončí systémová volání tak, že je zařadí do jádra Windows spuštěného v okruhu VTL0 0. VSM vytvoří malé spouštěcí prostředí, které zahrnuje malé zabezpečené jádro spouštěné v hodnotě VTL1 (izolované od jádra a ovladačů spuštěných v síti VTL0). Jednoznačnou výhodou zabezpečení je izolace stránek uživatelského režimu trustletu v hodnotě VTL1 od ovladačů spuštěných v jádru VTL0. I když je režim jádra VTL0 ohrožený malwarem, nebude mít přístup ke stránkám procesu IUM.
S povoleným virtuálním počítačem běží prostředí LSASS (Local Security Authority) jako vztah důvěryhodnosti. LSASS spravuje místní systémové zásady, ověřování uživatelů a auditování při zpracování citlivých dat zabezpečení, jako jsou hodnoty hash hesel a klíče Kerberos. Aby bylo možné využít výhody zabezpečení virtuálního počítače, běží v síti VTL1 trustlet s názvem LSAISO.exe (LSA Isolated) a komunikuje s LSASS.exe spuštěnými v síti VTL0 prostřednictvím kanálu RPC. Tajné kódy LSAISO jsou před jejich odesláním do LSASS spuštěné v normálním režimu VSM zašifrovány a stránky LSAISO jsou chráněny před škodlivým kódem spuštěným v síti VTL0.
diagram 2 – návrh LSASS Trustlet
Důsledky izolovaného uživatelského režimu (IUM)
K procesu IUM není možné připojit, což inhibuje schopnost ladit kód VTL1. To zahrnuje ladění výpisů paměti po mortem a připojení nástrojů ladění pro živé ladění. Zahrnuje také pokusy privilegovaných účtů nebo ovladačů jádra, které načtou knihovnu DLL do procesu IUM, vloží vlákno nebo doručí APC v uživatelském režimu. Takové pokusy mohou vést k deaktivaci celého systému. Rozhraní API systému Windows, která by mohly ohrozit zabezpečení trustletu, můžou selhat neočekávanými způsoby. Například načtením knihovny DLL do Trustletu ji zpřístupníte v hodnotě VTL0, ale nikoli VTL1. QueueUserApc může bezobslužně selhat, pokud je cílové vlákno v Trustletu. Jiná rozhraní API, jako jsou CreateRemoteThread, VirtualAllocEx a Read/WriteProcessMemory, nebudou při použití pro Trustlets fungovat podle očekávání.
Pomocí následujícího vzorového kódu zabráníte volání všech funkcí, které se pokusí připojit nebo vložit kód do procesu IUM. To zahrnuje ovladače jádra, které zařadí apcs do fronty pro spuštění kódu v trustletu.
Poznámky
Pokud je návratový stav IsSecureProcess úspěšný, zkontrolujte parametr SecureProcess _Out_ a zjistěte, jestli je procesem IUM. Procesy IUM jsou systémem označené jako Zabezpečené procesy. Logický výsledek pravda znamená, že cílový proces je typu 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 pro Windows 10, "Windows Driver Kit - Windows 10.0.15063.0", obsahuje požadovanou definici PROCESS_EXTENDED_BASIC_INFORMATION struktury. Aktualizovaná verze struktury je definována v ntddk.h s novým polem 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;