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

まとめ

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

概要

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

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

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

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

AppVerifier のインストール

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

application verifier main menu default landing page showing a single test app selected with tests listed on the right side

AppVerifier とは

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

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

AppVerifier によって識別される問題

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

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

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

AppVerifier テスト

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

AppVerifier のしくみ

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

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

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

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

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

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

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

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

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

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

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

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

セクショントピック

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

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

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

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

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

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

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