セキュリティ (WPF)

Windows Presentation Foundation (WPF) スタンドアロン アプリケーションとブラウザーでホストされるアプリケーションを開発する際に、セキュリティ モデルを検討する必要があります。 WPF スタンドアロン アプリケーションは、Windows インストーラー (.msi)、XCopy、または ClickOnce のどれを使用して配置する場合でも、無制限のアクセス許可 (CASFullTrust アクセス許可セット) で実行されます。 部分的に信頼されたスタンドアロンの WPF アプリケーションを ClickOnce で展開することはサポートされていません。 ただし、完全に信頼されたホスト アプリケーションでは、.NET Framework アドイン モデルを使用して、部分的に信頼された AppDomain を作成することができます。 詳細については、「WPF アドインの概要」を参照してください。

ブラウザーでホストされる WPF アプリケーションは Windows Internet Explorer または Firefox によってホストされ、XAML ブラウザー アプリケーション (XBAP) または Loose Extensible Application Markup Language (XAML) ドキュメントにすることができます。詳細については、「WPF XAML ブラウザー アプリケーションの概要」を参照してください。

警告

XBAP が動作するには、インターネット エクスプローラーや Firefox などの従来のブラウザーが必要です。 これらの古いブラウザー バージョンは、通常、Windows 10 や Windows 11 ではサポートされていません。 最新のブラウザーでは、セキュリティ リスクがあるため XBAP アプリに必要なテクノロジがサポートされなくなりました。 XBAP を有効にするプラグインはサポートされなくなりました。

ブラウザーでホストされる WPF アプリケーションは部分信頼セキュリティ サンドボックス内で実行され、既定では、既定の CASInternet ゾーン アクセス許可セットに限定されています。 これは、一般的な Web アプリケーションの分離と同じ方法で、ブラウザーでホストされる WPF アプリケーションをクライアント コンピューターから効果的に分離できます。 XBAP は、デプロイメント URL およびクライアントのセキュリティ構成のセキュリティ ゾーンに基づいて、完全な信頼まで特権を昇格することができます。 詳細については、「WPF 部分信頼セキュリティ」を参照してください。

このトピックでは、Windows Presentation Foundation (WPF) のスタンドアロン アプリケーションとブラウザーでホストされるアプリケーションのセキュリティ モデルについて説明します。

このトピックは、次のセクションで構成されています。

安全なナビゲーション

XBAP では、WPF はアプリケーションとブラウザーという 2 種類のナビゲーションを区別します。

アプリケーション ナビゲーションは、ブラウザーによってホストされるアプリケーション内のコンテンツ項目間のナビゲーションです。 ブラウザー ナビゲーションは、ブラウザー自体のコンテンツとロケーション URL を変更するナビゲーションです。 アプリケーション ナビゲーション (通常は XAML) とブラウザー ナビゲーション (通常は HTML) の関係を次の図に示します。

Relationship between application navigation and browser navigation.

XBAP の移動先として安全と見なされるコンテンツの種類は、主に、アプリケーション ナビゲーションとブラウザーのナビゲーションのどちらが使用されているかで決まります。

アプリケーション ナビゲーションのセキュリティ

アプリケーション ナビゲーションが安全と見なされるのは、以下の 4 種類のコンテンツをサポートするパック URI で識別できる場合です。

コンテンツ タイプ 説明 URI の例
リソース ビルドの種類が Resource のプロジェクトに追加されるファイル。 pack://application:,,,/MyResourceFile.xaml
Content ビルドの種類が Content のプロジェクトに追加されるファイル。 pack://application:,,,/MyContentFile.xaml
起点サイト ビルドの種類が None のプロジェクトに追加されるファイル。 pack://siteoforigin:,,,/MySiteOfOriginFile.xaml
アプリケーション コード コンパイルされたコード分離を含む XAML リソース。

\- または -

ビルドの種類が Page のプロジェクトに追加される XAML ファイル。
pack://application:,,,/MyResourceFile .xaml

