次の方法で共有


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

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

AppVerifier の概要

プログラマ、ソフトウェア アーキテクト、テスト担当者、およびセキュリティ コンサルタントにとって最も重要な課題の 1 つは、運用環境にデプロイされるアプリケーションの可変実行パスを理解することです。 ソース コードにアクセスする場合でも、実行中に発生する可能性のあるすべてを把握することは困難な場合があります。 コードに貢献する複数のグループや外部コンポーネントの実行など、さまざまな依存関係により、トラブルシューティングの複雑さが増す可能性があります。

AppVerifier (AppVerif.exe) is a dynamic verification tool for user-mode applications. ユーザー モード ドライバーなど、マネージド コードに基づいていないユーザー モード アプリケーションでエラーを検出できます。 このツールは、アプリケーションの実行中にアプリケーションアクションを監視します。 アプリケーションをさまざまなストレスやテストに適用し、アプリケーションの実行または設計における潜在的なエラーに関するレポートを生成します。

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

AppVerifier のインストールと要件

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

1 つのテスト アプリが選択され、右側にテストが一覧表示されている [アプリケーション検証ツール] メイン メニューのスクリーンショット。

AppVerifier を使用するには、次の条件と要件を確認します。

  • AppVerifier は単独で使用することも、ユーザー モード デバッガーと共に使用することもできます。

  • 現在のユーザーは、コンピューターの Administrators グループのメンバーとしてログオンする必要があります。

  • AppVerifier では、ARM64ECはサポートされていません。

AppVerifier で確認できるデータ

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

AppVerifier で調査できる問題

AppVerifier は、アプリケーションが API を正しく使用しているタイミングを判断するのに役立ちます。 このツールでは、アプリケーションで次の問題を確認できます。

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

AppVerifier で実行できるテスト

AppVerifier は、"検証レイヤー" と呼ばれる一連のテストで構成されます。レイヤーは、確認するアプリケーションごとにオンまたはオフにすることができます。

  • 特定のテストを表示するには、セット内の検証レイヤーを展開します。

  • アプリケーションのテストを有効にするには、テストのチェック ボックスをオンにします。

  • To turn on all the tests in a verification layer, such as Basics, select the checkbox at the top level.

次の表に、AppVerifier で実行できる 13 のテストの種類を示し、詳細については記事へのリンクを示します。

