보안 검사

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

특히 보안 검사 옵션에서는 다음과 같이 잘못된 드라이버 동작을 검색합니다.

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

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

  • Irp->RequestorMode와 I/O Request 매개 변수가 일치하지 않습니다. Irp-> RequestorModeKernelMode로 설정될 때마다 드라이버 검증 도구는 I/O Request 매개 변수 Irp->AssociatedIrp.SystemBuffer 또는 Irp->UserBuffer가 사용자 모드 주소인지 검사합니다.

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

개체 참조 카운터가 0에서 1로 변경됩니다.

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

참조 카운터가 0 값에 도달하면 개체를 비울 수 없게 됩니다. 개체 관리자에서 바로 비우거나 나중에 비울 수 있습니다. 드라이버 검증 도구는 동일한 개체에 대한 ObReferenceObjectByPointerObReferenceObject의 후속 호출을 검사합니다. 이러한 호출을 수행하면 참조 카운터가 0에서 1로 변경되며, 이는 드라이버가 이미 해제된 개체의 참조 카운터를 증가시켰음을 의미합니다. 이렇게 하면 다른 메모리 할당이 손상될 수 있으므로 항상 잘못된 것입니다.

이 옵션 활성화

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

  • 명령줄에서

    명령줄에서 보안 검사 옵션은 Bit 8 (0x100)로 표시됩니다. 보안 검사를 활성화하려면 플래그 값 0x100을 사용하거나 플래그 값에 0x100을 추가합니다. 예를 들면 다음과 같습니다.

    
    verifier /flags 0x100 /driver MyDriver.sys
    
    

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

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

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

    이 설정은 바로 적용되지만 컴퓨터를 종료하거나 다시 시작하면 손실됩니다. 자세한 내용은 일시적 설정 사용을 참조하세요.

    보안 검사 옵션은 표준 설정에도 포함되어 있습니다. 예를 들면 다음과 같습니다.

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

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

 

 

표시:
© 2015 Microsoft