Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
System Windows 10 wprowadził nową funkcję zabezpieczeń o nazwie Virtual Secure Mode (VSM). Program VSM korzysta z funkcji hypervisor Hyper-V i translacji adresów drugiego poziomu (SLAT) w celu utworzenia zestawu trybów nazywanych wirtualnymi poziomami zaufania (VTLs). Ta nowa architektura oprogramowania tworzy granicę zabezpieczeń, aby zapobiec uruchamianiu procesów działających w jednej usłudze VTL w celu uzyskania dostępu do pamięci innej biblioteki VTL. Korzyści wynikające z tej izolacji obejmują dodatkowe środki zaradcze przed programami wykorzystującymi luki w jądrach, jednocześnie chroniąc zasoby, takie jak skróty haseł i klucze Kerberos.
Diagram 1 przedstawia tradycyjny model trybu jądra i kod trybu użytkownika uruchomiony odpowiednio w pierścieniu procesora CPU 0 i pierścieniu 3. W tym nowym modelu kod uruchomiony w tradycyjnym modelu jest wykonywany w programie VTL0 i nie może uzyskać dostępu do wyższej uprzywilejowanej biblioteki VTL1, w której jest wykonywane kod bezpiecznego jądra i izolowanego trybu użytkownika (IUM). Listy VTL są hierarchiczne, co oznacza, że każdy kod uruchomiony w VTL1 jest bardziej uprzywilejowany niż kod uruchomiony w VTL0.
Izolacja VTL jest tworzona przez funkcję hypervisor Hyper-V, która przypisuje pamięć w czasie rozruchu przy użyciu translacji adresów drugiego poziomu (SLAT). Kontynuuje tę dynamiczną konieczność działania systemu, ponieważ będzie ona używana do przechowywania wpisów tajnych, ochrona pamięci, która określa, że jest potrzebna ochrona przed biblioteką VTL0. W miarę przydzielania oddzielnych bloków pamięci dla dwóch list VTL tworzone jest bezpieczne środowisko uruchomieniowe dla biblioteki VTL1 przez przypisanie bloków pamięci wyłącznych do bibliotek VTL1 i VTL0 z odpowiednimi uprawnieniami dostępu.
diagram 1 — architektura IUM
diagram 
Trustlets
Trustlets (znane również jako zaufane procesy, bezpieczne procesy lub procesy IUM) to programy działające jako procesy IUM w programie VSM. Tworzą one wywołania systemowe, przechodząc do jądra systemu Windows uruchomionego w pierścieniu VTL0 0. Program VSM tworzy małe środowisko wykonawcze, które obejmuje małe bezpieczne jądro wykonywane w VTL1 (odizolowane od jądra i sterowników działających w VTL0). Korzyść zabezpieczeń jest izolacją stron trybu użytkownika trustlet w VTL1 ze sterowników uruchomionych w jądrze VTL0. Nawet jeśli tryb jądra VTL0 zostanie naruszony przez złośliwe oprogramowanie, nie będzie miał dostępu do stron procesu IUM.
Po włączeniu programu VSM środowisko lokalnego urzędu zabezpieczeń (LSASS) jest uruchamiane jako trustlet. Usługa LSASS zarządza lokalnymi zasadami systemu, uwierzytelnianiem użytkowników i inspekcją podczas obsługi poufnych danych zabezpieczeń, takich jak skróty haseł i klucze Kerberos. Aby wykorzystać zalety zabezpieczeń programu VSM, trustlet o nazwie LSAISO.exe (LSA Isolated) działa w wersji VTL1 i komunikuje się z LSASS.exe uruchomionym w VTL0 za pośrednictwem kanału RPC. Wpisy tajne LSAISO są szyfrowane przed wysłaniem ich do usługi LSASS uruchomionej w trybie normalnym programu VSM, a strony LSAISO są chronione przed złośliwym kodem uruchomionym w programie VTL0.
diagram 2 — projekt trustletu LSASS
diagram 
Implikacje trybu izolowanego użytkownika (IUM)
Nie można dołączyć do procesu IUM, hamując możliwość debugowania kodu VTL1. Obejmuje to debugowanie pośmiertne zrzutów pamięci i dołączanie narzędzi debugowania na żywo. Obejmuje również próby za pomocą uprzywilejowanych kont lub sterowników jądra w celu załadowania biblioteki DLL do procesu IUM, w celu wstrzyknięcia wątku lub dostarczenia APC trybu użytkownika. Takie próby mogą spowodować destabilizację całego systemu. Interfejsy API systemu Windows, które mogłyby naruszyć bezpieczeństwo trustletu, mogą zakończyć się niepowodzeniem w nieoczekiwany sposób. Na przykład załadowanie biblioteki DLL do biblioteki Trustlet spowoduje udostępnienie jej w pliku VTL0, ale nie VTL1. QueueUserApc może dyskretnie zakończyć się niepowodzeniem, jeśli wątek docelowy znajduje się w trustlet. Inne interfejsy API, takie jak CreateRemoteThread, VirtualAllocEx i Read/WriteProcessMemory, również nie będą działać zgodnie z oczekiwaniami w przypadku użycia względem trustlets.
Skorzystaj z poniższego przykładowego kodu, aby uniemożliwić wywoływanie dowolnych funkcji, które próbują dołączyć lub wstawić kod do procesu IUM. Obejmuje to sterowniki jądra, które kolejki interfejsów API do wykonywania kodu w trustlet.
Uwagi
Jeśli stan powrotu isSecureProcess jest powodzeniem, sprawdź parametr SecureProcess _Out_, aby określić, czy proces jest procesem IUM. Procesy IUM są oznaczone przez system jako "Bezpieczne procesy". Wynik logiczny TRUE oznacza, że proces docelowy jest 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;
}
Zestaw WDK dla systemu Windows 10 "Windows Driver Kit — Windows 10.0.15063.0" zawiera wymaganą definicję struktury PROCESS_EXTENDED_BASIC_INFORMATION. Zaktualizowana wersja struktury jest zdefiniowana w ntddk.h z nowym 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;