应用程序验证程序 - 概述

摘要

应用程序验证程序 (AppVerifier) 是一种适用于非托管代码的运行时验证工具,可帮助查找难以通过普通应用程序测试技术识别的细微编程错误、安全问题和有限的用户帐户特权问题。

概述

程序员、软件架构师、测试人员和安全顾问面临的最大挑战之一是了解部署到生产环境时应用程序的可变执行路径。 例如,即使访问源代码,也很难掌握执行期间由于各种依赖项 (而发生的所有内容。参与代码或利用外部组件的多个组) 。 Microsoft AppVerifier 在帮助管理这种复杂性和 bug 的潜在副作用方面可以发挥有用的作用。 AppVerifier 可帮助查找在典型测试通过期间难以识别的编程错误、安全问题和用户帐户特权问题。

应用程序验证程序 (AppVerif.exe) 是用户模式应用程序的 动态验证 工具。 此工具在应用程序运行时监视应用程序操作,使应用程序受到各种压力和测试,并生成有关应用程序执行或设计中潜在错误的报告。

应用程序验证程序可以检测任何不基于托管代码的用户模式应用程序中的错误,包括用户模式驱动程序。 它发现在标准应用程序测试或驱动程序测试期间可能难以检测到的细微编程错误。

可以单独使用应用程序验证程序,也可以与用户模式调试器结合使用。 当前用户必须是计算机上的管理员组的成员。

安装 AppVerifier

应用程序验证程序包含在 Windows 软件开发工具包 (SDK) 中。 若要安装应用程序验证程序,请在 SDK 安装过程中检查其框。

应用程序验证程序main菜单的屏幕截图,其中选择了单个测试应用并在右侧列出测试。

什么是 AppVerifier?

AppVerifier 是一种工具,旨在检测并帮助调试内存损坏、严重安全漏洞和受限用户帐户特权问题。 AppVerifier 通过监视应用程序与 Microsoft Windows 操作系统的交互,分析其对象、注册表、文件系统和 Win32 API ((包括堆、句柄和锁) )的使用,从而帮助创建可靠且安全的应用程序。 AppVerifier 还包括用于预测应用程序在非管理环境中性能的检查。

当在整个软件开发生命周期中使用时,AppVerifier 可以为开发工作带来成本效益,因为它有助于在问题更容易且成本更低的情况下尽早识别问题。 它还有助于检测可能被忽略的错误,并确保最终应用程序可以在受限 (例如非管理员) 环境中执行。

AppVerifier 识别的问题

AppVerifier 可帮助确定:

当应用程序正确使用 API 时:

  • 不安全的 TerminateThread API。
  • 正确使用线程本地存储 (TLS) API。
  • 正确使用虚拟空间操作 (例如 VirtualAlloc、MapViewOfFile) 。
  • 应用程序是否使用结构化异常处理隐藏访问冲突。
  • 应用程序是否尝试使用无效句柄。
  • 堆中是否存在内存损坏或问题。
  • 在资源不足的情况下,应用程序是否耗尽了内存。
  • 是否正确使用了关键部分。
  • 在管理环境中运行的应用程序是否在特权较低的环境中运行良好。
  • 当应用程序以受限用户身份运行时是否存在潜在问题。
  • 线程上下文中将来的函数调用中是否存在未初始化的变量。

AppVerifier 测试

AppVerifier 由称为“验证层”的测试集组成。对于要测试的每个应用程序,可以打开或关闭这些应用程序。 通过扩展测试区域内的验证层,将显示特定的测试。 若要为应用程序启用测试,请选择它旁边的检查框。 若要打开整个验证层(例如“基本信息”),请选择顶层的“检查”框。

AppVerifier 可以执行 13 种不同类型的测试。

基本信息 - 至少应在选择“基本信息”设置的情况下运行应用程序验证程序。 其中每个都会测试导致崩溃或其他负面情况的区域,这些情况对客户体验有直接和重大影响。 有关详细信息,请参阅 应用程序验证程序 - 应用程序验证程序中的测试

兼容性 - 兼容性验证层测试有助于识别可能存在 Microsoft Windows 操作系统问题的应用程序。 其中许多检查还可用于测试徽标要求。 有关详细信息,请参阅 应用程序验证程序 - 应用程序验证程序中的测试

Cuzz - 并发模糊 (Cuzz) 验证层检测并发 bug 和数据争用条件。 Cuzz 通过在应用程序代码的关键点注入随机延迟来调整线程计划。 有关详细信息,请参阅 应用程序验证程序 - 应用程序验证程序中的测试

低资源模拟 - 低资源模拟尝试模拟资源不足(例如内存不足)下的环境。 此模拟将识别在内存不足的情况下发生的 bug。 这也称为故障注入。有关详细信息,请参阅 应用程序验证程序 - 应用程序验证程序中的测试

