隔離的使用者模式 (IUM) 程式
Windows 10引進名為虛擬安全模式的新安全性功能, (VSM) 。 VSM 會利用 Hyper-V Hypervisor 和第二層位址轉譯 (SLAT) 來建立一組稱為虛擬信任等級的模式, (VTL) 。 這個新的軟體架構會建立安全性界限,以防止在一個 VTL 中執行的進程存取另一個 VTL 的記憶體。 此隔離的優點包括核心惡意探索的額外風險降低,同時保護密碼雜湊和 Kerberos 金鑰等資產。
圖表 1 分別描述在 CPU 通道 0 和環 3 中執行的核心模式和使用者模式程式碼的傳統模型。 在這個新模型中,在傳統模型中執行的程式碼會在 VTL0 中執行,而且無法存取較高許可權的 VTL1,其中安全核心和隔離使用者模式 (IUM) 執行程式碼。 VTL 是階層式,這表示任何在 VTL1 中執行的程式碼都比在 VTL0 中執行的程式碼更具特殊許可權。
VTL 隔離是由 Hyper-V Hypervisor 所建立,此 Hypervisor 會在開機時使用第二層位址轉換 (SLAT) 來指派記憶體。 它會在系統執行時以動態方式繼續執行,保護安全核心指定的保護需要 VTL0 的保護,因為它將用來包含秘密。 由於為兩個 VTL 配置了不同的記憶體區塊,因此會為 VTL1 建立安全執行時間環境,方法是將獨佔記憶體區塊指派給具有適當存取權限的 VTL1 和 VTL0。
圖表 1 - IUM 架構
Trustlets
信任程式 (也稱為受信任進程、安全進程或 IUM 進程,) 是 VSM 中以 IUM 進程的形式執行的程式。 他們會將系統呼叫封送處理至 VTL0 通道 0 中執行的 Windows 核心,以完成系統呼叫。 VSM 會建立小型執行環境,其中包含在 VTL1 中執行的小型安全核心, (與在 VTL0) 中執行的核心和驅動程式隔離。 清楚的安全性優點是將 VTL1 中的 trustlet 使用者模式頁面與在 VTL0 核心中執行的驅動程式隔離。 即使 VTL0 的核心模式遭到惡意程式碼入侵,它也無法存取 IUM 進程頁面。
啟用 VSM 後,本機安全性授權單位 (LSASS) 環境會以信任程式的形式執行。 LSASS 會管理本機系統原則、使用者驗證和稽核,同時處理機密的安全性資料,例如密碼雜湊和 Kerberos 金鑰。 為了利用 VSM 的安全性優點,名為 LSAISO.exe (LSA 隔離) 在 VTL1 中執行的 trustlet,並透過 RPC 通道與在 VTL0 中執行的LSASS.exe通訊。 LSAISO 秘密會在傳送至以 VSM 標準模式執行的 LSASS 之前進行加密,而且 LSAISO 的頁面會受到保護,以免在 VTL0 中執行的惡意程式碼。
圖表 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 「Windows Driver Kit - Windows 10.0.15063.0」 的 WDK 包含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;