アプリケーション検証ツール - 概要

まとめ

アプリケーション検証ツール (AppVerifier) は、アンマネージド コード用のランタイム検証ツールであり、通常のアプリケーション テスト手法では識別が困難な、わずかなプログラミング エラー、セキュリティの問題、制限ユーザー アカウントの特権の問題を見つけるのに役立ちます。

概要

プログラマ、ソフトウェア アーキテクト、テスト担当者、およびセキュリティ コンサルタントが直面する最大の課題の 1 つは、運用環境にデプロイされたときのアプリケーションの可変実行パスを理解することです。 ソース コードにアクセスする場合でも、さまざまな依存関係 (たとえば、コードに貢献する複数のグループや外部コンポーネントを利用するグループ) により、実行中に発生するすべてのものを把握することは困難です。 Microsoft AppVerifier は、この複雑さとバグの潜在的な副作用を管理するのに役立つ役割を果たすことができます。 AppVerifier は、一般的なテスト パス中に識別が困難なプログラミング エラー、セキュリティの問題、およびユーザー アカウント特権の問題を見つけるのに役立ちます。

アプリケーション検証ツール (AppVerif.exe) は、ユーザー モード アプリケーション用の 動的検証 ツールです。 このツールは、アプリケーションの実行中にアプリケーションアクションを監視し、アプリケーションにさまざまなストレスとテストを適用し、アプリケーションの実行または設計における潜在的なエラーに関するレポートを生成します。

アプリケーション検証ツールは、ユーザー モード ドライバーを含むマネージド コードに基づいていないユーザー モード アプリケーションでエラーを検出できます。 標準的なアプリケーション テストまたはドライバー のテスト中に検出するのが難しい可能性がある微妙なプログラミング エラーが見つかります。

アプリケーション検証ツールは、単独で使用することも、ユーザー モード デバッガーと組み合わせて使用することもできます。 現在のユーザーは、コンピューターの Administrators グループのメンバーとしてログオンする必要があります。

AppVerifier のインストール

アプリケーション検証ツールは、 Windows ソフトウェア開発キット (SDK) に含まれています。 アプリケーション検証ツールをインストールするには、SDK のインストール中にボックスをチェックします。

Screenshot of Application Verifier main menu with a single test app selected and tests listed on the right side.

AppVerifier とは

AppVerifier は、メモリの破損、重大なセキュリティの脆弱性、および制限されたユーザー アカウント特権の問題を検出してデバッグできるように設計されたツールです。 AppVerifier は、アプリケーションと Microsoft Windows オペレーティング システムとの対話を監視し、オブジェクト、レジストリ、ファイル システム、Win32 API (ヒープ、ハンドル、ロックを含む) の使用をプロファイリングすることで、信頼性の高いセキュリティで保護されたアプリケーションの作成を支援します。 AppVerifier には、管理者以外の環境でのアプリケーションのパフォーマンスを予測するチェックも含まれています。

AppVerifier は、ソフトウェア開発ライフサイクル全体を通じて使用すると、問題を早期に特定し、修正が容易で安価な場合に、開発作業にコスト上のメリットをもたらすことができます。 また、気付かれていない可能性のあるエラーを検出し、最終的なアプリケーションを制限付き (管理者以外の環境など) で実行できるようにします。

AppVerifier で識別される問題

AppVerifier は、次の判断に役立ちます。

アプリケーションが API を正しく使用している場合:

  • Unsafe TerminateThread API。
  • スレッド ローカル ストレージ (TLS) API の正しい使用。
  • 仮想空間操作の正しい使用 (VirtualAlloc、MapViewOfFile など)。
  • 構造化例外処理を使用して、アプリケーションがアクセス違反を非表示にしているかどうか。
  • アプリケーションが無効なハンドルを使用しようとしているかどうか。
  • ヒープにメモリの破損や問題があるかどうか。
  • リソースが少ない場合にアプリケーションがメモリ不足になるかどうか。
  • 重要なセクションの正しい使用が行われているかどうか。
  • 管理環境で実行されているアプリケーションが、特権の少ない環境で適切に実行されるかどうか。
  • アプリケーションが制限付きユーザーとして実行されているときに潜在的な問題があるかどうか。
  • スレッドのコンテキストで将来の関数呼び出しに初期化されていない変数があるかどうか。

