다음을 통해 공유


개체 핸들 유효성 검사 실패

일부 드라이버는 호출자가 전달한 개체를 조작하거나 두 개의 파일 개체를 동시에 처리해야 합니다. 예를 들어 모뎀 드라이버는 이벤트 개체에 대한 핸들을 받거나 네트워크 드라이버가 두 개의 다른 파일 개체에 대한 핸들을 받을 수 있습니다. 드라이버는 이러한 핸들의 유효성을 검사해야 합니다. I/O 관리자를 통하지 않고 호출자가 전달하므로 I/O 관리자는 유효성 검사를 수행할 수 없습니다.

예를 들어 다음 코드 조각에서 드라이버는 AscInfo-AddressHandle> 핸들을 전달했지만 ObReferenceObjectByHandle을 호출하기 전에 유효성을 검사하지 않았습니다.

   //
   // This handle is embedded in a buffered request.
   //
   status = ObReferenceObjectByHandle(
                      AscInfo->AddressHandle,
                      0,
                      NULL,
                      KernelMode,
                      &fileObject,
                      NULL);

   if (NT_SUCCESS(status)) {
       if ( (fileObject->DeviceObject == DeviceObject) &&
            (fileObject->FsContext2 == TRANSPORT_SOCK) ) {

ObReferenceObjectByHandle에 대한 호출이 성공하더라도 코드는 반환된 포인터가 파일 개체를 참조하는지 확인하는 데 실패합니다. 올바른 정보를 전달할 호출자를 신뢰합니다.

ObReferenceObjectByHandle 호출에 대한 모든 매개 변수가 올바르고 호출이 성공하더라도 파일 개체가 드라이버용이 아닌 경우에도 드라이버는 예기치 않은 결과를 얻을 수 있습니다. 다음 코드 조각에서 드라이버는 성공적인 호출이 예상한 파일 개체에 대한 포인터를 반환한다고 가정합니다.

   status = ObReferenceObjectByHandle (
                             AcpInfo->Handle,
                             0L,
                             DesiredAccess,
                             *IoFileObjectType,
                             Irp->RequestorMode,
                             (PVOID *)&AcpEndpointFileObject,
                             NULL);

   if ( !NT_SUCCESS(status) ) {
      goto complete;
   }
   AcpEndpoint = AcpEndpointFileObject->FsContext;

   if ( AcpEndpoint->Type != BlockTypeEndpoint ) 

ObReferenceObjectByHandle은 파일 개체에 대한 포인터를 반환하지만 드라이버에서 포인터가 예상한 파일 개체를 참조한다는 보장은 없습니다. 이 경우 드라이버는 AcpEndpointFileObject-FsContext>에서 드라이버 관련 데이터에 액세스하기 전에 포인터의 유효성을 검사해야 합니다.

이러한 문제를 방지하려면 드라이버는 다음과 같이 유효한 데이터를 검사 합니다.

  • 개체 형식을 확인하여 드라이버에 필요한 개체인지 확인합니다.

  • 요청된 액세스가 개체 형식 및 필수 작업에 적합한지 확인합니다. 드라이버가 빠른 파일 복사를 수행하는 경우 instance 핸들에 읽기 권한이 있는지 확인합니다.

  • 올바른 액세스 모드(UserMode 또는 KernelMode)를 지정하고 액세스 모드가 요청된 액세스와 호환되는지 확인합니다.

  • 드라이버가 드라이버 자체가 만든 파일 개체에 대한 핸들이 필요한 경우 디바이스 개체 또는 드라이버에 대한 핸들의 유효성을 검사합니다. 그러나 이상한 디바이스에 대한 I/O 요청을 보내는 필터를 중단하지 않도록 주의해야 합니다.

  • 드라이버가 여러 종류의 파일 개체(예: 컨트롤 채널, 주소 개체 및 TDI 드라이버의 연결 또는 파일 시스템의 볼륨, 디렉터리 및 파일 개체)를 지원하는 경우 이를 구분할 수 있는 방법이 있는지 확인합니다.