일부 드라이버는 호출자가 전달한 개체를 조작하거나 두 개의 파일 개체를 동시에 처리해야 합니다. 예를 들어 모뎀 드라이버는 이벤트 개체에 대한 핸들을 받거나 네트워크 드라이버가 서로 다른 두 파일 개체에 대한 핸들을 받을 수 있습니다. 드라이버는 이러한 핸들의 유효성을 검사해야 합니다. 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>에서 드라이버 관련 데이터에 액세스하기 전에 포인터의 유효성을 검사해야 합니다.
이러한 문제를 방지하려면 드라이버는 다음과 같이 유효한 데이터를 확인해야 합니다.
개체 형식을 확인하여 드라이버에서 예상하는 개체인지 확인합니다.
요청된 액세스가 개체 유형 및 필수 작업에 적합한지 확인합니다. 예를 들어 드라이버가 빠른 파일 복사를 수행하는 경우 핸들에 읽기 권한이 있는지 확인합니다.
올바른 액세스 모드(UserMode 또는 KernelMode)를 지정하고 액세스 모드가 요청된 액세스와 호환되는지 확인합니다.
드라이버가 드라이버 자체에서 만든 파일 개체에 대한 핸들을 예상하는 경우 디바이스 개체 또는 드라이버에 대한 핸들의 유효성을 검사합니다. 그러나 이상한 디바이스에 대한 I/O 요청을 보내는 필터를 중단하지 않도록 주의해야 합니다.
드라이버가 여러 종류의 파일 개체(예: 컨트롤 채널, 주소 개체 및 TDI 드라이버 또는 파일 시스템의 볼륨, 디렉터리 및 파일 개체의 연결)를 지원하는 경우 이를 구분할 수 있는 방법이 있는지 확인합니다.