次の方法で共有


PowerShell でのアプリ コントロールの動作

この記事では、App Control for Business が PowerShell をセキュリティで保護する方法と、それが課す制限について説明します。 PowerShell の安全な動作は、使用している Windows と PowerShell のバージョンによって異なります。

PowerShell がシステム ロックダウン ポリシーを検出する方法

PowerShell は、AppLockerApp Control for Business の両方のシステム全体のポリシーを検出します。 AppLocker は非推奨です。 アプリ コントロールは、Windows に推奨されるアプリケーション 制御システムです。

従来のアプリ制御ポリシーの適用の検出

PowerShell では、従来の App Control WldpGetLockdownPolicy API を使用して、次の 2 つのことを検出します。

  • システム全体のポリシー適用: NoneAuditEnforce
  • 個々のファイル ポリシー: NoneAudit (ポリシーで許可)、 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 は、スクリプトを実行するか、モジュールを読み込むとき、App Control 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 または WldpCanExecuteFile API を使用できない場合、PowerShell のファイルごとの動作は次のようになります。

  • None: ファイルは FullLanguage モードで読み込まれますが、いくつかの制限があります。
  • Audit:ファイルは、制限なしで FullLanguage モードで実行または読み込まれます。 PowerShell 7.4 以降では、ポリシーによって Windows イベント ログに制限情報が記録されます。
  • Enforce: ファイルは、 ConstrainedLanguage モードで実行または読み込まれます。

ロックダウン ポリシーでの PowerShell の制限

PowerShell は、システムがアプリ制御ロックダウン ポリシーの下にあると検出すると、スクリプトが信頼され、モードで FullLanguage 実行されている場合でも制限を適用します。 これらの制限により、ロックダウンされたシステムで任意のコードが実行される可能性がある PowerShell の既知の動作が防止されます。 このロックダウン ポリシーでは、次の制限が適用されます。

  • ワイルドカード関数のエクスポート制限を使用したモジュールのドット ソーシング

    ワイルドカード名を使用してスクリプトのドット ソーシング関数とエクスポート関数を使用するモジュールでは、エラーが発生します。 ワイルドカードエクスポートをブロックすると、信頼できるモジュールにドットソースを取得する信頼されていないスクリプトを作成できる悪意のあるユーザーからのスクリプトインジェクションを防ぐことができます。 悪意のあるスクリプトは、信頼されたモジュールのプライベート機能にアクセスする可能性があります。

    セキュリティの推奨事項: モジュールでスクリプトのドット ソーシングを使用せず、明示的な名前 (ワイルドカード文字なし) を使用してモジュール関数を常にエクスポートします。

  • ワイルドカード関数のエクスポート制限付きの入れ子になったモジュール

    親モジュールが関数名のワイルドカード文字を使用して関数をエクスポートする場合、PowerShell は関数エクスポート リストから入れ子になったモジュール内の関数名を削除します。 入れ子になったモジュールからのワイルドカード エクスポートをブロックすると、ワイルドカード名の照合によって危険な入れ子になった関数が誤ってエクスポートされるのを防ぐことができます。

    セキュリティの推奨事項: 明示的な名前 (ワイルドカード文字なし) を使用してモジュール関数を常にエクスポートします。

  • 対話型シェル パラメーターの型変換

    システムがロックダウンされると、対話型の PowerShell セッションが ConstrainedLanguage モードで実行され、任意のコードが実行されないようにします。 セッションに読み込まれた信頼されたモジュールは、 FullLanguage モードで実行されます。 信頼されたモジュール コマンドレットがパラメーターに複合型を使用している場合、信頼の境界を越えて変換が許可されていない場合、パラメーター バインド中の型変換が失敗する可能性があります。 このエラーは、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 コマンドレットが許可されていません

    Enter-PSHostProcess コマンドレットは無効になっており、使用するとエラーがスローされます。 このコマンドは、アタッチおよびデバッグ セッションに使用されます。 これにより、ローカル コンピューター上の他の PowerShell セッションに接続できます。 このコマンドレットは、情報漏えいや任意のコード実行を防ぐために無効になっています。

制約付き言語モードでの PowerShell の制限

