KMDF 드라이버에서 디바이스 액세스 제어

드라이버는 사용자가 컴퓨터의 디바이스 및 파일에 부적절하게 액세스하지 못하도록 하는 데 도움이 되어야 합니다. 디바이스 및 파일에 대한 무단 액세스를 방지하려면 다음을 수행해야 합니다.

  • 필요한 경우에만 디바이스 개체의 이름을 지정합니다.

  • 디바이스 개체 및 인터페이스에 대한 보안 설명자를 제공합니다.

필요한 경우에만 디바이스 개체 이름 지정

대부분의 WDM(Windows 드라이버 모델) 드라이버와 마찬가지로 프레임워크 기반 드라이버는 일반적으로 디바이스 개체의 이름을 지정하지 않습니다. 애플리케이션은 디바이스 개체 이름을 지정하여 디바이스에 액세스할 수 있으므로 각 추가 디바이스 개체 이름은 애플리케이션이 디바이스에 액세스하는 데 사용할 수 있는 추가 경로를 나타냅니다.

디바이스에 대한 무단 액세스를 방지하기 위해 각 드라이버는 디바이스 개체의 이름을 지정할 때 보안 설명자를 지정할 수 있습니다. 그러나 운영 체제가 드라이버에 제공하는 파일 이름( WdfFileObjectGetFileName 참조)에는 애플리케이션이 사용한 디바이스 개체 이름이 포함되지 않습니다. 따라서 드라이버 스택의 여러 드라이버가 디바이스 개체의 이름을 제공하는 경우 드라이버는 애플리케이션이 디바이스를 여는 데 사용한 개체 이름을 확인할 수 없습니다. 결과적으로 애플리케이션은 드라이버가 예상하는 것보다 덜 제한적인 보안 설명자로 디바이스를 열 수 있습니다.

PDO(물리적 디바이스 개체)에는 이름이 있어야 합니다. 프레임워크는 기본적으로 운영 체제에 이름을 생성하도록 지시하기 때문에 일반적으로 프레임워크 기반 버스 드라이버는 PDO의 이름을 지정하지 않습니다.

반면에 프레임워크 기반 드라이버는 WdfDeviceInitAssignName을 호출하여 디바이스 개체에 디바이스 이름을 할당할 수 있습니다. 드라이버는 특정 디바이스 이름이 필요한 이전 애플리케이션을 지원해야 하거나 드라이버가 아키텍처에 개체 이름이 필요한 이전 드라이버 스택에 속하는 경우에만 FDO(기능 디바이스 개체), 필터 디바이스 개체(filter DO) 또는 PDO의 이름을 지정해야 합니다.

WDM 드라이버와 프레임워크 기반 드라이버는 FDO의 이름을 지정하고 DO를 필터링하는 대신 애플리케이션에서 액세스할 수 있는 디바이스 인터페이스를 제공해야 합니다. 운영 체제는 디바이스의 PDO 및 드라이버 패키지의 INF 파일이 지정하는 레지스트리 항목에서 디바이스 인터페이스의 보안 설명자를 가져옵니다. 드라이버의 디바이스가 함수 드라이버 없이 원시 모드로 작동하는 경우 버스 드라이버는 PDO에 대한 디바이스 인터페이스를 제공할 수 있습니다.

일부 드라이버는 WdfDeviceCreateSymbolicLink 를 호출하여 디바이스에 대한 기호 링크 이름을 만들어야 합니다. 예를 들어 애플리케이션에 디바이스의 MS-DOS 이름이 표시될 것으로 예상되는 경우 드라이버는 MS-DOS 디바이스 이름을 만들 수 있습니다. 드라이버가 명명되지 않은 FDO 또는 필터 DO에 대한 기호 링크 이름을 만드는 경우 프레임워크는 기호 링크 이름을 PDO의 이름과 연결합니다. (컨트롤 디바이스는 PDO와 연결되지 않으므로 드라이버는 명명되지 않은 컨트롤 디바이스에 대한 기호 링크 이름을 만들 수 없습니다.)

디바이스 개체 및 인터페이스에 대한 보안 설명자 제공

명명된 모든 디바이스 개체에는 보안 설명자가 있어야 합니다. 운영 체제는 디바이스 개체의 보안 설명자를 사용하여 디바이스 및 해당 디바이스 인터페이스에 액세스할 수 있는 사용자 유형을 결정합니다. 보안 설명자는 다음을 통해 디바이스 개체에 할당할 수 있습니다.

기본적으로 운영 체제는 디바이스 PDO의 보안 설명자를 사용하여 드라이버가 제공하는 디바이스 인터페이스에 대한 액세스 권한을 결정합니다.

드라이버 패키지는 INF DDInstall.HW 섹션 내에서 INF AddReg 지시문을 사용하여 디바이스의 보안 설명자를 지정하는 INF 파일을 제공할 수 있습니다.

INF 파일에서 보안 설명자를 지정하는 방법에 대한 자세한 내용은 보안 디바이스 설치 만들기를 참조하세요.

드라이버가 원시 모드에서 작동하는 디바이스에 대한 PDO를 만드는 경우 드라이버는 WdfPdoInitAssignRawDevice를 호출할 때 디바이스 설정 클래스를 지정해야 합니다. 또한 드라이버가 제어 디바이스를 만드는 경우 WdfDeviceInitSetDeviceClass 를 호출하여 디바이스 설정 클래스를 지정할 수 있습니다. 이러한 두 경우 모두 시스템 관리자는 지정된 설치 클래스의 레지스트리 키를 사용하여 디바이스에 대한 보안 설명자를 저장할 수 있습니다.

운영 체제에서 디바이스에 사용할 보안 설명자를 결정하는 방법에 대한 자세한 내용은 디바이스 액세스 제어를 참조하세요.

프레임워크가 디바이스 개체를 만들 때 애플리케이션이 디바이스의 네임스페이스 내의 모든 이름에 액세스할 수 있도록 하기 전에 운영 체제가 디바이스의 보안 설명자를 검사 있도록 항상 FILE_DEVICE_SECURE_OPEN 플래그를 설정합니다. FILE_DEVICE_SECURE_OPEN 플래그 및 디바이스 네임스페이스에 대한 자세한 내용은 디바이스 네임스페이스 액세스 제어를 참조하세요.