Windows フォームのセキュリティに関するその他の考慮事項

.NET Framework セキュリティ設定によっては、ローカル コンピューターとは異なり、アプリケーションが部分信頼環境で実行されることがあります。 .NET Framework は、ファイル システム、ネットワーク、アンマネージ API などの重要なローカル リソースへのアクセスを他のリソースの場合よりも制限します。 セキュリティ設定により、セキュリティ システムが検証できない Microsoft Windows API やその他の API を呼び出す機能が影響を受けます。 また、ファイルやデータへのアクセス、印刷など、アプリケーションのその他の処理にも影響があります。 部分信頼環境でのファイルやデータへのアクセスの詳細については、「Windows フォームにおけるファイルおよびデータへのより安全なアクセス」を参照してください。 部分信頼環境での印刷の詳細については、「Windows フォームでのより安全な印刷」を参照してください。

以下のセクションでは、クリップボードの使用、ウィンドウ操作の実行、および部分信頼環境で動作しているアプリケーションからの Windows API の呼び出しについて説明しています。

クリップボードへのアクセス

UIPermission クラスによってクリップボードへのアクセスが制御されます。関連する UIPermissionClipboard 列挙値によってアクセスのレベルが指定されます。 使用されるアクセス許可レベルを次の表に示します。

UIPermissionClipboard の値 説明
AllClipboard クリップボードは制限なしに使用できます。
OwnClipboard クリップボードは制限付きで使用できます。 クリップボードにデータを格納する機能 ([コピー] または [切り取り] のコマンド操作) は制限されません。 テキスト ボックスなど、[貼り付け] を受け入れる固有のコントロールは、クリップボードのデータを受け入れます。しかし、ユーザー コントロールはプログラムでクリップボードからデータを読み取ることができません。
NoClipboard クリップボードは使用できません。

既定では、ローカル イントラネット ゾーンは AllClipboard アクセス、インターネット ゾーンは OwnClipboard アクセスです。 つまり、アプリケーションはクリップボードにデータをコピーできますが、プログラムでクリップボードに貼り付けたりクリップボードから読み取ったりはできません。 これらの制限により、完全に信頼されていないプログラムは、他のアプリケーションによってクリップボードにコピーされた内容を読み取ることができません。 アプリケーションがクリップボードへの完全なアクセスを必要とするにもかかわらず、アクセス許可がない場合は、アプリケーションに対するアクセス許可を昇格する必要があります。 アクセス許可の昇格の詳細については、「一般的なセキュリティ ポリシー管理」を参照してください。

ウィンドウ操作

また、UIPermission クラスによって、ウィンドウ操作や他の UI 関連操作を実行するアクセス許可も制御されます。関連する UIPermissionWindow 列挙値によってアクセスのレベルが指定されます。 使用されるアクセス許可レベルを次の表に示します。

既定では、ローカル イントラネット ゾーンは AllWindows アクセス、インターネット ゾーンは SafeTopLevelWindows アクセスです。 つまり、[インターネット] ゾーンでは、アプリケーションがほとんどのウィンドウ操作および UI 関連処理を実行できますが、ウィンドウの外観が変更されます。 変更されたウィンドウには、最初の実行時にバルーン通知が表示され、変更されたタイトル バー テキストが表示され、タイトル バーに閉じるボタンが必要になります。 バルーン通知とタイトル バーは、アプリケーションのユーザーに、アプリケーションが部分信頼で動作していることを示します。

UIPermissionWindow の値 説明
AllWindows ユーザーは、すべてのウィンドウとユーザー入力イベントを無制限に使用できます。
SafeTopLevelWindows ユーザーは、セーフ トップレベル ウィンドウとセーフ サブウィンドウだけを描画に使用でき、それらのセーフ トップレベル ウィンドウとセーフ サブウィンドウの中のユーザー インターフェイスに対するユーザー入力イベントだけを使用できます。 これらのセーフ ウィンドウには明確なラベルが付けられ、最小サイズと最大サイズに制限があります。 これらの制限により、システム ログオン画面やシステム デスクトップの偽装など、有害の可能性がある、なりすまし攻撃が防止されます。また、親ウィンドウ、フォーカス関連の API、および ToolTip コントロールの使用に対して、プログラムによるアクセスが制限されます。
SafeSubWindows ユーザーは、セーフ サブウィンドウだけを描画に使用でき、そのセーフ サブウィンドウの中のユーザー インターフェイスに対するユーザー入力イベントだけを使用できます。 ブラウザー内に表示されるコントロールは、セーフ サブウィンドウの一例です。
NoWindows ユーザーは、ウィンドウおよびユーザー インターフェイス イベントを使用できません。 ユーザー インターフェイスは使用できません。

UIPermissionWindow 列挙値によって示される各アクセス許可レベルでは、レベルが下がるにつれて許可される処理が少なくなります。 次の表は、SafeTopLevelWindows および SafeSubWindows の値によって制限されるアクションを示しています。 各メンバーに対して必要なアクセス許可については、.NET Framework クラス ライブラリのドキュメントで該当するメンバーのトピックを参照してください。

SafeTopLevelWindows アクセス許可によって、次の表に示すアクションが制限されます。

