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

まとめ

Application Verifier (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() 呼び出しの後にネットワーク API が呼び出された場合です。 詳細については、「アプリケーション検証ツール - アプリケーション検証ツール内のテスト」を参照してください。

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

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

Webservices - 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 を使用して、潜在的なセキュリティの脆弱性を特定できます。

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

セクショントピック

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

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

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

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

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

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

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