共用方式為


WDAC) 和 .NET (Windows Defender 應用程控

以 C#) 等高階語言撰寫的 .NET 應用程式 (會編譯成中繼語言 (IL) 。 IL 是可在任何作業系統或架構上支援的精簡程式代碼格式。 大部分的 .NET 應用程式都使用多個環境中支援的 API,只需要執行 .NET 運行時間。 IL 必須編譯成原生程序代碼,才能在CPU上執行,例如Arm64或 x64。 當 .NET 在具有 WDAC 使用者模式原則的裝置上,將 IL 編譯為原生映射 (NI) 時,它會先檢查原始 IL 檔案是否通過目前的 WDAC 原則。 如果是,.NET 會在產生的 NI 檔案上設定 EA) (NTFS 擴充屬性,讓 WDAC 也知道信任它。 當 .NET 應用程式執行時,WDAC 會在 NI 檔案上看到 EA 並允許它。

NI 檔案上設定的 EA 僅適用於目前作用中的 WDAC 原則。 如果其中一個作用中的 WDAC 原則已更新或套用新原則,NI 檔案上的 EA 就會失效。 下次執行應用程式時,WDAC 會封鎖 NI 檔案。 .NET 會正常處理區塊,並回復為原始 IL 程式代碼。 如果 IL 仍然通過最新的 WDAC 原則,則應用程式會執行,而不會影響任何功能。 由於 IL 目前正在運行時間編譯,因此您可能會注意到對應用程式效能有些微影響。 當 .NET 必須回復到 IL 時,.NET 也會排程在下一個維護期間執行的程式,以重新產生所有 NI 檔案,因此會針對傳遞最新 WDAC 原則的所有程式代碼重新安裝 WDAC EA。

在某些情況下,如果 NI 檔案遭到封鎖,您可能會在 CodeIntegrity - Operational 事件記錄檔中看到「誤判」區塊事件,如 WDAC 系統管理員提示 & 已知問題中所述。

若要減輕 WDAC EA 無效或遺失時所造成的任何效能影響:

  • 請避免經常更新 WDAC 原則。
  • ngen update 在所有機器架構上執行 () ,以強制 .NET 在將變更套用至 WDAC 原則之後立即重新產生所有 NI 檔案。
  • 將應用程式移轉至 .NET Core (.NET 6 或更新版本) 。

WDAC 和 .NET 強化

安全性研究人員發現一些 .NET 功能,可讓應用程式從外部來源載入連結庫,或在運行時間產生新的程式碼,可用來規避 WDAC 控件。 為了解決這個潛在的弱點,WDAC 包含稱為 動態程式代碼安全 性的選項,可與 .NET 搭配使用,以驗證在運行時間載入的程式碼。

啟用 [動態程式代碼安全性] 選項時,應用程控原則會套用至 .NET 從外部來源載入的連結庫。 例如,任何遠端來源,例如因特網或網路共用。

重要

如果已啟用 UMCI 的任何 WDAC 原則已設定選項 19 Enabled:Dynamic Code Security,就會開啟並強制執行 .Net 動態程式代碼安全性強化。 此功能沒有稽核模式。 在大量裝置上開啟應用程式之前,您應該先設定此選項來測試應用程式。

此外,它會偵測 .NET 對磁碟產生的程式代碼遭到竄改,並封鎖載入遭竄改的程序代碼。

根據預設,不會啟用動態程式碼安全性,因為現有原則可能不考慮外部載入的連結庫。 此外,啟用動態程式代碼安全性時,目前不支援一些 .NET 載入功能,包括載入以 System.Reflection.Emit 建置的未簽署元件。 Microsoft 建議您在強制執行動態程式碼安全性之前,先在稽核模式中測試動態程式碼安全性,以探索原則中是否應該包含任何新的連結庫。

此外,客戶只能預先編譯部署,以防止允許的可執行檔遭到終止,因為它會嘗試載入未簽署的動態產生程序代碼。 請參閱 ASP.NET 先行編譯概觀 檔中的一節,以瞭解如何修正此問題。

若要啟用動態程式碼安全性,請將下列選項新增至 <Rules> WDAC 原則的 區段:

<Rule>
    <Option>Enabled:Dynamic Code Security</Option>
</Rule>