共用方式為


隔離的使用者模式 (IUM) 程式

Windows 10 引進了名為虛擬安全模式 (VSM) 的新安全性功能。 VSM 利用 Hyper-V Hypervisor 和第二層地址轉換 (SLAT) 來建立一組稱為虛擬信任層級 (VTLs) 的模式。 這個新的軟體架構會建立安全性界限,以防止在一個 VTL 中執行的進程存取另一個 VTL 的記憶體。 此隔離的優點包括核心惡意探索的額外風險降低,同時保護密碼哈希和 Kerberos 金鑰等資產。

圖 1 分別描述在 CPU 通道 0 和 ring 3 中執行的核心模式和使用者模式程式代碼的傳統模型。 在這個新的模型中,在傳統模型中執行的程式代碼會在 VTL0 中執行,而且無法存取較高許可權的 VTL1,其中安全核心和隔離使用者模式 (IUM) 會執行程式代碼。 VTL 是階層式,這表示在 VTL1 中執行的任何程式代碼都比在 VTL0 中執行的程式碼更具有特殊許可權。

VTL 隔離是由 Hyper-V Hypervisor 所建立,該 Hypervisor 會使用第二層地址轉換 (SLAT) 在開機時指派記憶體。 它會在系統執行時動態地繼續此作業,保護安全核心指定的記憶體需要 VTL0 的保護,因為它將用來包含秘密。 當兩個 VTL 配置個別的記憶體區塊時,系統會為 VTL1 建立安全的運行時間環境,方法是將獨佔記憶體區塊指派給具有適當訪問許可權的 VTL1 和 VTL0。

圖 1 - IUM 架構

圖 1 - ium 架構

Trustlet

Trustlet(也稱為受信任進程、安全進程或 IUM 進程)是 VSM 中以 IUM 進程的形式執行的程式。 他們會將系統呼叫封送處理至 VTL0 通道 0 中執行的 Windows 核心。 VSM 會建立小型執行環境,其中包含在 VTL1 中執行的小型安全核心(與在 VTL0 中執行的核心和驅動程式隔離)。 明確的安全性優點是將 VTL1 中的 trustlet 使用者模式頁面與 VTL0 核心中執行的驅動程序隔離。 即使 VTL0 的核心模式遭到惡意代碼入侵,它也無法存取 IUM 進程頁面。

啟用 VSM 後,本機安全性授權單位 (LSASS) 環境會以信任程式的形式執行。 LSASS 會管理本機系統原則、使用者驗證和稽核,同時處理敏感性安全性數據,例如密碼哈希和 Kerberos 密鑰。 為了利用 VSM 的安全性優點,名為 LSAISO.exe (LSA Isolated) 的 trustlet 會在 VTL1 中執行,並透過 RPC 通道與在 VTL0 中執行的 LSASS.exe 通訊。 LSAISO 秘密會在傳送至 VSM 標準模式中執行的 LSASS 之前先加密,LSAISO 的頁面會受到保護,以免在 VTL0 中執行的惡意代碼。

圖 2 – LSASS Trustlet 設計

圖 2 – lsass trustlet 設計

隔離的使用者模式 (IUM) 含意

無法附加至 IUM 進程,因此無法對 VTL1 程式代碼進行偵錯。 這包括記憶體轉儲的驗屍偵錯,以及附加偵錯工具以進行即時偵錯。 它也包含特殊許可權帳戶或核心驅動程式嘗試將 DLL 載入 IUM 進程、插入線程或傳遞使用者模式 APC。 這種嘗試可能會導致整個系統的不穩定。 會危害 Trustlet 安全性的 Windows API 可能會以非預期的方式失敗。 例如,將 DLL 載入 Trustlet 會讓它在 VTL0 中可供使用,但無法在 VTL1 中使用。 如果目標線程位於 Trustlet 中,QueueUserApc 可能會以無訊息方式失敗。 其他 API,例如 CreateRemoteThread、VirtualAllocEx 和 Read/WriteProcessMemory,在對 Trustlet 使用時也不會如預期般運作。

使用下列範例程式代碼來防止呼叫任何嘗試將程式代碼附加或插入IUM進程的函式。 這包括將 APC 排入佇列以在 trustlet 中執行程式代碼的核心驅動程式。

言論

如果IsSecureProcess的傳回狀態成功,請檢查 SecureProcess _Out_ 參數,以判斷進程是否為 IUM 進程。 IUM 進程會由系統標示為「安全進程」。 TRUE 的布爾值結果表示目標進程的類型為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;
}

適用於 Windows 10 的 WDK,「Windows 驅動程式套件 - Windows 10.0.15063.0」,包含PROCESS_EXTENDED_BASIC_INFORMATION結構的必要定義。 結構的更新版本定義於 ntddk.h 中,並具有新的 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;