コンポーネント 制限される処理
Application - SafeTopLevelCaptionFormat プロパティの設定。
Control - Parent プロパティの取得
- Region プロパティの設定。
- FindFormFocusFromChildHandle および FromHandlePreProcessMessageReflectMessage、または SetTopLevel メソッドの呼び出し
- GetChildAtPoint メソッドの呼び出し (返されるコントロールが呼び出し元コントロールの子でない場合)。
- コンテナー コントロール内でのコントロール フォーカスの変更。
Cursor - Clip プロパティの設定。
- Hide メソッドの呼び出し。
DataGrid - ProcessTabKey メソッドの呼び出し。
Form - ActiveForm または MdiParent プロパティの取得。
- ControlBoxShowInTaskbar、または TopMost プロパティの設定。
- Opacity プロパティの設定 (50% 未満)。
- プログラムによる WindowState プロパティの Minimized への設定。
- Activate メソッドの呼び出し。
- NoneFixedToolWindow、および SizableToolWindowFormBorderStyle 列挙値の使用。
NotifyIcon - NotifyIcon コンポーネントの使用は完全に禁止されています。

SafeTopLevelWindows 値による制約に加え、SafeSubWindows 値によって、次の表に示されるアクションが制限されます。

コンポーネント 制限される処理
CommonDialog - CommonDialog クラスから派生したダイアログ ボックスの表示。
Control - CreateGraphics メソッドの呼び出し。
- Cursor プロパティの設定。
Cursor - Current プロパティの設定。
MessageBox - Show メソッドの呼び出し。

サードパーティ コントロールのホスト

フォームでサードパーティ コントロールをホストしている場合、他の種類のウィンドウ操作が発生する可能性があります。 サードパーティ コントロールとは、自分で開発およびコンパイルを行っていないカスタムの UserControl です。 ホスト シナリオを攻略するのは困難ですが、理論上、サードパーティ コントロールが描画サーフェイスを拡張して、フォームの領域全体を対象にする可能性があります。 このようなコントロールは、重要なダイアログ ボックスを模倣し、ユーザーのユーザー名/パスワードの組み合わせや銀行口座番号などの情報を要求する可能性があります。

このような考えられるリスクを制限するために、信頼できる販売元のサードパーティ コントロールのみを使用します。 確認できないソースからサードパーティ コントロールをダウンロードした場合、攻略行為が実行されないかソース コードを確認することをお勧めします。 ソースに悪意がないことを検証してから、アセンブリを自分でコンパイルし、ソースがアセンブリと一致することを確認します。

Windows API の呼び出し

アプリケーションのデザインで Windows API から関数を呼び出す必要がある場合は、アンマネージ コードにアクセスします。 この場合、Windows API の呼び出しまたは値を使用するときに、ウィンドウまたはオペレーティング システムに対するコードの動作が決定できません。 SecurityPermission クラスおよび SecurityPermissionFlag 列挙型の UnmanagedCode 値によって、アンマネージド コードへのアクセスが制限されます。 アプリケーションは、UnmanagedCode アクセス許可が付与されている場合にのみ、アンマネージド コードにアクセスできます。 既定では、ローカルで実行されているアプリケーションだけがアンマネージ コードを呼び出すことができます。

一部の Windows フォーム メンバーによって、UnmanagedCode アクセス許可を必要とするアンマネージド アクセスが提供されます。 アクセス許可を必要とする System.Windows.Forms 名前空間のメンバーを次の表に示します。 メンバーに対して必要なアクセス許可の詳細については、.NET Framework クラス ライブラリのドキュメントを参照してください。

コンポーネント メンバー
Application - AddMessageFilter メソッド
- CurrentInputLanguage プロパティ
- Exit メソッド
- ExitThread メソッド
- ThreadException イベント
CommonDialog - HookProc メソッド
- OwnerWndProc\ メソッド
- Reset メソッド
- RunDialog メソッド
Control - CreateParams メソッド
- DefWndProc メソッド
- DestroyHandle メソッド
- WndProc メソッド
Help - ShowHelp メソッド
- ShowHelpIndex メソッド
NativeWindow - NativeWindow クラス
Screen - FromHandle メソッド
SendKeys - Send メソッド
- SendWait メソッド

アプリケーションがアンマネージド コードを呼び出すアクセス許可を持っていない場合、UnmanagedCode アクセス許可を要求するか、別の方法で機能を実装することを考慮する必要があります。多くの場合、Windows フォームでは代わりに Windows API 関数のマネージド コードを提供します。 代わりの手段がなく、アプリケーションがアンマネージ コードにアクセスする必要がある場合は、アプリケーションに対するアクセス許可を昇格する必要があります。

アンマネージ コードを呼び出すアクセス許可を与えられたアプリケーションは、ほとんどの処理を実行できます。 そのため、アンマネージ コードを呼び出すアクセス許可は、信頼されたソースからのアプリケーションに対してだけ与えるようにしてください。 また、アプリケーションによっては、アンマネージ コードの呼び出しを生成するアプリケーション機能の一部をオプションにするか、完全に信頼された環境でのみ有効にすることもできます。 危険なアクセス許可の詳細については、「危険なアクセス許可とポリシー管理」を参照してください。 アクセス許可の昇格の詳細については、「一般的なセキュリティ ポリシー管理」を参照してください。

関連項目