セキュリティ (WPF)
Windows Presentation Foundation (WPF) のスタンドアロン アプリケーションおよびブラウザー ホスト アプリケーションを開発する場合は、セキュリティ モデルを考慮する必要があります。WPF スタンドアロン アプリケーションは、Windows インストーラー (.msi)、XCopy、または ClickOnce のいずれで配置されても、無制限のアクセス許可 (CAS FullTrust アクセス許可セット) で実行されます。 部分信頼を配置した場合は、ClickOnce を使用したスタンドアロン WPF アプリケーションはサポートされません。 ただし、完全信頼ホスト アプリケーションは、.NET Framework アドイン モデルを使用して部分信頼 AppDomain を作成できます。 詳細については、「WPF アドインの概要」を参照してください。
WPF ブラウザー ホスト アプリケーションは、Windows Internet Explorer または Firefox によってホストされ、XAML browser applications (XBAPs) にすることも、Loose Extensible Application Markup Language (XAML) ドキュメントにすることもできます。詳細については、「WPF XAML ブラウザー アプリケーションの概要」を参照してください。
WPF ブラウザー ホスト アプリケーションは、既定では部分信頼セキュリティ サンドボックス内で実行され、既定の CAS インターネット ゾーン アクセス許可セットに制限されます。 これにより、一般的な Web アプリケーションが分離されるのと同じ方法で、WPF ブラウザー ホスト アプリケーションがクライアント コンピューターから効果的に分離されます。 配置 URL のセキュリティ ゾーンおよびクライアントのセキュリティ構成に応じて、XBAP は特権を完全信頼まで昇格させることができます。 詳細については、「WPF 部分信頼セキュリティ」を参照してください。
ここでは、Windows Presentation Foundation (WPF) のスタンドアロン アプリケーションとブラウザー ホストアプリケーションのセキュリティ モデルについて説明します。
このトピックは、次のセクションで構成されています。
安全なナビゲーション
Web ブラウザーのセキュリティ設定
WebBrowser コントロールと機能コントロール
部分信頼クライアント アプリケーションに対する APTCA アセンブリの無効化
Loose XAML ファイルに対するサンドボックスの動作
セキュリティを向上する WPF アプリケーションを開発するためのリソース
安全なナビゲーション
XBAPs の場合、WPF はアプリケーションとブラウザーという 2 種類のナビゲーションを区別します。
アプリケーション ナビゲーションは、ブラウザーによってホストされるアプリケーション内のコンテンツの項目間のナビゲーションです。 ブラウザー ナビゲーションは、ブラウザー自体のコンテンツと場所の URL を変更するナビゲーションです。 アプリケーション ナビゲーション (通常は XAML) とブラウザー ナビゲーション (通常は HTML) の関係を次の図に示します。
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 |
メモ |
---|
アプリケーション データ ファイルとパック URIs の詳細については、「WPF アプリケーションのリソース ファイル、コンテンツ ファイル、およびデータ ファイル」を参照してください。 |
これらのコンテンツ タイプのファイルには、ユーザーまたはプログラムによって移動できます。
ユーザー ナビゲーション。 ユーザーは Hyperlink 要素をクリックして移動します。
プログラム ナビゲーション。 アプリケーションは、NavigationWindow.Source プロパティを設定するなど、ユーザーとは無関係に移動します。
ブラウザー ナビゲーションのセキュリティ
ブラウザー ナビゲーションは、次の条件の下でのみ安全と見なされます。
ユーザー ナビゲーション。 ユーザーは、入れ子になった Frame 内ではなく、メインの NavigationWindow 内にある Hyperlink 要素をクリックすることで移動する。
ゾーン。 移動先のコンテンツが、インターネットまたはローカル イントラネット上に存在する。
プロトコル。 使用されるプロトコルは、http、https、file、または mailto。
これらの条件に適合しない方法で XBAP がコンテンツに移動しようとすると、SecurityException がスローされます。
Web ブラウザーのセキュリティ設定
コンピューターのセキュリティ設定により、Web ブラウザーに付与されるアクセス権が決まります。 Web ブラウザーには、Internet Explorer や PresentationHost.exe など、WinINet API または UrlMon API を使用するアプリケーションやコンポーネントがあります。
Internet Explorer は、Internet Explorer での実行が可能な機能を構成できる機構を備えています。これらの機能には、次のものがあります。
.NET Framework 依存コンポーネント
ActiveX コントロールおよびプラグイン
ダウンロード
スクリプト
ユーザー認証
このような方法でセキュリティ保護できる機能のコレクションは、インターネット、イントラネット、信頼済みサイト、および制限付きサイトの各ゾーンのゾーン単位で構成されます。 次の手順では、セキュリティ設定を構成する方法について説明します。
コントロール パネルを開きます。
[ネットワークとインターネット] をクリックし、[インターネット オプション] をクリックします。
[インターネット オプション] ダイアログ ボックスが表示されます。
[セキュリティ] タブで、セキュリティ設定を構成するゾーンを選択します。
[レベルのカスタマイズ] をクリックします。
[セキュリティの設定] ダイアログ ボックスが表示されるので、選択したゾーンのセキュリティ設定を構成します。
メモ |
---|
[インターネット オプション] ダイアログ ボックスは、Internet Explorer から開くこともできます。[ツール] をクリックし、[インターネット オプション] をクリックします。 |
Windows Internet Explorer 7 以降では、特に .NET Framework を対象にした次のセキュリティ設定があります。
Loose XAML。 Internet Explorer が Loose XAML ファイルに移動できるかどうかを制御します ([有効]、[無効]、および [ダイアログを表示する] オプション)。
XAML ブラウザー アプリケーション。 Internet Explorer が XBAPs に移動して実行できるかどうかを制御します ([有効]、[無効]、および [ダイアログを表示する] オプション)。
既定では、これらの設定は [インターネット]、[イントラネット]、および [信頼済みサイト] の各ゾーンではすべて有効になり、[制限付きサイト] ゾーンでは無効になります。
セキュリティ関連の WPF レジストリの設定
[インターネット オプション] から使用できるセキュリティ設定以外に、セキュリティ上重要なさまざまな 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 Control Overviews and Tutorials (WebBrowser コントロールの概要とチュートリアル)」を参照してください。
メモ |
---|
このセクションの内容は、Frame コントロールにも当てはまります。このコントロールは、WebBrowser を使用して HTML コンテンツに移動するためです。 |
WPF WebBrowser コントロールを使用して信頼されていない Web コンテンツをホストする場合、アプリケーションでは、部分信頼 AppDomain を使用して、悪意のある HTML スクリプト コードからアプリケーション コードを分離する必要があります。 これは、特に、アプリケーションが InvokeScript メソッドと ObjectForScripting プロパティを使用してホストされたスクリプトと対話している場合に当てはまります。 詳細については、「WPF アドインの概要」を参照してください。
アプリケーションで WPF WebBrowser コントロールを使用する場合は、セキュリティを強化して攻撃を軽減するもう 1 つの方法として、Internet Explorer 機能コントロールを有効にする方法があります。 機能コントロールは Internet Explorer の追加機能で、これにより、管理者および開発者は、WebBrowser ActiveX コントロールをホストする Internet Explorer およびアプリケーションの機能を構成できます。WebBrowser ActiveX コントロールは、WPF WebBrowser コントロールによってラップされます。 機能コントロールを構成するには、CoInternetSetFeatureEnabled 関数を使用するか、レジストリの値を変更します。 機能コントロールの詳細については、「Introduction to Feature Controls (機能コントロールの概要)」および「Internet Feature Controls (インターネット機能コントロール)」を参照してください。
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 ホスト セキュリティの一般的な推奨事項に基づいています。詳細については、「The MSHTML Host Security FAQ: Part I of II (MSHTML ホスト セキュリティに関する FAQ: 第 I 部)」および「The MSHTML Host Security FAQ: Part II of II (MSHTML ホスト セキュリティに関する FAQ: 第 II 部)」を参照してください。 |
実行可能ファイルでは、レジストリ値を 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 browser application (XBAP) を 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 アセンブリの無効化
マネージ アセンブリを global assembly cache (GAC) にインストールした場合、ユーザーは、インストールの際に明示的なアクセス許可を提供する必要があるので、これらは完全信頼になります。 完全信頼であるため、これらのアセンブリは完全信頼マネージ クライアント アプリケーションのみが使用できます。 それらを部分信頼アプリケーションで使用できるようにする場合は、AllowPartiallyTrustedCallersAttribute (APTCA) という属性を設定する必要があります。 この属性は、部分信頼で実行しても安全であることがテストで確認されたアセンブリだけに設定する必要があります。
ただし、APTCA アセンブリは、GAC にインストールされた後にセキュリティの欠陥を露呈する可能性があります。 セキュリティの欠陥が発見された場合、アセンブリの発行者は、既存のインストールでの問題を解決し、問題の発見後に配置される可能性のあるインストールに備えるためのセキュリティ更新プログラムを作成できます。 更新プログラムの 1 つのオプションは、アセンブリをアンインストールすることですが、アンインストールにより、このアセンブリを使用する完全信頼クライアント アプリケーションが破損するおそれがあります。
WPF は、APTCA アセンブリをアンインストールせずに、部分信頼 XBAPs アプリケーションに対して 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 ファイルに直接移動するときは、既定のインターネット ゾーン アクセス許可セットに基づいてファイルがセキュリティ サンドボックスに読み込まれます。
一方、スタンドアロン アプリケーションの NavigationWindow または Frame から Loose XAML ファイルに移動した場合は、セキュリティ動作が異なります。
どちらの場合も、移動先の Loose XAML ファイルは、ホスト アプリケーションのアクセス許可を継承します。 ただし、この動作はセキュリティの観点からは望ましくない場合があります。特に、Loose XAML ファイルが信頼されていないエンティティまたは不明エンティティによって生成された場合には問題があります。 この種のコンテンツは外部コンテンツと呼ばれ、外部コンテンツにナビゲートされたときに外部コンテンツを分離するように Frame と NavigationWindow を構成できます。 分離するには、次の Frame と NavigationWindow の例に示されているように、SandboxExternalContent プロパティを true に設定します。
<Frame
Source="ExternalContentPage.xaml"
SandboxExternalContent="True">
</Frame>
<!-- Sandboxing external content using NavigationWindow-->
<NavigationWindow
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
Source="ExternalContentPage.xaml"
SandboxExternalContent="True">
</NavigationWindow>
このように設定すると、外部コンテンツは、アプリケーションをホストするプロセスとは異なるプロセスに読み込まれます。 このプロセスは既定のインターネット ゾーン アクセス許可セットに限定されており、ホスト アプリケーションとクライアント コンピューターから外部コンテンツを効果的に分離します。
メモ |
---|
スタンドアロン アプリケーションの NavigationWindow または Frame から Loose XAML ファイルへの移動を、WPF のブラウザーのホスト処理インフラストラクチャ (PresentationHost プロセスを含む) に基づいて実装しても、Windows Vista および Windows 7 上の Internet Explorer でコンテンツを直接読み込む場合 (この場合も PresentationHost を使用) よりもセキュリティ レベルは若干低くなります。これは、Web ブラウザーを使用しているスタンドアロン WPF アプリケーションに、Internet Explorer の保護モード セキュリティ機能が追加されていないためです。 |
セキュリティを向上する WPF アプリケーションを開発するためのリソース
セキュリティを向上する WPF アプリケーションの開発に役立つその他のリソースを次に示します。
区分 |
リソース |
---|---|
マネージ コード |
|
CAS |
|
ClickOnce |
|
WPF |
参照
概念
WPF のセキュリティ方針 - プラットフォーム セキュリティ
WPF のセキュリティ方針 - セキュリティ エンジニアリング