드라이버 검증 도구 보안 검사

드라이버 검증 도구의 보안 검사 옵션은 보안 취약성을 초래할 수 있는 일반적인 오류에 대해 드라이버를 모니터링합니다. 이 옵션은 Windows Vista부터 사용할 수 있습니다.

특히 보안 검사 옵션은 다음과 같은 부적절한 드라이버 동작을 찾습니다.

  • 사용자 모드 주소를 매개 변수로 사용하여 커널 ZwXxx 루틴을 호출합니다. 드라이버가 ZwXxx 루틴을 호출할 때 드라이버 검증 도구는 매개 변수가 사용자 모드 주소가 없는지 확인합니다. ZwXxx 루틴을 호출할 때 현재 KPROCESSOR_MODE KernelMode가 되고 해당 루틴에 전달된 모든 매개 변수는 커널 모드 주소인 것처럼 처리됩니다. 따라서 드라이버는 커널 ZwXxx 루틴을 호출하기 전에 애플리케이션에서 받은 모든 사용자 모드 버퍼를 검색하고 커널 모드 메모리(예: 커널 스택에 할당된 풀 블록 또는 데이터 구조)에 배치해야 합니다. 드라이버는 사용자 모드 버퍼 대신 캡처된 버퍼를 ZwXxx 루틴의 매개 변수로 사용해야 합니다.

  • 형식이 잘못된 UNICODE_STRINGs 매개 변수로 커널 ZwXxx 루틴을 호출합니다. 드라이버가 ZwXxx 루틴을 호출하면 드라이버 검증 도구는 UNICODE_STRING 값인 매개 변수를 확인합니다. 이러한 문자열에서 드라이버 검증 도구에서 검색되는 일반적인 오류는 다음과 같습니다.

    • 버퍼 필드는 사용자 모드 메모리를 가리킵니다.
    • Length 또는 MaximumLength 매개 변수가 잘못되었습니다. 예를 들어 MaximumLength Length입니다<. 또는 이러한 값 중 하나 또는 둘 다 홀수입니다. 이러한 두 값은 유니코드 문자열을 나타내는 데 사용되는 바이트 수를 나타내므로 항상 이어야 합니다.
  • 잘못된 OBJECT_ATTRIBUTES 구조를 매개 변수로 사용하여 커널 ZwXxx 루틴을 호출합니다. 드라이버가 ZwXxx 루틴을 호출하면 드라이버 검증 도구는 구조체에 OBJECT_ATTRIBUTE 매개 변수를 확인합니다. 각 OBJECT_ATTRIBUTE 구조 매개 변수의 멤버는 위에서 설명한 사용자 모드 주소 및 UNICODE_STRING 값에 대해 동일한 검사를 받습니다.

  • 일관되지 않은 Irp-RequestorMode> 및 I/O 요청 매개 변수입니다. Irp-> RequestorModeKernelMode로 설정될 때마다 드라이버 검증 도구는 I/O 요청 매개 변수인 Irp-ASSOCIATedIrp.SystemBuffer> 또는 Irp-UserBuffer>가 사용자 모드 주소인지 확인합니다.

Windows 7부터 드라이버 검증 도구 옵션을 사용하도록 설정하면 드라이버 검증 도구는 다음 드라이버 동작을 확인합니다.

개체 참조 카운터가 0에서 1로 변경됩니다. Windows 커널 개체 관리자가 File 개체 또는 Thread 개체와 같은 개체를 만들면 새 개체의 참조 카운터가 1로 설정됩니다. ObReferenceObjectByPointer 또는 ObReferenceObjectByHandle과 같은 시스템 함수에 대한 호출은 참조 카운터를 증가합니다. 동일한 개체에 대해 ObDereferenceObject 를 호출할 때마다 참조 카운터가 감소합니다.

참조 카운터가 0 값에 도달하면 개체를 해제할 수 있습니다. 개체 관리자가 즉시 해제하거나 나중에 해제할 수 있습니다. 드라이버 검증 도구는 동일한 개체에 대해 ObReferenceObjectByPointerObReferenceObject 에 대한 후속 호출을 확인합니다. 이러한 호출은 참조 카운터를 0에서 1로 변경합니다. 즉, 드라이버가 이미 해제된 개체의 참조 카운터를 증가시켰습니다. 다른 메모리 할당이 손상될 수 있으므로 항상 올바르지 않습니다.

이 옵션 활성화

드라이버 검증 도구 관리자 또는 Verifier.exe 명령줄을 사용하여 하나 이상의 드라이버에 대한 보안 검사 옵션을 활성화할 수 있습니다. 자세한 내용은 드라이버 검증 도구 옵션 선택을 참조하세요.

  • 명령줄 사용

    명령줄에서 보안 검사 옵션은 비트 8(0x100)으로 표시됩니다. 보안 검사를 활성화하려면 플래그 값 0x100 사용하거나 플래그 값에 0x100 추가합니다. 예:

    verifier /flags 0x100 /driver MyDriver.sys
    

    컴퓨터를 다시 시작한 후 옵션이 활성화됩니다.

    Windows Vista부터 명령에 /volatile 매개 변수를 추가하여 컴퓨터를 다시 시작하지 않고 보안 검사를 활성화하고 비활성화할 수도 있습니다. 예:

    verifier /volatile /flags 0x100 /adddriver MyDriver.sys
    

    이 설정은 즉시 유효하지만 컴퓨터를 종료하거나 다시 시작할 때 손실됩니다. 자세한 내용은 Volatile 설정 사용을 참조하세요.

    보안 검사 옵션도 표준 설정에 포함되어 있습니다. 예:

    verifier /standard /driver MyDriver.sys
    
  • 드라이버 검증 도구 관리자 사용

    1. 드라이버 검증 도구 관리자를 시작합니다. 명령 프롬프트 창에 검증 도구 를 입력합니다.
    2. 사용자 지정 설정 만들기(코드 개발자용)를 선택하고 다음을 클릭합니다.
    3. 전체 목록에서 개별 설정 선택을 선택합니다.
    4. 보안 검사를 선택합니다.

    보안 검사 기능도 표준 설정에 포함되어 있습니다. 드라이버 검증 도구 관리자에서 이 기능을 사용하려면 표준 설정 만들기를 클릭합니다.