관리 처리
드라이버 내에서 보안 문제의 중요한 원인은 사용자 모드와 커널 모드 구성 요소 간에 전달되는 핸들의 사용입니다. 커널 환경 내에서 핸들 사용과 관련하여 다음과 같은 여러 알려진 문제가 있습니다.
커널 드라이버에 잘못된 유형의 핸들을 전달하는 애플리케이션입니다. 커널 드라이버가 충돌하여 파일 개체가 필요한 이벤트 개체를 사용할 수 있습니다.
필요한 액세스 권한이 없는 개체에 핸들을 전달하는 애플리케이션입니다. 커널 드라이버는 사용자에게 적절한 권한이 없더라도 커널 모드에서 호출이 제공되기 때문에 작동하는 작업을 수행할 수 있습니다.
주소 공간에서 유효한 핸들이 아니지만 시스템에 대해 악의적인 작업을 수행하기 위한 시스템 핸들로 표시된 값을 전달하는 애플리케이션입니다.
디바이스 개체에 대한 적절한 핸들이 아닌 값(이 드라이버가 만들지 않은 핸들)을 전달하는 애플리케이션입니다.
이러한 문제로부터 보호하기 위해 커널 드라이버는 전달된 핸들이 유효한지 확인하기 위해 특히 주의해야 합니다. 가장 안전한 정책은 드라이버의 컨텍스트 내에서 필요한 핸들을 만드는 것입니다. 커널 드라이버에서 만든 이러한 핸들은 임의의 프로세스 컨텍스트에서 유효한 핸들과 커널 모드 호출자에서만 액세스할 수 있는 핸들을 만드는 OBJ_KERNEL_HANDLE 옵션을 지정해야 합니다.
애플리케이션 프로그램에서 만든 핸들을 사용하는 드라이버의 경우 이러한 핸들을 매우 주의해서 사용해야 합니다.
가장 좋은 방법은 ObReferenceObjectByHandle을 호출하고 올바른 AccessMode(일반적으로 Irp-RequestorMode>), DesiredAccess 및 ObjectType 매개 변수(예: IoFileObjectType 또는 ExEventObjectType)를 지정하여 핸들을 개체 포인터로 변환하는 것입니다.
호출 내에서 핸들을 직접 사용해야 하는 경우 함수의 Zw 변형 대신 함수의 Nt 변형을 사용하는 것이 가장 좋습니다. 이렇게 하면 이전 모드가 UserMode이므로 매개 변수 검사 적용하고 운영 체제에서 유효성 검사를 처리합니다. 포인터인 Nt 함수에 전달된 매개 변수는 이전 모드가 UserMode인 경우 유효성 검사에 실패할 수 있습니다. Nt 및 Zw 루틴은 오류에 대해 검사 오류 정보가 포함된 IoStatusBlock 매개 변수를 반환합니다.
오류는 필요에 따라 __try 및 __except 사용하여 적절하게 트래핑되어야 합니다. 많은 캐시 관리자(참조), 메모리 관리자(Mm) 및 FsRtl(파일 시스템 런타임 라이브러리 루틴)은 오류가 발생할 때 예외를 발생합니다.
어떤 드라이버도 적절한 예방 조치를 취하지 않고 사용자 모드 애플리케이션에서 전달된 핸들 또는 매개 변수에 의존해서는 안 됩니다.
Nt 변형을 사용하여 파일을 여는 경우 Nt 변형도 사용하여 파일을 닫아야 합니다.