注意

アプリケーション データ ファイルとパック URI の詳細については、「WPF アプリケーションのリソース ファイル、コンテンツ ファイル、およびデータ ファイル」を参照してください。

これらのコンテンツ タイプのファイルは、ユーザーまたはプログラムを使用して移動できます。

  • ユーザー ナビゲーション。 ユーザーは Hyperlink 要素をクリックして移動します。

  • プログラム ナビゲーション。 アプリケーションは、たとえば NavigationWindow.Source プロパティを設定するなどして、ユーザーの関与なしで移動します。

ブラウザー ナビゲーションのセキュリティ

ブラウザー ナビゲーションは、次の条件の下でのみ安全と見なされます。

  • ユーザー ナビゲーション。 ユーザーは、入れ子になった Frame ではなく、メインの NavigationWindow 内にある Hyperlink 要素をクリックして移動します。

  • ゾーン。 移動先のコンテンツが、インターネットまたはローカル イントラネット上に存在する。

  • プロトコル。 使用されるプロトコルは、httphttpsfile、または mailto です。

これらの条件に適合しない方法で XBAP がコンテンツに移動しようとすると、SecurityException がスローされます。

Web ブラウザーのセキュリティ設定

コンピューターのセキュリティ設定によって、Web ブラウザーに付与されるアクセス権が決まります。 Web ブラウザーには、Internet Explorer や PresentationHost.exe など、WinINet API または UrlMon API を使用するアプリケーションやコンポーネントがあります。

Internet Explorer には、Internet Explorer での実行が可能な、下記のような機能を構成できる仕組みを提供しています。

  • .NET Framework 依存コンポーネント

  • ActiveX コントロールおよびプラグイン

  • ダウンロード

  • [スクリプティング]

  • ユーザー認証

このような方法でセキュリティ保護できる機能のコレクションは、インターネットイントラネット信頼済みサイト、および制限付きサイトの各ゾーンでは、ゾーン単位で構成されます。 次の手順では、セキュリティ設定の構成方法について説明します。

  1. [コントロール パネル] を開きます。

  2. [ネットワークとインターネット] をクリックし、 [インターネット オプション] をクリックします。

    [インターネット オプション] ダイアログ ボックスが表示されます。

  3. [セキュリティ] タブで、セキュリティ設定を構成するゾーンを選択します。

  4. [レベルのカスタマイズ] ボタンをクリックします。

    [セキュリティ設定] ダイアログ ボックスが表示されるので、選択したゾーンのセキュリティ設定を構成します。

    Screenshot that shows the Security Settings dialog box.

Note

[インターネット オプション] ダイアログ ボックスは、Internet Explorer から開くこともできます。 [ツール] をクリックし、 [インターネット オプション] をクリックします。

Windows Internet Explorer 7 以降では、.NET Framework に特化した次のセキュリティ設定が含まれています。

  • Loose XAML。 Internet Explorer が Loose XAML ファイルに移動できるかどうかを制御します。 ([有効]、[無効]、および [ダイアログを表示する] オプション)。

  • XAML ブラウザー アプリケーション。 Internet Explorer が XBAP に移動してこれを実行できるかどうかを制御します。 ([有効]、[無効]、および [ダイアログを表示する] オプション)。

既定では、これらの設定は インターネットローカル イントラネット、および信頼済みサイトの各ゾーンではすべて有効になり、制限付きサイト ゾーンでは無効になります。

[インターネット オプション] から使用できるセキュリティ設定以外に、セキュリティ上重要なさまざまな WPF 機能を選択的にブロックするために次のレジストリ値を使用できます。 値は次のキーで定義されます。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\Windows Presentation Foundation\Features

設定可能な値を次の表に示します。

