攻擊者總是在尋找新的方式,能在宿主機上投遞與執行惡意程式而不被偵測。我們研究了一些新穎的技巧,將惡意程式運行於virtualization-based security (VBS) enclave中,並繞過常見的安全防護機制。2025 年 8 月 8 日,我在拉斯維加斯舉辦的 DEF CON33 上針對此攻擊面發表了研究成果。
VBS 是 Microsoft 安全機制的一部分,它建立了一個虛擬環境,用以隔離作業系統的重要元件。VBSenclaves允許將一段程序區域隔離,使其無法被其他程序、甚至該程序自身或核心存取。
雖然 VBS enclaves 能提升安全性,但同時也可能成為攻擊者的誘惑。因為在 enclave 中運行的惡意程式,可能對現有的記憶體型偵測與鑑識技術隱形。我們探討了這個概念,並發現數種VBS enclave 可能被濫用的方式。
VTL 與 VBS Enclave 的概念
理解 VBS enclaves,必須先掌握 **Virtual Trust Levels (VTLs)**的概念。每個信任層級對實體記憶體擁有不同的存取權限,低層級無法存取高層級的記憶體。
目前 Windows 採用兩個主要的信任層級:VTL0:執行傳統 OS 元件,包括一般核心與使用者模式;VTL1:比 VTL0更高權限,新增「安全核心模式」與「隔離使用者模式」。
安全核心模式:執行於 VTL1 的安全核心,可對一般核心實施政策並限制其存取敏感記憶體區域。因不支援第三方驅動,其攻擊面相對縮小。
隔離使用者模式:執行於 VTL1的特殊使用者模式程序,具備記憶體隔離能力。其記憶體無法被 VTL0 任何程式碼(包含一般核心)存取。
因此 VTL0 與 VTL1 形成四種執行模式:
Ring0 VTL0 —— 一般核心模式
Ring0 VTL1 —— 安全核心模式
Ring3 VTL0 —— 一般使用者模式
Ring3 VTL1 —— 隔離使用者模式
VBS enclave 建立於隔離使用者模式的一段區域,可載入稱為 enclave modules的 DLL,形成一個「可信任執行環境」,其中的資料與程式碼對 VTL0 完全不可見。
由於 VTL1 存取受限,載入 DLL 必須使用 Microsoft核發的特殊簽章。雖然僅有受信任的第三方可簽署 enclave模組,但任何程序都能載入,只要其模組簽名有效。
攻擊策略探索
VBS enclave 對攻擊者具有吸引力有兩個主要原因:
Enclave 的位址空間對 VTL0 上運行的任何程式(包括端點偵測與回應工具EDR,以及分析工具)都不可見。
從 enclave 內發出的 API 呼叫,可能同樣對 EDR 不可見。
基於此,我們深入研究攻擊者如何能在 enclave內執行惡意程式碼,以及在惡意程式運行後他們可能採用的技巧。以下是我們的發現。
利用可除錯的 Enclave 模組
VBS enclave 模組可被設定為 可除錯(debuggable)。一般而言,VTL0偵錯器無法存取 VTL1 記憶體。但若模組標記為可除錯,安全核心會實作例外,允許 VTL0修改模組的記憶體權限,導致 enclave 資料易於曝光,破壞了原本的隔離目的。
如果攻擊者取得一個已簽署且可除錯的 enclave 模組,他們能透過一些步驟達成 VTL1程式碼執行。雖然這同時帶來風險 —— 就像攻擊者能存取 enclave 記憶體一樣,EDR也能存取 —— 但這類攻擊能繞過 API 監控,限制 EDR 的可見性。
這種技巧可被用來建立一個隱蔽的 「半 VTL1」植入物(semi-VTL1implant),利用在 enclave 中運行所帶來的部分優勢。
自帶易受攻擊 Enclave(BYOVE)
我們測試了是否能套用「自帶漏洞驅動程式(BYOVD)」的概念,利用存在漏洞的已簽署enclave 模組執行惡意程式。其中涉及 CVE-2023-36880,這是一個由 Microsoft Edge使用的模組漏洞,允許攻擊者讀寫 enclave 內部資料。
我們嘗試利用該漏洞覆寫 enclave 堆疊並建構 ROP 鏈,最終在 enclave 內執行shellcode。但發現 Arbitrary Code Guard (ACG) 阻止了 enclave 中未簽署程式碼的運行,目前尚未找到繞過方法。
嘗試在安全區內指派 RWX 頁面的影像
圖:嘗試在安全區內指派 RWX 頁面
我們還發現另一種濫用 CVE-2023-36880 的方式,涉及 enclave 模組所匯出的SealSettings 與UnsealSettings函式。這些函式沒有驗證目的位址或來源緩衝區位址,因此可以被指向程序內的任意位置,包括enclave 本身的記憶體區域。
攻擊者可以呼叫 SealSettings 來加密任意資料,然後呼叫UnsealSettings,將目的位址指向 enclave 內部。結果就是原始資料會被寫入 enclave記憶體。
另一種方式是攻擊者呼叫 SealSettings,並將來源緩衝區設定為 enclave內部的位址。這會使 enclave 將其記憶體中的資料加密並寫入至攻擊者控制的位置。接著,攻擊者再透過UnsealSettings 解密,就能讀取 enclave 內的任意資料。
這代表攻擊者不僅能往 enclave 中寫入資料,也能將其中的敏感資訊抽取出來,形成雙向的資料濫用通道。
濫用 SealSettings 與 UnsealSettings 函式
在研究 CVE-2023-36880 時,我們還發現了另一種濫用方式。該漏洞相關的SealSettings 與 UnsealSettings 函式沒有驗證目的位址或來源緩衝區位址,因此可以被指向程序中的任意位置,包括 enclave 內部。
攻擊者可以呼叫 SealSettings 來加密任意資料,再呼叫 UnsealSettings*,並將目的位址設定為 enclave 內部,使原始資料被寫入 enclave 記憶體。
反之,攻擊者可呼叫 SealSettings,並指定 enclave內的位址作為來源緩衝區。這會導致 enclave 將 enclave記憶體內的資料加密並寫入攻擊者控制的位置。隨後攻擊者再呼叫 UnsealSettings 進行解密,即可讀取 enclave 內的任意資料。
Mirage:基於 VTL1 的記憶體規避技術
我們提出名為 Mirage 的規避技術,靈感來自 Gargoyle。惡意程式將 shellcode 存在 VTL1 記憶體,僅在需要執行時透過漏洞轉回 VTL0,完成後再立即清除。
由於惡意程式大部分時間隱身於VTL1,因此對記憶體掃描與傾印更具抗性。在休眠狀態下,它既隱蔽又無法被存取。而且將shellcode 寫回 VTL0 的動作由 enclave 執行,這讓 EDR 難以透過監控偵測。
反除錯技術
Enclave 也可用於反除錯。因其程式碼對 VTL0 偵錯器不可見,惡意程式可檢查 PEB(Process Environment Block) 中的 BeingDebugged標記,或利用時序檢測除錯延遲。若偵測到偵錯,程序可立即終止。
若將程式的關鍵部分與反除錯檢查移至enclave,就能建立幾乎對動態分析「刀槍不入」的惡意程式。若要破解,唯一的方式是直接偵錯Hyper-V 或安全核心。
防護建議
目前僅有少數應用程式使用enclave,因此其異常使用反而成為良好的偵測契機。防禦者可採取以下措施:
建立合法 VBS enclave 使用基準,並標記偏差行為。
監控 enclave API 呼叫是否異常。
監控 enclave DLL 的載入,識別可疑進程。
結合 微分段(microsegmentation) 等安全技術進一步隔離關鍵系統。
雖然 VBS enclave 本是保護應用程式敏感區域的工具,但同樣可能被威脅行為者用來「保護」其惡意程式。雖然目前這些攻擊策略大多仍屬於理論性,但可以確定的是,高階威脅行為者正積極研究如何利用VBS enclave 的漏洞達成攻擊目的。
對防禦方而言,掌握環境中 enclave 的使用情況,是邁向防禦此類新興威脅的第一步。
歡迎關注Akamai,通過定期更新的文章瞭解更多與Web、安全、雲計算、邊緣計算有關的資訊和見解。