AppVerifier テスト

AppVerifier は、"検証レイヤー" と呼ばれる一連のテストで構成されます。これらは、テスト対象のアプリケーションごとにオンまたはオフにすることができます。 テスト領域内で検証レイヤーを展開すると、特定のテストが表示されます。 アプリケーションのテストを有効にするには、その横にある チェック ボックスを選択します。 [基本] など、検証レイヤー全体をオンにするには、最上位の [チェック] ボックスを選択します。

AppVerifier で実行できるテストには、13 種類あります。

基本 - 少なくとも、[基本] 設定を選択した状態でアプリケーション検証ツールを実行する必要があります。 これらはそれぞれ、クラッシュやその他の否定的なシナリオを引き起こす領域をテストし、カスタマー エクスペリエンスに直接的かつ重大な影響を与えます。 詳細については、「アプリケーション検証ツール - アプリケーション検証ツール内のテスト」を参照してください 。

互換性 - 互換性検証レイヤー テストは、Microsoft Windows オペレーティング システムに問題がある可能性があるアプリケーションを特定するのに役立ちます。 これらのチェックの多くは、ロゴ要件のテストにも使用できます。 詳細については、「アプリケーション検証ツール - アプリケーション検証ツール内のテスト」を参照してください 。

Cuzz - コンカレンシー ファジー (Cuzz) 検証レイヤーは、コンカレンシーのバグとデータ競合状態を検出します。 Cuzz は、アプリケーションのコード内の重要なポイントにランダムな遅延を挿入することで、スレッド のスケジューリングを調整します。 詳細については、「アプリケーション検証ツール - アプリケーション検証ツール内のテスト」を参照してください 。

低リソース シミュレーション - 低リソース シミュレーションでは、メモリ不足などのリソースが少ない環境をシミュレートしようとします。 このシミュレーションでは、メモリ不足状態で発生するバグを特定します。 これは、フォールト インジェクションとも呼ばれます。詳細については、「アプリケーション検証ツール - アプリケーション検証ツール内のテスト」を参照してください 。

LuaPriv - 制限付きユーザー アカウント特権予測 (LuaPriv) テストは、予測と診断の両方で、管理特権を持つアプリケーションの実行に関連する問題と、そのアプリケーションが (通常のユーザーとして) 低い特権で実行された場合に同様に機能するかどうかを示します。詳細については、「アプリケーション検証ツール - アプリケーション検証ツール内のテスト」を参照してください 。

その他 - その他は、安全でないアクションを実行する危険な API など、さまざまなテストのテストで構成されます。 詳細については、「アプリケーション検証ツール - アプリケーション検証ツール内のテスト」を参照してください 。

ネットワーク - ネットワーク テストは、WinSock API の不適切な使用を探します。 たとえば、WSAStartup() が成功する前、または分散が成功した WSACleanup() 呼び出しの後にネットワーク API が呼び出された場合です。 詳細については、「アプリケーション検証ツール - アプリケーション検証ツール内のテスト」を参照してください 。

NTLM - プロトコルの使用を検出するために、認証 API AcquireCredentialsHandle と InitializeSecurityContext の使用を監視します。 NTLM は古い認証プロトコルであり、アプリケーションとオペレーティング システムのセキュリティを侵害する可能性がある欠陥があります。 詳細については、「アプリケーション検証ツール - アプリケーション検証ツール内のテスト」を参照してください 。

印刷 - 印刷検証ツールは、アプリケーションが印刷サブシステムを呼び出すときに発生する可能性のある問題の検出とトラブルシューティングに役立ちます。 印刷検証ツールは、印刷サブシステムの 2 つのレイヤーである PrintAPI レイヤーと PrintDriver レイヤーを対象としています。 詳細については、「アプリケーション検証ツール - アプリケーション検証ツール内のテスト」を参照してください 。

Web サービス - Windows Webservices API (WWSAPI) 検証レイヤーは、WWSAPI を適切に使用するためにチェックします。たとえば、無効な組み込みの WWSAPI オブジェクトを参照する WWSAPI や、既に使用されているシングル スレッド オブジェクトへの参照を使用して呼び出される WWSAPI などです。 詳細については、「アプリケーション検証ツール - アプリケーション検証ツール内のテスト」を参照してください 。