値名 値型 値のデータ
XBAPDisallow REG_DWORD 許可しない場合は 1、許可する場合は 0。
LooseXamlDisallow REG_DWORD 許可しない場合は 1、許可する場合は 0。
WebBrowserDisallow REG_DWORD 許可しない場合は 1、許可する場合は 0。
MediaAudioDisallow REG_DWORD 許可しない場合は 1、許可する場合は 0。
MediaImageDisallow REG_DWORD 許可しない場合は 1、許可する場合は 0。
MediaVideoDisallow REG_DWORD 許可しない場合は 1、許可する場合は 0。
ScriptInteropDisallow REG_DWORD 許可しない場合は 1、許可する場合は 0。

WebBrowser コントロールと機能コントロール

WPF WebBrowser コントロールを使用して、Web コンテンツをホストできます。 WPF WebBrowser コントロールは、基になる WebBrowser ActiveX コントロールをラップします。 WPF では、WPF WebBrowser コントロールを使用して信頼されていない Web コンテンツをホストするときに、アプリケーションの保護を一部サポートします。 ただし、一部のセキュリティ機能は、WebBrowser コントロールを使用してアプリケーションによって直接適用する必要があります。 WebBrowser ActiveX コントロールの詳細については、WebBrowser コントロールの概要とチュートリアルに関する記事を参照してください。

注意

このセクションは、WebBrowser を使用して HTML コンテンツに移動するため、Frame コントロールにも適用されます。

WPF WebBrowser コントロールを使用して信頼されていない Web コンテンツをホストする場合、アプリケーションでは、部分信頼 AppDomain を使用して、悪意のある HTML スクリプト コードからアプリケーション コードを分離する必要があります。 これは、アプリケーションが InvokeScript メソッドと ObjectForScripting プロパティを使用して、ホストされているスクリプトを操作する場合に特に当てはまります。 詳細については、「WPF アドインの概要」を参照してください。

アプリケーションで WPF WebBrowser コントロールを使用する場合、セキュリティを強化して攻撃を軽減するもう 1 つの方法は、Internet Explorer 機能コントロールを有効にすることです。 機能コントロールは Internet Explorer の追加機能で、これにより、管理者および開発者は、WPF WebBrowser コントロールよってラップされる WebBrowser ActiveX コントロールをホストする、Internet Explorer およびアプリケーションの機能を構成できます。 機能コントロールを構成するには、CoInternetSetFeatureEnabled 関数を使用するか、レジストリの値を変更します。 機能コントロールの詳細については、機能コントロールの概要に関する記事とインターネット機能コントロールに関する記事を参照してください。

WPF WebBrowser コントロールを使用するスタンドアロン WPF アプリケーションを開発している場合は、アプリケーションに対して次の機能コントロールが自動的に有効になります。

機能コントロール
FEATURE_MIME_HANDLING
FEATURE_MIME_SNIFFING
FEATURE_OBJECT_CACHING
FEATURE_SAFE_BINDTOOBJECT
FEATURE_WINDOW_RESTRICTIONS
FEATURE_ZONE_ELEVATION
FEATURE_RESTRICT_FILEDOWNLOAD
FEATURE_RESTRICT_ACTIVEXINSTALL
FEATURE_ADDON_MANAGEMENT
FEATURE_HTTP_USERNAME_PASSWORD_DISABLE
FEATURE_SECURITYBAND
FEATURE_UNC_SAVEDFILECHECK
FEATURE_VALIDATE_NAVIGATE_URL
FEATURE_DISABLE_TELNET_PROTOCOL
FEATURE_WEBOC_POPUPMANAGEMENT
FEATURE_DISABLE_LEGACY_COMPRESSION
FEATURE_SSLUX

これらの機能コントロールは無条件で有効になるため、完全信頼アプリケーションに悪影響が及ぶ場合があります。 この場合、特定のアプリケーションとそのアプリケーションがホストしているコンテンツにセキュリティ上のリスクがなければ、対応する機能コントロールを無効にできます。