Test type Description More information
Basics At a minimum, you should run Application Verifier with the Basics setting selected. 各基本テストでは、クラッシュや、カスタマー エクスペリエンスに直接的かつ大きな影響を与えるその他の否定的なシナリオを引き起こす可能性のある領域を確認します。 アプリケーション検証ツール - アプリケーション検証ツール内のテスト (基本)
Compatibility 互換性検証レイヤー テストは、Microsoft Windows オペレーティング システムに問題がある可能性があるアプリケーションを特定するのに役立ちます。 これらのチェックの多くは、ロゴ要件のテストにも使用できます。 アプリケーション検証ツール - アプリケーション検証ツール内のテスト (互換性)
Cuzz コンカレンシー ファジー (Cuzz) 検証レイヤーは、コンカレンシーのバグとデータ競合状態を検出します。 Cuzz は、アプリケーション コードの重要なポイントにランダムな遅延を挿入することで、スレッドのスケジュールを調整します。 アプリケーション検証ツール - アプリケーション検証ツール (Cuzz) 内のテスト
低リソース シミュレーション リソースが少ないシミュレーションでは、メモリ不足などのリソースが少ない環境をシミュレートしようとします。 このシミュレーションでは、メモリ不足状態で発生するバグを特定します。 This test is also referred to as Fault Injection. アプリケーション検証ツール - アプリケーション検証ツール内のテスト (低リソース シミュレーション)
LuaPriv 制限付きユーザー アカウント特権予測 (LuaPriv) テストは予測と診断の両方であり、管理特権を持つアプリケーションの実行に関連する問題を解決するために機能します。 また、このテストでは、特権を制限してアプリを実行した場合にアプリケーションが機能するかどうかも明らかにされます (通常は、一般ユーザーとして)。 アプリケーション検証ツール - アプリケーション検証ツール (LuaPriv) 内のテスト
Miscellaneous その他のテストでは、安全でないアクションを実行する危険な API の検出など、さまざまな条件がチェックされます。 アプリケーション検証ツール - アプリケーション検証ツール内のテスト (その他)
Networking ネットワーク テストは、WinSock API の不適切な使用を探します。 たとえば、 WSAStartup() メソッドの正常な呼び出しの前、または WSACleanup() メソッドの正常な呼び出しの分散後に Networking API が呼び出された場合です。 アプリケーション検証ツール - アプリケーション検証ツール内のテスト (ネットワーク)
NTLM NT LAN Manager (NTLM) プロトコルの使用を検出するために、認証 API AcquireCredentialsHandle および InitializeSecurityContext の使用を監視します。 NTLM は古い認証プロトコルであり、アプリケーションとオペレーティング システムのセキュリティを侵害する可能性がある欠陥があります。 アプリケーション検証ツール - アプリケーション検証ツール (NTLM) 内のテスト
Printing 印刷検証ツールは、アプリケーションが印刷サブシステムを呼び出したときに発生する可能性がある問題を見つけてトラブルシューティングするのに役立ちます。 印刷検証ツールは、印刷サブシステムの 2 つのレイヤーである PrintAPI レイヤーと PrintDriver レイヤーを対象としています。 アプリケーション検証ツール - アプリケーション検証ツール内のテスト (印刷)
Webservices Windows Webservices API (WWSAPI) 検証レイヤーは、無効な組み込み WWSAPI オブジェクトを参照する WWSAPI 呼び出しや、既に使用されているシングルスレッド オブジェクトへの参照を使用した WWSAPI 呼び出しなど、WWSAPI の適切な使用をチェックします。 アプリケーション検証ツール - アプリケーション検証ツール (WebServices) 内のテスト
Services サービス テストでは、Windows サービスの適切な使用が確認されます。 たとえば、テストでは、サービスが正常に開始および停止するかどうかを確認します。 アプリケーション検証ツール - 停止コード - サービス
Perf Perf テストでは、不適切な待機時間を使用する Windows 関数の呼び出しなど、システムのパフォーマンスとエネルギー消費量に影響する API の効率的な使用を確認します。 アプリケーション検証ツール - 停止コード - パフォーマンス
Hangs Hangs テストは、システムが応答しなくなる原因となる API の使用をチェックします。 たとえば、DllMain スレッドがブロックされている別のスレッドを待機している場合などです。 アプリケーション検証ツール - 停止コード - ハング

AppVerifier のしくみ

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

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

AppVerifier ユーザー インターフェイス (UI) は、レジストリ キーの設定を制御し、既存のログに関する情報を提供するために使用されます。 After the application and tests are set within the UI and you select Save, the Registry settings are configured. 次に、監視を開始するアプリケーションを再起動します。 この設定は、アプリケーションが AppVerifier から削除されるまで保持されます。

When AppVerifier identifies a problem, a verifier stop occurs. このツールには、実行の停止の正確な性質と理由を識別する数値が用意されています。

AppVerifier とソフトウェア開発ライフサイクル

ソフトウェア開発ライフサイクル全体でアプリケーション検証ツールを使用することをお勧めします。 いくつかの推奨事項を次に示します。

  • Requirements Phase: Plan to use AppVerifier to help determine app requirements. ツールを実行し、特定された問題をフォローアップするための時間を割り当てます。

  • Design Phase: Plan to use AppVerifier as you design your app. テストするコンポーネント (モジュール、DLL、または EXEs) を定義します。

  • Implementation Phase: Run AppVerifier on stable builds (from Alpha to RTM) of the different components under development. コンポーネントを個別にまとめてテストします。

  • Verification Phase: Test engineers should run all tests (both manual and automatic) with AppVerifier for the initial verification. サイクル内のこのフェーズは、アプリが初めて制限にプッシュされます。 予期しない動作とデータは、一般的に初期検証中に検出されます。 AppVerifier は、監査 (ブラック ボックスとホワイト ボックス) を実行するセキュリティ コンサルタント向けの強力なツールでもあります。 このツールを使用すると、実際の (または潜在的な) 攻撃/悪用ベクトルをすばやく列挙できます。

  • Release Phase: Clients and security consultants can use AppVerifier on the released binaries to identify potential security vulnerabilities.

  • サポートとサービスフェーズ: AppVerifier を使用して、更新プログラムやサービス パックなどのコード変更で回帰が発生しないようにします。

このセクションには、次のものが含まれます。