サービス - サービスは、Windows サービスを適切に使用するためにチェックテストします。 たとえば、サービスが正常に開始および停止されている場合などです。 これらのテストによって生成される停止コードの例外については、「アプリケーション検証ツール - 停止コードと定義」を参照してください。

Perf - Perf テストチェック、不適切な待機時間を使用する Windows 関数の呼び出しなど、システムのパフォーマンスとエネルギー消費量に影響を与える API を効率的に使用します。 これらのテストによって生成される停止コードの例外については、「アプリケーション検証ツール - 停止コードと定義」を参照してください。

Hangs - Hangs は、DllMain スレッドがブロックされた別のスレッドを待機している場合などに、システムが応答しなくなる API の使用をテストします。 これらのテストによって生成される停止コードの例外については、「アプリケーション検証ツール - 停止コードと定義」を参照してください。

AppVerifier のしくみ

AppVerifier は、アンマネージ DLL メソッド テーブルを変更して、実際の関数が実行される前に必要なチェックが実行されるようにします (これは "関数フック" とも呼ばれます)。 たとえば、Win32 API CreateFileA メソッドのアドレスは、一連のテストをトリガーする内部 AppVerifier メソッドに置き換えられ、正の場合にログに記録されます。

新しいプロセスが開始されると、AppVerifier のメソッド テーブル フック手法の使用は、特定のレジストリ キーで作成されたエントリによって制御されます。 レジストリ エントリが存在する場合、AppVerifier DLL は新しく作成されたプロセスに読み込まれます。これにより、存在する DLL とその後に読み込まれた DLL のメソッド テーブルの置換が処理されます。 これらのフックは DLL の読み込み時に行われるため、既に実行されているプロセスで AppVerifier を使用することはできません。

AppVerifier ユーザー インターフェイス (UI) は、レジストリ キーの設定を制御し、既存のログに関する情報を提供するために使用されます。 UI 内でアプリケーションとテストを設定し、[保存] ボタンをクリックすると、レジストリ設定が行われます。 その後、アプリケーションを再起動する必要があります。これにより、監視が開始されます。 アプリケーションが AppVerifier から削除されるまで、設定は保持されることに注意してください。

問題が特定されると、検証ツールの停止が発生します。 指定された数は、その発生の正確な性質と理由を識別するために使用されます。

ソフトウェア開発ライフサイクルでのアプリケーション検証ツールの使用

ソフトウェア開発ライフサイクル全体でアプリケーション検証ツールを使用する必要があります。

要件フェーズ - AppVerifier を計画し、実行とフォローアップのために時間を割り当てる必要があります。

設計フェーズ - アプリケーション検証ツールの使用を計画し、テストするコンポーネント (モジュール、DLL、または EXEs) を定義します。

実装フェーズ - 開発中のさまざまなコンポーネントの安定したビルド (アルファから RTM) でアプリケーション検証ツールを実行します (コンポーネントを個別にまとめてテストすることが重要です)。

検証フェーズ - テスト担当者は、アプリケーション検証ツールを使用してすべてのテスト (手動と自動の両方) を実行する必要があります。これは、アプリケーションが初めて制限にプッシュされ、予期しない動作とデータが送信されるためです。 AppVerifier は、実際の (または潜在的な) 攻撃/悪用ベクトルを迅速に列挙できるため、監査 (ブラック ボックスとホワイト ボックス) を行うセキュリティ コンサルタント向けの強力なツールでもあります。

リリース フェーズ - クライアントとセキュリティ コンサルタントは、リリースされたバイナリで AppVerifier を使用して、潜在的なセキュリティの脆弱性を特定できます。

サポートとサービス フェーズ - アプリケーション検証ツールを使用して、コードの変更 (更新プログラム、サービス パックなど) に回帰が発生しないようにします。

セクション トピック

このセクションでは、次のトピックを扱います。

アプリケーション検証ツール - 機能

アプリケーション検証ツール - アプリケーションのテスト

アプリケーション検証ツール - アプリケーション検証ツール内のテスト

アプリケーション検証ツール - 停止コードと定義

アプリケーション検証ツール - アプリケーション検証ツール停止のデバッグ

アプリケーション検証ツール - よく寄せられる質問