機能コントロールは、WebBrowser ActiveX オブジェクトをインスタンス化するプロセスによって適用されます。 そのため、信頼されていないコンテンツに移動できるスタンドアロン アプリケーションを作成する場合は、その他の機能コントロールを有効にすることを検討すべきです。

注意

この推奨事項は、MSHTML および SHDOCVW ホスト セキュリティの一般的な推奨事項に基づいています。 詳細については、MSHTML ホスト セキュリティ FAQ: パート 1 に関する記事、および MSHTML ホスト セキュリティ FAQ: パート 2 に関する記事を参照してください。

実行可能ファイルでは、レジストリ値を 1 に設定して以下の機能コントロールを有効にすることを検討してください。

機能コントロール
FEATURE_ACTIVEX_REPURPOSEDETECTION
FEATURE_BLOCK_LMZ_IMG
FEATURE_BLOCK_LMZ_OBJECT
FEATURE_BLOCK_LMZ_SCRIPT
FEATURE_RESTRICT_RES_TO_LMZ
FEATURE_RESTRICT_ABOUT_PROTOCOL_IE7
FEATURE_SHOW_APP_PROTOCOL_WARN_DIALOG
FEATURE_LOCALMACHINE_LOCKDOWN
FEATURE_FORCE_ADDR_AND_STATUS
FEATURE_RESTRICTED_ZONE_WHEN_FILE_NOT_FOUND

実行可能ファイルでは、レジストリ値を 0 に設定して以下の機能コントロールを無効にすることを検討してください。

機能コントロール
FEATURE_ENABLE_SCRIPT_PASTE_URLACTION_IF_PROMPT

WPF WebBrowser コントロールを含む部分信頼 XAML を Windows Internet Explorer で実行する場合、WPF は Internet Explorer プロセスのアドレス空間で WebBrowser ActiveX コントロールをホストします。 WebBrowser ActiveX コントロールは Internet Explorer プロセスでホストされるため、Internet Explorer のすべての機能コントロールは、WebBrowser ActiveX コントロールに対しても有効になります。

Internet Explorer で実行されている XBAP にも、標準のスタンドアロン アプリケーションよりも高いレベルのセキュリティが適用されます。 このセキュリティの強化の理由は、Windows Vista および Windows 7 では既定で、Internet Explorer (および WebBrowser ActiveX コントロール) が保護モードで実行されるためです。 保護モードの詳細については、「保護モードの Internet Explorer の理解と機能」を参照してください。

注意

インターネット ゾーン内で、WPF WebBrowser コントロールが含まれる XBAP を Firefox で実行しようとすると、SecurityException がスローされます。 これは、WPF セキュリティ ポリシーが原因です。

部分信頼クライアント アプリケーションに対する APTCA の無効化

マネージド アセンブリをグローバル アセンブリ キャッシュ (GAC) にインストールした場合、ユーザーはインストールのために明示的なアクセス許可を提供する必要があるので、これらは完全信頼になります。 完全に信頼されているため、これらを使用できるのは完全信頼マネージド クライアント アプリケーションのみです。 部分的に信頼されたアプリケーションでそれらを使用できるようにするには、AllowPartiallyTrustedCallersAttribute (APTCA) でマークする必要があります。 この属性は、部分信頼で実行しても安全であるとテストで確認されたアセンブリだけに設定します。

ただし、APTCA アセンブリは、GAC にインストールされた後にセキュリティの欠陥を発生させる可能性があります。 セキュリティ上の欠陥が検出されたら、アセンブリの発行者は、既存のインストールでの問題を解決し、問題発見後に発生する可能性があるインストールに備えるため、セキュリティ更新プログラムを作成できます。 更新プログラムの 1 つのオプションとして、アセンブリのアンインストールが考えられますが、その場合はこのアセンブリを使用する他の完全信頼クライアント アプリケーションを破損するおそれがあります。

WPF には、APTCA アセンブリをアンインストールせずに、部分信頼 XBAP に対して APTCA アセンブリを無効にできる仕組みが備わっています。

