Megosztás a következőn keresztül:


Izolált felhasználói módú (IUM) folyamatok

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

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

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;