개체 핸들 유효성 검사 실패
일부 드라이버는 호출자가 전달한 개체를 조작하거나 두 개의 파일 개체를 동시에 처리해야 합니다. 예를 들어 모뎀 드라이버는 이벤트 개체에 대한 핸들을 받거나 네트워크 드라이버가 두 개의 다른 파일 개체에 대한 핸들을 받을 수 있습니다. 드라이버는 이러한 핸들의 유효성을 검사해야 합니다. 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 드라이버의 연결 또는 파일 시스템의 볼륨, 디렉터리 및 파일 개체)를 지원하는 경우 이를 구분할 수 있는 방법이 있는지 확인합니다.