APTCA アセンブリを無効にするには、特殊なレジストリ キーを作成する必要があります。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\policy\APTCA\<AssemblyFullName>, FileVersion=<AssemblyFileVersion>

次のコードは一例を示しています。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\policy\APTCA\aptcagac, Version=1.0.0.0, Culture=neutral, PublicKeyToken=215e3ac809a0fea7, FileVersion=1.0.0.0

このキーにより、APTCA アセンブリのエントリが設定されます。 また、アセンブリを有効または無効にする値をこのキーに作成する必要があります。 値の詳細を次に示します。

  • 値の名前: APTCA_FLAG

  • 値の型:REG_DWORD

  • 値のデータ:無効にする場合は 1、有効にする場合は 0

部分信頼クライアント アプリケーションに対してアセンブリを無効にする必要がある場合は、レジストリ キーおよび値を作成する更新プログラムを作成します。

注意

コア .NET Framework アセンブリは、マネージド アプリケーションを実行するために必要であるため、この方法で無効にしても影響を受けません。 APTCA アセンブリの無効化のサポートは、主にサードパーティ アプリケーションを対象にしたものです。

Loose XAML ファイルに対するサンドボックスの動作

Loose XAML ファイルは、コードビハインド、イベント ハンドラー、またはアプリケーション固有のアセンブリに依存しない、マークアップのみの XAML ファイルです。 ブラウザーから直接 Loose XAML ファイルに移動するときは、既定のインターネット ゾーン アクセス許可セットに基づいてセキュリティ サンドボックスに読み込まれます。

ただし、このセキュリティ動作は、loose XAML ファイルがスタンドアロン アプリケーションの NavigationWindow または Frame から移動した場合は異なります。

どちらの場合も、移動先の Loose XAML ファイルは、ホスト アプリケーションのアクセス許可を継承します。 ただし、この動作はセキュリティの観点からは望ましくない場合があります。特に、Loose XAML ファイルが信頼されていないエンティティまたは不明エンティティによって生成された場合には問題です。 このタイプのコンテンツは外部コンテンツと呼ばれ、FrameNavigationWindow の両方を構成して、移動してきたときに分離するようにできます。 分離するには、次に示す例 FrameNavigationWindow の例のように、SandboxExternalContent プロパティを true に設定します。

<Frame 
  Source="ExternalContentPage.xaml" 
  SandboxExternalContent="True">
</Frame>
<!-- Sandboxing external content using NavigationWindow-->
<NavigationWindow 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  Source="ExternalContentPage.xaml" 
  SandboxExternalContent="True">
</NavigationWindow>

このように設定すると、外部コンテンツは、アプリケーションをホストするプロセスとは異なるプロセスに読み込まれます。 このプロセスは既定のインターネット ゾーン アクセス許可セットに限定されており、ホスト アプリケーションとクライアント コンピューターから外部コンテンツを効果的に分離します。

注意

スタンドアロン アプリケーションでの NavigationWindow または Frame からの Loose XAML ファイルへの移動を、PresentationHost プロセスを含む WPF ブラウザーのホスト処理インフラストラクチャに基づいて実装しても、Windows Vista および Windows 7 上の Internet Explorer でコンテンツを直接読み込む場合 (やはり PresentationHost を使用) に比べると、セキュリティ レベルは若干低くなります。 これは、Web ブラウザーを使用しているスタンドアロン WPF アプリケーションに、Internet Explorer の保護モード セキュリティ機能が追加されていないためです。

セキュリティを向上する WPF アプリケーションを開発するためのリソース

セキュリティを向上する WPF アプリケーションの開発に役立つその他のリソースを次に示します。

区分 リソース
マネージド コード patterns & practices アプリケーション セキュリティ ガイダンス インデックス
CAS コード アクセス セキュリティ
ClickOnce ClickOnce のセキュリティと配置
WPF WPF 部分信頼セキュリティ

関連項目