Windows Presentation Foundation のセキュリティ

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

WPF スタンドアロン アプリケーションは、Windows インストーラ (.msi)、DOS XCopy、または ClickOnce のいずれで配置されても、無制限のアクセス許可 (CAS FullTrust アクセス許可セット) で実行されます。

WPF ブラウザ ホスト アプリケーションは、Windows Internet Explorer によってホストされ、XAML ブラウザ アプリケーション (XBAP) にすることも、Loose Extensible Application Markup Language (XAML) にすることもできます (「Windows Presentation Foundation ブラウザによってホストされるアプリケーションの概要」を参照)。

WPF ブラウザ ホスト アプリケーションは、既定では部分信頼セキュリティ サンドボックスで実行され、既定の CAS インターネット アクセス許可セットに制限されます。これにより、一般的な Web アプリケーションが分離されるのと同じ方法で、WPF ブラウザ ホスト アプリケーションがクライアント マシンから効果的に分離されます。部分信頼セキュリティの詳細については、「Windows Presentation Foundation 部分信頼セキュリティ」を参照してください。

このトピックには次のセクションが含まれています。

  • 安全なナビゲーション
  • Internet Explorer のセキュリティ設定
  • 部分信頼クライアント アプリケーションに対する APTCA アセンブリの無効化
  • 外部 Loose XAML のサンドボックス化
  • 安全な WPF アプリケーションを開発するためのベスト プラクティス
  • 関連トピック

安全なナビゲーション

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

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

Navigation diagram

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

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

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

  • リソース ファイル - Resource というビルド タイプでプロジェクトに追加され、次のような URI で識別できるファイルです。

    pack://application:,,,/MyResourceFile.xaml
    
  • コンテンツ ファイル - Content というビルド タイプでプロジェクトに追加され、次のような URI で識別できるファイルです。

    pack://application:,,,/MyContentFile.xaml
    
  • 起点サイト ファイル - None というビルド タイプでプロジェクトに追加され、次のような URI で識別できるファイルです。

    pack://siteoforigin:,,,/MySiteOfOriginFile.xaml
    
  • アプリケーション コード ファイル - Page というビルド タイプでプロジェクトに追加され、次のような URI で識別できるファイルです。

    pack://application:,,,/MyResourceFile.xaml
    
メモメモ :

アプリケーション データ ファイルおよび pack URI の詳細については、「Windows Presentation Foundation のアプリケーション データ ファイル」を参照してください。

これらのコンテンツ タイプのファイルは、ユーザー ナビゲーションまたはプログラム ナビゲーションの結果として参照できます。

  • ユーザー ナビゲーション。ユーザーが Hyperlink 要素をクリックしてナビゲーションを開始します。

  • プログラム ナビゲーション。ユーザーとは無関係にアプリケーションがナビゲーションを開始します。

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

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

  • ユーザー ナビゲーション。ユーザーが Hyperlink 要素をクリックしてナビゲーションを開始します。

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

  • プロトコル。使用されるプロトコルが、http:https:file:mailto: のいずれかである。

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

Internet Explorer のセキュリティ設定

Internet Explorer は、Internet Explorer での実行が可能な機能を構成できる機構を備えています。これらの機能には、次のものがあります。

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

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

  • ダウンロード

  • スクリプト

  • ユーザー認証

特定の機能の実行の可否と実行方法は、セキュリティ設定によって決まります。セキュリティ設定は、特定の機能を完全に有効または無効にしたり、機能を実行しようとするたびにユーザーに確認を求めたりするように構成できます。

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

  1. Internet Explorer を起動します。

  2. [ツール] メニューの [インターネット オプション] をクリックし、[セキュリティ] タブをクリックします****。

  3. セキュリティ設定を構成するゾーンを選択します。

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

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

Security Settings dialog box

Windows Internet Explorer 7 には、特に .NET Framework 3.0 を対象にした次の 4 つのセキュリティ設定があります。

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

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

  • XPS ドキュメント。Internet Explorer 7 が XML Paper Specification (XPS) ドキュメントに移動して読み込むことができるかどうかを制御します。([有効]、[無効]、および [ダイアログを表示する] オプション)。

  • .NET Framework セットアップを有効にする。.NET Framework 3.0 を Internet Explorer 7 経由でインストールできるかどうかを制御します([有効] または [無効] オプションのみ)。

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

IE6 以下でのセキュリティ設定

Internet Explorer 以外の Internet Explorer の各バージョンでは、さまざまな .NET Framework 3.0 関連のセキュリティ設定は、レジストリの以下のキーの下で構成できます。

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。

XPSDocumentsDisallow

REG_DWORD

許可しない場合は 1、許可する場合は 0。

MediaAudioDisallow

REG_DWORD

許可しない場合は 1、許可する場合は 0。

MediaImageDisallow

REG_DWORD

許可しない場合は 1、許可する場合は 0。

MediaVideoDisallow

REG_DWORD

許可しない場合は 1、許可する場合は 0。

メモメモ :

これらの設定で、XBAPDisallowWebBrowserDisallow は Internet Explorer のすべてのバージョンで動作します。

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

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

ただし、APTCA アセンブリは、GAC にインストールされた後にセキュリティの欠陥を露呈する可能性があります。セキュリティの欠陥が発見された場合、アセンブリの発行者は、問題を解決するための修正プログラムと、問題が発見された後で発生する可能性のあるインストールに対する 2 つの保護を作成できます。修正プログラムの 1 つのオプションは、アセンブリをアンインストールすることですが、アンインストールにより、このアセンブリを使用する完全信頼クライアント アプリケーションが破損する恐れがあります。

WPF は、APTCA アセンブリをアンインストールせずに、XBAP を含む部分信頼 WPF アプリケーションに対して 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 3.0 アセンブリは、マネージ アプリケーションを実行するために必要であるため、この方法で無効にしても影響を受けません。APTCA アセンブリの無効化のサポートは、主として、サードパーティおよび非 .NET Framework 3.0 を対象としたものです。

外部 Loose XAML のサンドボックス化

Loose XAML ファイルは、パッケージ URI によって識別できないマークアップのみの .xaml ファイルです (「Windows Presentation Foundation におけるパッケージの URI」を参照)。つまり、リソース、コンテンツ、または起点サイト ファイルではありません (「Windows Presentation Foundation のアプリケーション データ ファイル」を参照)。

Internet Explorer から Loose XAML ファイルに直接移動するときは、既定のインターネット ゾーン アクセス許可セットでセキュリティ サンドボックス化されます。

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

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

[xaml]

<!-- Sandboxing external content using Frame -->
<Frame 
    NavigateUri="ExternalContentPage.xaml" 
    SandboxExternalContent="True">
</Frame>
<!-- Sandboxing external content using NavigationWindow-->
<NavigationWindow
    Source="ExternalContentPage.xaml" 
    SandboxExternalContent="True">
</NavigationWindow>

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

安全な WPF アプリケーションを開発するためのベスト プラクティス

セキュリティで保護された WPF のアプリケーションを作成するには、以下に対するベスト プラクティスを適用する必要があります。

参照

概念

Windows Presentation Foundation 部分信頼セキュリティ
Windows Presentation Foundation のセキュリティ方針 - プラットフォーム セキュリティ
Windows Presentation Foundation のセキュリティ方針 - セキュリティ エンジニアリング
XAML の概要

その他の技術情報

Patterns and Practices Security Guidance for Applications
Securing Applications
ClickOnce の配置の概要