LuaPriv - 受限用户帐户特权预测器 (LuaPriv) 测试是预测和诊断工作,用于发现与使用管理特权运行应用程序相关的问题,以及通常以较低特权 (运行该应用程序是否正常工作,就像普通用户) 一样。有关详细信息,请参阅 应用程序验证程序 - 应用程序验证程序中的测试

杂项 - 杂项包括针对各种测试的测试,例如执行不安全操作的危险 API 的测试。 有关详细信息,请参阅 应用程序验证程序 - 应用程序验证程序中的测试

网络 - 网络测试查找 WinSock API 的使用不当。 例如,如果网络 API 在 WSAStartup () 成功调用之前调用,或者在成功调用 WSACleanup () 之后调用。 有关详细信息,请参阅 应用程序验证程序 - 应用程序验证程序中的测试

NTLM - 监视身份验证 API AcquireCredentialsHandle 和 InitializeSecurityContext 的使用,以检测 NTLM 协议的使用情况。 NTLM 是一种过时的身份验证协议,存在可能损害应用程序和操作系统安全性的缺陷。 有关详细信息,请参阅 应用程序验证程序 - 应用程序验证程序中的测试

打印 - 打印验证程序可帮助查找和排查应用程序调用打印子系统时可能导致的问题。 打印验证程序面向打印子系统的两个层:PrintAPI 层和 PrintDriver 层。 有关详细信息,请参阅 应用程序验证程序 - 应用程序验证程序中的测试

Webservices - Windows Webservices API (WWSAPI) 验证层可以检查,以便正确使用 WWSAPI,例如调用的 WWSAPI 引用无效的内部 WWSAPI 对象,或者调用的 WWSAPI 引用了已在使用的单个线程对象。 有关详细信息,请参阅 应用程序验证程序 - 应用程序验证程序中的测试

服务 - 服务测试,检查正确使用 Windows 服务。 例如,服务正在正常启动和停止。 有关这些测试生成的停止代码异常的信息,请参阅 应用程序验证程序 - 停止代码和定义

Perf - Perf 测试检查高效使用影响系统性能和能耗的 API,例如调用使用不正确的等待期的 Windows 函数。 有关这些测试生成的停止代码异常的信息,请参阅 应用程序验证程序 - 停止代码和定义

挂起 - 挂起测试是否使用了导致系统无响应的 API,例如当 DllMain 线程等待另一个被阻止的线程时。 有关这些测试生成的停止代码异常的信息,请参阅 应用程序验证程序 - 停止代码和定义

AppVerifier 如何工作?

AppVerifier 的工作原理是修改非托管 DLL 方法表,以便在执行实际函数之前执行所需的检查, (这也称为“函数挂钩”) 。 例如,Win32 API CreateFileA 方法的地址被替换为内部 AppVerifier 方法,该方法将触发一系列测试,如果为阳性,则会记录这些测试。

启动新进程时,AppVerifier 方法表挂钩技术的使用由特定注册表项中的条目控制。 如果该注册表项存在,则 AppVerifier DLL 将在新创建的进程中加载,该进程将处理现有 DLL 和随后加载的 DLL 中的方法表替换。 由于这些挂钩是在加载 DLL 时创建的,因此无法在已运行的进程上使用 AppVerifier。

appVerifier 用户界面 (UI) 用于控制注册表项设置和提供有关现有日志的信息。 在 UI 中设置应用程序和测试并单击“保存”按钮后,将进行注册表设置。 然后,需要重启应用程序,这将启动监视。 请务必注意,在从 AppVerifier 中删除应用程序之前,设置将一直保留。

确定问题后,将发生验证程序停止。 提供的数字用于标识其发生的确切性质和原因。

在软件开发生命周期中使用应用程序验证程序

应在整个软件开发生命周期内使用应用程序验证程序。

要求阶段 - 应计划 AppVerifier,并为其执行和跟进分配时间。

设计阶段 - 规划应用程序验证程序的使用,并定义将测试哪些组件 (模块、DLL 或 EXE) 。

实现阶段 - 在从 Alpha 到 RTM) 开发中不同组件的稳定生成 (上运行应用程序验证程序 (必须单独和集体) 测试组件。

验证阶段 - 测试人员应 (使用应用程序验证程序执行手动和自动) 的所有测试,因为这是首次将应用程序推送到限制,并提交意外行为和数据。 AppVerifier 也是一款功能强大的工具,可供安全顾问 (黑盒和白盒) 执行审核,因为它允许快速枚举真实 (或潜在的) 攻击/利用途径。

发布阶段 - 客户端和安全顾问可以在已发布的二进制文件上使用 AppVerifier 来识别潜在的安全漏洞。

支持和服务阶段 - 使用应用程序验证程序确保代码更改 ((例如更新、Service Pack) )不会引入回归。

节主题

本部分包含以下主题。

应用程序验证工具 - 功能

应用程序验证工具 - 测试应用程序

应用程序验证工具 - 应用程序验证工具中的测试

应用程序验证工具 - 停止代码和定义

应用程序验证工具 - 调试应用程序验证工具停止

应用程序验证工具 - 常见问题解答