アプリ制御ポリシーによって承認されていないスクリプトまたは関数は信頼されていません。 信頼されていないコマンドを実行すると、PowerShell はコマンドの実行をブロックするか (新しい動作)、コマンドを ConstrainedLanguage モードで実行します。 次の制限事項が ConstrainedLanguage モードに適用されます。

  • Add-Type コマンドレットが許可されていません

    Add-Type をブロックすると、任意の .NET コードが実行できなくなります。

  • Import-LocalizedData コマンドレットの制限付き

    Import-LocalizedDataSupportedCommand パラメーターをブロックすると、任意のコードが実行できなくなります。

  • Invoke-Expression コマンドレットの制限付き

    Invoke-Expression コマンドレットに渡されるすべてのスクリプト ブロックは、任意のコードの実行を防ぐために ConstrainedLanguage モードで実行されます。

  • New-Object コマンドレットの制限付き

    New-Object コマンドレットは、信頼されていない型へのアクセスを防ぐために、許可されている .NET 型と COM 型のみを使用するように制限されています。

  • ForEach-Object コマンドレットの制限

    ForeEach-Objectに渡される変数の型メソッドの呼び出しは、承認された一覧にない .NET 型では許可されません。 一般に、 ConstrainedLanguage モードでは、信頼されていない .NET 型へのアクセスを防ぐために、承認された .NET 型を除き、オブジェクト メソッドの呼び出しは許可されません。

  • Export-ModuleMember コマンドレットの制限

    Export-ModuleMember コマンドレットを使用して、子モジュールが信頼されておらず、親モジュールが信頼されている入れ子になったモジュール スクリプト ファイルに関数をエクスポートすると、エラーが発生します。 このシナリオをブロックすると、悪意のある信頼されていないモジュールが信頼できるモジュールから危険な関数をエクスポートできなくなります。

  • New-Module コマンドレットの制限

    信頼されたスクリプトで New-Module を実行すると、任意のコードが信頼された実行コンテキストに挿入されないように、 ScriptBlock パラメーターによって提供されるすべてのスクリプト ブロックが ConstrainedLanguage モードで実行されるようにマークされます。

  • Configuration キーワードは使用できません

    Configuration 言語キーワードは、コードインジェクション攻撃を防ぐために ConstrainedLanguage モードでは許可されません。

  • class キーワードは使用できません

    class 言語キーワードは、任意のコードの挿入を防ぐため、ConstrainedLanguage モードでは使用できません。

  • スクリプト ブロックの処理スコープの制限

    スクリプト ブロックの信頼レベルが異なる場合、子スクリプト ブロックは親スクリプト ブロック スコープで実行できません。 たとえば、あるスクリプトを別のスクリプトにドット ソースすると、子リレーションシップを作成します。 このシナリオをブロックすると、信頼されていないスクリプトが信頼されたスクリプト スコープ内の危険な関数にアクセスできなくなります。

  • 信頼されていないスクリプト関数のコマンド検出を防止する

    PowerShell コマンド検出では、信頼されていないソース (信頼されていないスクリプトやモジュールなど) から信頼できる関数に関数が返されることはありません。 信頼されていないコマンドの検出をブロックすると、コマンドの植え付けによるコード挿入が防止されます。

  • ハッシュテーブルからオブジェクトへの変換は許可されていません

    ConstrainedLanguage モード は、コードインジェクション攻撃の可能性を防ぐために、PowerShell データ (.psd1) ファイルのDataセクションでハッシュテーブルからオブジェクトへの変換をブロックします。

  • 自動型変換の制限

    ConstrainedLanguage モード は、コードインジェクション攻撃の可能性を防ぐために、承認された安全な型の小さなセットを除き、自動型変換をブロックします。

  • 暗黙的なモジュール関数のエクスポート制限

    モジュールが関数を明示的にエクスポートしない場合、PowerShell は、定義されているすべてのモジュール関数を便利な機能として暗黙的にエクスポートします。 ConstrainedLanguage モードでは、モジュールが信頼境界を越えて読み込まれると、暗黙的なエクスポートが行われなくなりました。 暗黙的なエクスポートをブロックすると、一般に使用されることを意図しない危険なモジュール関数が意図せずに公開されるのを防ぐことができます。

  • スクリプト ファイルをモジュールとしてインポートできない

    PowerShell を使用すると、スクリプト ファイル (.ps1) をモジュールとしてインポートできます。 定義されているすべての関数がパブリックにアクセス可能になります。 ConstrainedLanguage モード は、危険なスクリプト関数が意図せずに公開されないように、スクリプト ファイルのインポートをブロックします。

  • 変数 AllScope 制限の設定

    ConstrainedLanguage モードでは、変数に AllScope を設定する機能が無効になります。 変数のスコープを制限すると、変数が信頼されたコマンドのセッション状態に干渉することを防ぐことができます。

  • 型メソッドの呼び出しが許可されていません

    ConstrainedLanguage モードでは、承認されていない型に対するメソッド呼び出しは許可されません。 承認されていない型のメソッドをブロックすると、危険な .NET 型メソッドの呼び出しやコード挿入が許可される可能性があります。

  • 型プロパティセッターは許可されていません

    ConstrainedLanguage モード では、未承認の型に対するプロパティ セッターの呼び出しが制限されます。 承認されていない型でプロパティ セッターをブロックすると、コードインジェクション攻撃が防止されます。

  • 型の作成は許可されていません

    ConstrainedLanguage モード は、未承認の型での型の作成をブロックし、コード挿入を許可できる信頼されていないコンストラクターをブロックします。

  • モジュール スコープ演算子は許可されていません

    ConstrainedLanguage モードでは、モジュール スコープ演算子を使用できません。 (例: & (Get-Module MyModule) MyFunction)。 モジュール スコープ演算子をブロックすると、モジュールのプライベート関数と変数にアクセスできなくなります。

参考資料