セキュリティ (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 要素をクリックすることで移動する。

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

  • プロトコル。 使用されるプロトコルは、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. [レベルのカスタマイズ] をクリックします。

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

    [セキュリティ設定] ダイアログ ボックス

メモメモ

[インターネット オプション] ダイアログ ボックスは、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 ファイルが信頼されていないエンティティまたは不明エンティティによって生成された場合には問題があります。 この種のコンテンツは外部コンテンツと呼ばれ、外部コンテンツにナビゲートされたときに外部コンテンツを分離するように FrameNavigationWindow を構成できます。 分離するには、次の FrameNavigationWindow の例に示されているように、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 アプリケーションの開発に役立つその他のリソースを次に示します。

区分

リソース

マネージ コード

patterns & practices アプリケーション セキュリティ ガイダンス インデックス

CAS

コード アクセス セキュリティ

ClickOnce

ClickOnce のセキュリティと配置

WPF

WPF 部分信頼セキュリティ

参照

概念

WPF 部分信頼セキュリティ

WPF のセキュリティ方針 - プラットフォーム セキュリティ

WPF のセキュリティ方針 - セキュリティ エンジニアリング

コード アクセス セキュリティ

ClickOnce のセキュリティと配置

XAML の概要 (WPF)

その他の技術情報

patterns & practices アプリケーション セキュリティ ガイダンス インデックス