애플리케이션 검증 도구 - 개요
요약
AppVerifier(Application Verifier)는 일반적인 애플리케이션 테스트 기술로 식별하기 어려울 수 있는 미묘한 프로그래밍 오류, 보안 문제 및 제한된 사용자 계정 권한 문제를 찾는 데 도움이 되는 관리되지 않는 코드에 대한 런타임 확인 도구입니다.
개요
프로그래머, 소프트웨어 설계자, 테스터 및 보안 컨설턴트가 직면한 가장 큰 과제 중 하나는 프로덕션 환경에 배포될 때 애플리케이션의 가변 실행 경로를 이해하는 것입니다. 소스 코드에 액세스하더라도 다양한 종속성(예: 코드에 기여하거나 외부 구성 요소를 활용하는 여러 그룹)으로 인해 실행 중에 발생하는 모든 항목을 파악하기가 어렵습니다. Microsoft AppVerifier는 이러한 복잡성과 버그의 잠재적 부작용을 관리하는 데 유용한 역할을 할 수 있습니다. AppVerifier는 일반적인 테스트 통과 중에 식별하기 어려울 수 있는 프로그래밍 오류, 보안 문제 및 사용자 계정 권한 문제를 찾는 데 도움이 됩니다.
AppVerif.exe(Application Verifier)는 사용자 모드 애플리케이션에 대한 동적 확인 도구입니다. 이 도구는 애플리케이션이 실행되는 동안 애플리케이션의 동작을 모니터링하고, 애플리케이션을 다양한 부하로 테스트하고, 애플리케이션 실행 또는 디자인과 관련하여 발생할 수 있는 잠재적 오류에 대한 보고서를 생성합니다.
애플리케이션 검증 도구는 사용자 모드 드라이버를 포함하여 관리 코드를 기반으로 하지 않는 사용자 모드 애플리케이션에서 오류를 감지할 수 있습니다. 이 도구는 표준 애플리케이션 테스트 또는 드라이버 테스트 중에 감지하기 어려운 미묘한 프로그램 오류를 찾습니다.
소프트웨어 개발 수명 주기 내내 사용할 경우 AppVerifier는 문제를 더 쉽고 저렴하게 해결할 수 있는 초기에 쉽게 식별할 수 있기 때문에 개발 노력에 비용 이점을 가져다 줄 수 있습니다. 또한 눈에 띄지 않을 수 있는 오류를 감지하고 최종 애플리케이션을 제한된(예: 관리자가 아닌) 환경에서 실행할 수 있도록 합니다.
ARM64EC 지원
애플리케이션 검증 도구는 ARM64EC 지원하지 않습니다.
AppVerifier 설치
애플리케이션 검증 도구는 Windows SDK(소프트웨어 개발 키트)에 포함되어 있습니다. 애플리케이션 검증 도구를 설치하려면 SDK를 설치하는 동안 확인란을 선택합니다.
애플리케이션 검증 도구만 사용하거나 사용자 모드 디버거와 함께 사용할 수 있습니다. 현재 사용자는 컴퓨터의 Administrators 그룹의 구성원이어야 합니다.
AppVerifier는 무엇을 확인하나요?
AppVerifier는 메모리 손상, 중요한 보안 취약성 및 제한된 사용자 계정 권한 문제를 감지하고 디버그하는 데 도움이 되도록 설계된 도구입니다. AppVerifier는 Microsoft Windows 운영 체제와 애플리케이션의 상호 작용을 모니터링하고 개체, 레지스트리, 파일 시스템 및 Win32 API(힙, 핸들 및 잠금 포함)의 사용을 프로파일링하여 안정적이고 안전한 애플리케이션을 만드는 데 도움을 줍니다. AppVerifier에는 관리자가 아닌 환경에서 애플리케이션이 얼마나 잘 수행되는지 예측하는 검사도 포함되어 있습니다.
AppVerifier에서 식별하는 문제
AppVerifier는 다음을 확인하는 데 도움이 됩니다.
애플리케이션이 API를 올바르게 사용하는 경우:
- 안전하지 않은 TerminateThread API.
- TLS(스레드 로컬 스토리지) API를 올바르게 사용합니다.
- 가상 공간 조작을 올바르게 사용합니다(예: VirtualAlloc, MapViewOfFile).
- 애플리케이션이 구조적 예외 처리를 사용하여 액세스 위반을 숨기고 있는지 여부입니다.
- 애플리케이션이 잘못된 핸들을 사용하려고 하는지 여부입니다.
- 힙에 메모리 손상 또는 문제가 있는지 여부입니다.
- 애플리케이션이 낮은 리소스에서 메모리가 부족할지 여부입니다.
- 중요한 섹션의 올바른 사용이 발생하는지 여부입니다.
- 관리 환경에서 실행되는 애플리케이션이 권한이 적은 환경에서 잘 실행되는지 여부입니다.
- 애플리케이션이 제한된 사용자로 실행될 때 잠재적인 문제가 있는지 여부입니다.
- 스레드의 컨텍스트에서 이후 함수 호출에 초기화되지 않은 변수가 있는지 여부입니다.
AppVerifier 테스트
AppVerifier는 "확인 계층"이라는 테스트 집합으로 구성됩니다. 테스트 중인 각 애플리케이션에 대해 이러한 기능을 설정하거나 해제할 수 있습니다. 테스트 영역 내에서 확인 계층을 확장하면 특정 테스트가 표시됩니다. 애플리케이션에 대한 테스트를 켜려면 옆에 있는 확인란을 선택합니다. 기본 사항과 같은 전체 확인 계층을 켜려면 최상위 수준에서 확인란을 선택합니다.
AppVerifier에서 수행할 수 있는 테스트 유형은 13가지입니다.
기본 사항 - 최소한 기본 설정이 선택된 애플리케이션 검증 도구를 실행해야 합니다. 이러한 각 항목은 고객 환경에 직접적이고 중대한 영향을 미치는 충돌 또는 기타 부정적인 시나리오를 발생시키는 영역을 테스트합니다. 자세한 내용은 애플리케이션 검증 도구 내의 Application Verifier- 테스트를 참조 하세요.
호환성 - 호환성 확인 계층 테스트는 Microsoft Windows 운영 체제에 문제가 있을 수 있는 애플리케이션을 식별하는 데 도움이 됩니다. 이러한 검사의 대부분은 로고 요구 사항을 테스트하는 데 사용할 수도 있습니다. 자세한 내용은 애플리케이션 검증 도구 내의 Application Verifier- 테스트를 참조 하세요.
Cuzz - 동시성 퍼지(Cuzz) 확인 계층은 동시성 버그 및 데이터 경합 상태를 검색합니다. Cuzz는 애플리케이션 코드의 주요 지점에 임의 지연을 주입하여 스레드 예약을 조정합니다. 자세한 내용은 애플리케이션 검증 도구 내의 Application Verifier- 테스트를 참조 하세요.
낮은 리소스 시뮬레이션 - 낮은 리소스 시뮬레이션은 메모리 부족과 같은 낮은 리소스에서 환경을 시뮬레이션하려고 합니다. 이 시뮬레이션은 낮은 메모리 조건에서 발생하는 버그를 식별합니다. 이를 오류 주입이라고도 합니다. 자세한 내용은 애플리케이션 검증 도구 내의 Application Verifier- 테스트를 참조 하세요.
LuaPriv - 제한된 사용자 계정 권한 예측(LuaPriv) 테스트는 모두 예측 및 진단이며 관리 권한으로 애플리케이션 실행과 관련된 문제를 표시하는 작업이며, 권한이 적은 경우(일반적으로 일반 사용자로서) 해당 애플리케이션이 제대로 작동하는지 여부를 표시합니다. 자세한 내용은 애플리케이션 검증 도구 내의 Application Verifier- 테스트를 참조 하세요.
기타 - 기타는 안전하지 않은 작업을 수행하는 위험한 API와 같은 다양한 테스트에 대한 테스트로 구성됩니다. 자세한 내용은 애플리케이션 검증 도구 내의 Application Verifier- 테스트를 참조 하세요.
네트워킹 - 네트워킹 테스트는 WinSock API의 부적절한 사용을 찾습니다. 예를 들어 성공적인 WSAStartup() 전에 또는 분산에 성공한 WSACleanup() 호출 후에 네트워킹 API가 호출된 경우입니다. 자세한 내용은 애플리케이션 검증 도구 내의 Application Verifier- 테스트를 참조 하세요.
NTLM - NTLM 프로토콜의 사용을 검색하기 위해 인증 API AcquireCredentialsHandle 및 InitializeSecurityContext의 사용을 모니터링합니다. NTLM은 애플리케이션 및 운영 체제의 보안을 손상시킬 수 있는 결함이 있는 오래된 인증 프로토콜입니다. 자세한 내용은 애플리케이션 검증 도구 내의 Application Verifier- 테스트를 참조 하세요.
인쇄 - 인쇄 검증 도구는 애플리케이션이 인쇄 하위 시스템을 호출할 때 발생할 수 있는 문제를 찾고 해결하는 데 도움이 됩니다. 인쇄 검증 도구는 인쇄 하위 시스템의 두 계층인 PrintAPI 계층과 PrintDriver 계층을 대상으로 합니다. 자세한 내용은 애플리케이션 검증 도구 내의 Application Verifier- 테스트를 참조 하세요.
웹 서비스 - WWSAPI(Windows Webservices API) 확인 계층은 이미 사용 중인 단일 스레드 개체에 대한 참조를 사용하여 호출되는 잘못된 내장 WWSAPI 개체 또는 WWSAPI를 참조하는 WWSAPI 호출과 같이 WWSAPI의 적절한 사용을 확인하기 위해 작동합니다. 자세한 내용은 애플리케이션 검증 도구 내의 Application Verifier- 테스트를 참조 하세요.
서비스 - 서비스 테스트, Windows 서비스의 적절한 사용을 확인합니다. 예를 들어 서비스가 제대로 시작되고 중지됩니다. 이러한 테스트에서 생성된 중지 코드 예외에 대한 자세한 내용은 애플리케이션 검증 도구 - 코드 및 정의 중지를 참조 하세요.
성능 - 성능 테스트는 잘못된 대기 기간을 사용하는 Windows 함수 호출과 같이 시스템 성능 및 에너지 소비에 영향을 주는 API의 효율적인 사용을 확인합니다. 이러한 테스트에서 생성된 중지 코드 예외에 대한 자세한 내용은 애플리케이션 검증 도구 - 코드 및 정의 중지를 참조 하세요.
중단 - DllMain 스레드가 차단된 다른 스레드를 기다리는 경우와 같이 시스템이 응답하지 않는 API를 사용하기 위한 중단 테스트입니다. 이러한 테스트에서 생성된 중지 코드 예외에 대한 자세한 내용은 애플리케이션 검증 도구 - 코드 및 정의 중지를 참조 하세요.
AppVerifier는 어떻게 작동하나요?
AppVerifier는 실제 함수가 실행되기 전에 필요한 검사가 수행되도록 관리되지 않는 DLL 메서드 테이블을 수정하여 작동합니다("함수 후킹"이라고도 함). 예를 들어 Win32 API CreateFileA 메서드의 주소는 긍정일 때 기록되는 일련의 테스트를 트리거하는 내부 AppVerifier 메서드로 바뀝니다.
새 프로세스가 시작되면 AppVerifier의 메서드 테이블 후킹 기술의 사용은 특정 레지스트리 키에서 만든 항목에 의해 제어됩니다. 레지스트리 항목이 있는 경우 AppVerifier DLL은 새로 만든 프로세스에서 로드되며, 이 프로세스는 기존 및 이후에 로드된 DLL에서 메서드 테이블 대체를 처리합니다. 이러한 후크는 DLL이 로드될 때 만들어지므로 이미 실행 중인 프로세스에서 AppVerifier를 사용할 수 없습니다.
AppVerifier UI(사용자 인터페이스)는 레지스트리 키 설정을 제어하고 기존 로그에 대한 정보를 제공하는 데 사용됩니다. 애플리케이션 및 테스트가 UI 내에서 설정되고 "저장" 단추를 클릭하면 레지스트리 설정이 만들어집니다. 그런 다음 애플리케이션을 다시 시작해야 모니터링을 시작합니다. AppVerifier에서 애플리케이션이 제거될 때까지 설정이 유지된다는 점에 유의해야 합니다.
문제가 식별되면 검증 도구 중지가 발생합니다. 제공된 숫자는 정확한 특성과 발생 이유를 식별하는 데 사용됩니다.
소프트웨어 개발 수명 주기에서 애플리케이션 검증 도구 사용
소프트웨어 개발 수명 주기 내내 Application Verifier를 사용해야 합니다.
요구 사항 단계 - AppVerifier를 계획하고 실행 및 후속 작업에 할당해야 합니다.
디자인 단계 - 애플리케이션 검증 도구 사용을 계획하고 테스트할 구성 요소(모듈, DLL 또는 EXE)를 정의합니다.
구현 단계 - 개발 중인 여러 구성 요소의 안정적인 빌드(알파에서 RTM까지)에서 애플리케이션 검증 도구를 실행합니다(구성 요소를 개별적으로 그리고 집합적으로 테스트하는 것이 중요).
확인 단계 - 애플리케이션이 제한에 푸시되고 예기치 않은 동작 및 데이터가 제출되는 것은 이번이 처음이므로 테스터는 Application Verifier를 사용하여 모든 테스트(수동 및 자동)를 실행해야 합니다. AppVerifier는 실제(또는 잠재적인) 공격/악용 벡터를 빠르게 열거할 수 있으므로 감사(블랙박스 및 화이트 박스)를 수행하는 보안 컨설턴트를 위한 강력한 도구이기도 합니다.
릴리스 단계 - 클라이언트 및 보안 컨설턴트는 릴리스된 이진 파일에서 AppVerifier를 사용하여 잠재적인 보안 취약성을 식별할 수 있습니다.
지원 및 서비스 단계 - 애플리케이션 검증 도구를 사용하여 코드 변경(예: 업데이트, 서비스 팩)이 회귀를 발생시키지 않도록 합니다.
섹션 항목
이 섹션에서는 다음 항목을 다룹니다.
애플리케이션 검증 도구 - 애플리케이션 검증 도구 내의 테스트