Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A Windows 10 bevezetett egy új, Virtuális biztonsági mód (VSM) nevű biztonsági funkciót. A VSM a Hyper-V hipervizort és a második szintű címfordítást (SLAT) használja a virtuális megbízhatósági szintek (VCL) nevű módok készletének létrehozásához. Ez az új szoftverarchitektúra biztonsági határt hoz létre, amely megakadályozza, hogy az egyik VTL-ben futó folyamatok hozzáférjenek egy másik VTL memóriájába. Ennek az elkülönítésnek az előnye, hogy további kockázatcsökkentést biztosít a kernelkihasználásokkal szemben, miközben védi az olyan eszközöket, mint a jelszókivonatok és a Kerberos-kulcsok.
Az 1. ábra a Kernel mód hagyományos modelljét és a 0., illetve a 3. gyűrűben futó felhasználói módú kód hagyományos modelljét mutatja be. Ebben az új modellben a hagyományos modellben futó kód a VTL0-ban fut, és nem fér hozzá a magasabb szintű emelt szintű VTL1-hez, ahol a biztonságos kernel- és izolált felhasználói mód (IUM) végrehajtja a kódot. A VTL-ek hierarchikusak, ami azt jelenti, hogy a VTL1-ben futó kódok jogosultsága nagyobb, mint a VTL0-ban futó kód.
A VTL-elkülönítést a Hyper-V hipervizor hozza létre, amely rendszerindításkor a második szintű címfordítás (SLAT) használatával rendeli hozzá a memóriát. Ez a rendszer futása közben dinamikusan folytatódik, a biztonságos kernel által megadott memóriavédelem pedig a VTL0 elleni védelemre van szükség, mert titkos kulcsokat fog tartalmazni. Mivel a két virtuális merevlemezhez külön memóriablokkok vannak lefoglalva, a rendszer egy biztonságos futtatókörnyezetet hoz létre a VTL1-hez úgy, hogy kizárólagos memóriablokkokat rendel a VTL1-hez és a VTL0-hoz a megfelelő hozzáférési engedélyekkel.
1. diagram – IUM architektúra
Megbízhatósági kapcsolatok
A megbízhatósági kapcsolatok (más néven megbízható folyamatok, biztonságos folyamatok vagy IUM-folyamatok) IUM-folyamatokként futó programok a VSM-ben. A rendszerhívásokat úgy hajtják végre, hogy a VTL0 ring 0-ban futó Windows-kernelre rendezik őket. A VSM létrehoz egy kis végrehajtási környezetet, amely magában foglalja a VTL1-ben (a kerneltől és a VTL0-ban futó illesztőprogramoktól elkülönítve) végrehajtott kis biztonságos kernelt. Az egyértelmű biztonsági előny a VTL1 megbízható felhasználói módú lapjainak elkülönítése a VTL0 kernelben futó illesztőprogramoktól. Még ha a VTL0 kernelmódját is veszélyeztetik a kártevők, akkor sem lesz hozzáférése az IUM folyamatoldalaihoz.
Ha a VSM engedélyezve van, a Helyi biztonsági szolgáltató (LSASS) környezet megbízhatóként fut. Az LSASS kezeli a helyi rendszerházirendet, a felhasználói hitelesítést és a naplózást, miközben bizalmas biztonsági adatokat, például jelszókivonatokat és Kerberos-kulcsokat kezel. A VSM biztonsági előnyeinek kihasználásához egy LSAISO.exe (izolált LSA) nevű megbízhatósági csoport fut a VTL1-ben, és egy RPC-csatornán keresztül kommunikál a VTL0-ben futó LSASS.exe. Az LSAISO-titkos kulcsok titkosítva vannak, mielőtt átküldené őket a VSM Normál módban futó LSASS-nek, és az LSAISO lapjai védettek a VTL0-ben futó rosszindulatú kódokkal szemben.
2. diagram – LSASS trustlet design
Izolált felhasználói mód (IUM) következményei
Nem lehet IUM-folyamathoz csatolni, ami gátolja a VTL1-kód hibakeresését. Ez magában foglalja a memóriaképek utólagos hibakeresését és az élő hibakereséshez szükséges hibakeresési eszközök csatolását. Ez magában foglalja a jogosultsággal rendelkező fiókok vagy kernelillesztők azon próbálkozásait is, hogy betöltse a DLL-t egy IUM-folyamatba, egy szálat injektáljon, vagy felhasználói módú APC-t biztosítson. Az ilyen kísérletek a teljes rendszer destabilizálását eredményezhetik. A megbízható adatok biztonságát veszélyeztető Windows API-k váratlanul meghiúsulhatnak. Ha például betölt egy DLL-t egy megbízhatósági fájlba, az elérhetővé válik a VTL0-ben, a VTL1-ben azonban nem. A QueueUserApc csendesen meghiúsulhat, ha a célszál egy trustletben található. Más API-k, például a CreateRemoteThread, a VirtualAllocEx és a Read/WriteProcessMemory szintén nem fognak a vártnak megfelelően működni, ha a megbízhatósági adatokkal szemben használják őket.
Az alábbi mintakód használatával megakadályozhatja, hogy olyan függvényeket hívjon meg, amelyek IUM-folyamatba próbálnak kódot csatolni vagy beszúrni. Ide tartoznak azok a kernelillesztők, amelyek api-k várnak a kódvégrehajtáshoz egy megbízhatósági fájlban.
Megjegyzések
Ha az IsSecureProcess visszatérési állapota sikeres, vizsgálja meg a SecureProcess _Out_ paramétert annak megállapításához, hogy a folyamat IUM-folyamat-e. Az IUM-folyamatokat a rendszer "Biztonságos folyamatok" értékre jelöli. A TRUE logikai eredménye azt jelenti, hogy a célfolyamat IUM típusú.
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;
}
A Windows 10-hez készült WDK ,,Windows Driver Kit - Windows 10.0.15063.0", tartalmazza a PROCESS_EXTENDED_BASIC_INFORMATION szerkezet szükséges definícióját. A struktúra frissített verziója az ntddk.h-ban van definiálva az új IsSecureProcess mezővel.
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;