App Control 如何與 PowerShell 搭配運作
本文說明商務用 App Control 如何保護 PowerShell 及其限制。 PowerShell 的安全行為會根據您使用的 Windows 和 PowerShell 版本而有所不同。
PowerShell 如何偵測系統鎖定原則
PowerShell 會 偵測到適用於商務用 AppLocker 和 App Control 的系統 範圍原則。 AppLocker 已被取代。 App Control 是 Windows 慣用的應用程式控制系統。
舊版應用程控原則強制執行偵測
PowerShell 使用舊版應用程控 WldpGetLockdownPolicy
API 來探索兩件事:
- 全系統原則強制執行:
None
、、Audit
Enforce
- 個別檔案原則:
None
、Audit
(原則允許)、Enforce
(原則不允許)
所有版本的 PowerShell (v5.1 - v7.x) 都支援此應用程控原則偵測。
最新的應用程控原則強制執行偵測
App Control 在最新版本的 Windows 中引進了新的 API。 從 7.3 版開始,PowerShell 會使用新的 WldpCanExecuteFile
API 來決定檔案的處理方式。 Windows PowerShell 5.1 不支援這個新的 API。 新的 API 優先於個別檔案的舊版 API。
不過,PowerShell 會繼續使用舊版 API 來取得整個系統的原則設定。 如果新的 API 無法使用,PowerShell 會回復為舊的 API 行為。
新的 API 會為每個檔案提供下列資訊:
WLDP_CAN_EXECUTE_ALLOWED
WLDP_CAN_EXECUTE_BLOCKED
WLDP_CAN_EXECUTE_REQUIRE_SANDBOX
鎖定原則下的 PowerShell 行為
PowerShell 可以在互動式和非互動式模式中執行。
- 在互動式模式中,PowerShell 是一種命令行應用程式,可接受使用者命令行輸入做為命令或腳本來執行。 結果會顯示回使用者。
- 在非互動式模式中,PowerShell 會載入模組並執行腳本檔案,而不需要使用者輸入。 結果數據流會被忽略或重新導向至檔案。
在原則強制執行下執行的互動式模式
PowerShell 以模式執行 ConstrainedLanguage
命令。 此模式可防止互動式使用者執行特定命令或執行任意程序代碼。 如需此模式中限制的詳細資訊,請參閱 本文的鎖定原則 下 PowerShell 限制一節。
在原則強制執行下執行的非互動模式
當 PowerShell 執行文本或載入模組時,它會使用應用程控 API 來取得檔案的原則強制執行。
如果可用,PowerShell 7.3 版或更高版本會 WldpCanExecuteFile
使用 API。 此 API 會傳回下列其中一個結果:
WLDP_CAN_EXECUTE_ALLOWED
:此檔案是由原則核准,且以一些限制在模式中使用FullLanguage
。WLDP_CAN_EXECUTE_BLOCKED
:此檔案未由原則核准。 PowerShell 在執行或載入檔案時擲回錯誤。WLDP_CAN_EXECUTE_REQUIRE_SANDBOX
:此檔案未獲原則核准,但仍可在模式中ConstrainedLanguage
執行或載入。
在 Windows PowerShell 5.1 或 API WldpCanExecuteFile
無法使用時,PowerShell 的每個檔案行為為:
None
:檔案會以一些限制以FullLanguage
模式載入。Audit
:檔案是以沒有限制的模式執行或載入FullLanguage
。 在 PowerShell 7.4 或更高版本中,原則會將限制信息記錄到 Windows 事件記錄檔。Enforce
:檔案是以 模式執行或載入ConstrainedLanguage
。
鎖定原則下的 PowerShell 限制
當 PowerShell 偵測到系統處於應用程控鎖定原則之下時,即使腳本受信任且在模式中 FullLanguage
執行,也會套用限制。 這些限制會防止PowerShell的已知行為,導致鎖定系統上執行任意程序代碼。 鎖定原則會強制執行下列限制:
具有通配符函式導出限制的模組點來源
任何使用文稿點來源和使用通配符名稱導出函式的模組都會導致錯誤。 封鎖通配符匯出可防止惡意使用者插入腳本,而惡意使用者可將未受信任的腳本植入到受信任的模組中。 惡意腳本接著可以存取信任模組的私人函式。
安全性建議: 請勿在模組中使用腳本點來源,並且一律匯出具有明確名稱的模組函式(沒有通配符)。
具有通配符函式導出限制的巢狀模組
如果父模組使用函式名稱通配符導出函式,PowerShell 會從函式匯出清單中移除巢狀模組中的任何函式名稱。 封鎖巢狀模組的通配符匯出可防止透過通配符名稱比對意外匯出危險的巢狀函式。
安全性建議: 一律導出具有明確名稱的模組函式(沒有通配符)。
互動式殼層參數類型轉換
當系統鎖定時,互動式PowerShell工作階段會以
ConstrainedLanguage
模式執行,以防止任意程式碼執行。 載入至會話的信任模組會在模式中FullLanguage
執行。 如果受信任的模組 Cmdlet 針對其參數使用複雜類型,則如果不允許跨信任界限進行轉換,在參數系結期間的類型轉換可能會失敗。 當 PowerShell 執行類型建構函式嘗試轉換值時,就會發生失敗。 不允許在模式中ConstrainedLanguage
執行類型建構函式。在此範例中,通常會允許參數係結類型轉換,但在模式中
ConstrainedLanguage
執行時會失敗。 不允許類型建ConnectionPort
構函式:PS> Create-ConnectionOnPort -Connection 22 Create-ConnectionOnPort: Cannot bind parameter 'Connection'. Cannot convert the "22" value of type "System.Int32" to type "ConnectionPort".
Enter-PSHostProcess
不允許 CmdletEnter-PSHostProcess
Cmdlet 已停用,並在使用時擲回錯誤。 此命令用於附加和偵錯會話。 它可讓您連線到本機電腦上的任何其他 PowerShell 工作階段。 Cmdlet 已停用,以防止資訊洩漏和任意程式代碼執行。
受限制語言模式下的PowerShell限制
應用程式控制原則未核准的腳本或函式不受信任。 當您執行不受信任的命令時,PowerShell 會封鎖命令執行 (新行為) 或以模式執行 ConstrainedLanguage
命令。 下列限制適用於 ConstrainedLanguage
模式:
Add-Type
不允許 Cmdlet封鎖
Add-Type
可防止執行任意的 .NET 程序代碼。Import-LocalizedData
受限制的 Cmdlet封鎖的
Import-LocalizedData
SupportedCommand 參數可防止執行任意程序代碼。Invoke-Expression
受限制的 Cmdlet傳遞至
Invoke-Expression
Cmdlet 的所有文稿區塊都會以ConstrainedLanguage
模式執行,以防止任意程式代碼執行。New-Object
受限制的 CmdletCmdlet
New-Object
僅限於只使用允許的 .NET 和 COM 類型,以防止存取不受信任的類型。ForEach-Object
Cmdlet 限制對於任何不在核准清單中之 .NET 型別的變數,不允許傳遞至
ForeEach-Object
的變數類型方法調用。 一般而言,ConstrainedLanguage
模式不允許任何物件方法調用,但核准的 .NET 類型除外,以防止存取不受信任的 .NET 類型。Export-ModuleMember
Cmdlet 限制使用
Export-ModuleMember
Cmdlet 匯出巢狀模組腳本檔案中的函式,其中子模組不受信任且父模組受信任,會導致錯誤。 封鎖此案例可防止惡意的不受信任模組從受信任的模組匯出危險函式。New-Module
Cmdlet 限制當您在信任的腳本中執行
New-Module
時,參數所提供的ScriptBlock
任何腳本區塊都會標示為以ConstrainedLanguage
模式執行,以防止將任意程式代碼插入信任的執行內容。Configuration
不允許關鍵詞模式
Configuration
中不允許ConstrainedLanguage
語言關鍵詞防止程序代碼插入式攻擊。class
不允許關鍵詞不允許
class
在 模式中使用ConstrainedLanguage
語言關鍵詞,以防止插入任意程序代碼。腳本區塊處理範圍限制
如果腳本區塊具有不同的信任層級,則不允許在父腳本區塊範圍中執行子腳本區塊。 例如,當您將一個腳本點到另一個腳本時,您會建立子關聯性。 封鎖此案例可防止不受信任的腳本存取受信任腳本範圍中的危險函式。
防止命令探索未受信任的腳本函式
PowerShell 命令探索不會將未受信任的來源函式,例如未受信任的腳本或模組傳回至信任的函式。 封鎖探索不受信任的命令可防止程序代碼插入透過命令植入。
不允許哈希表到物件轉換
ConstrainedLanguage
mode 會封鎖 PowerShell 數據區段中的物件轉換Data
哈希表,.psd1
以防止潛在的程式代碼插入式攻擊。限制自動類型轉換
ConstrainedLanguage
模式會封鎖自動類型轉換,但一小組已核准的安全類型,以防止潛在的程式代碼插入式攻擊。隱含模組函式導出限制
如果模組未明確匯出函式,PowerShell 會自動將所有已定義的模組函式自動匯出為便利功能。 在模式中
ConstrainedLanguage
,當模組跨信任界限載入時,就不會再發生隱含匯出。 封鎖隱含導出可防止非預期的公開危險模組函式不適合用於公用。腳本檔案無法匯入為模組
PowerShell 可讓您將腳本檔案 (
.ps1
) 匯入為模組。 所有已定義的函式都可供公開存取。ConstrainedLanguage
mode 會封鎖匯入腳本檔案,以防止意外暴露危險的腳本函式。設定變數
AllScope
限制ConstrainedLanguage
mode 會停用在變數上設定AllScope
的功能。 限制變數的範圍可防止變數干擾受信任命令的會話狀態。不允許類型方法調用
ConstrainedLanguage
模式不允許在未核准的類型上叫用方法。 未核准類型上的封鎖方法可防止叫用可能很危險或允許程式代碼插入的 .NET 類型方法。不允許類型屬性 setter
ConstrainedLanguage
模式會限制未核准類型上屬性 setter 的叫用。 在未核准的類型上封鎖屬性 setter 可防止程式代碼插入式攻擊。不允許建立類型
ConstrainedLanguage
mode 會封鎖在未核准的類型上建立類型,以封鎖可能允許程式代碼插入的不受信任建構函式。不允許模組範圍運算符
ConstrainedLanguage
mode 不允許使用模組範圍運算元。 例如:& (Get-Module MyModule) MyFunction
。 封鎖模組範圍運算子可防止存取模組私用函式和變數。
進一步閱讀
- 如需 PowerShell 語言模式的詳細資訊,請參閱 about_Language_Modes。
- 如需如何設定及使用 App Control 的詳細資訊,請參閱 如何使用 App Control for PowerShell。