다음을 통해 공유


섹션 개체 및 뷰에 대한 보안 문제

사용자 모드와 공유되지 않는 섹션 및 뷰를 만드는 드라이버는 섹션 및 뷰로 작업할 때 다음 프로토콜을 사용해야 합니다.

  • 드라이버는 섹션 개체에 대한 핸들을 열 때 커널 핸들을 사용해야 합니다. 드라이버는 시스템 프로세스에서 핸들을 만들거나 핸들에 대한 OBJ_KERNEL_HANDLE 특성을 지정하여 핸들이 커널 핸들인지 확인할 수 있습니다. 자세한 내용은 개체 핸들을 참조하세요.

  • 보기는 시스템 스레드에서만 매핑되어야 합니다. (그렇지 않으면 컨텍스트가 만들어지는 프로세스에서 보기에 액세스할 수 있습니다.) 드라이버는 시스템 작업자 스레드를 사용하여 매핑 작업을 수행하여 보기가 시스템 프로세스에서 매핑되도록 할 수 있습니다. 자세한 내용은 시스템 작업자 스레드 및드라이버 스레드 컨텍스트를 참조하세요.

사용자 모드 프로세스와 보기를 공유하는 드라이버는 섹션 및 뷰로 작업할 때 다음 프로토콜을 사용해야 합니다.

  • 사용자 모드 프로세스가 아닌 드라이버는 섹션 개체를 만들고 뷰를 매핑해야 합니다.

  • 앞에서 설명한 대로 드라이버는 섹션 개체에 대한 핸들을 열 때 커널 핸들을 사용해야 합니다. 드라이버는 시스템 프로세스에서 핸들을 만들거나 핸들에 대한 OBJ_KERNEL_HANDLE 특성을 지정하여 핸들이 커널 핸들인지 확인할 수 있습니다. 자세한 내용은 개체 핸들을 참조하세요.

  • 뷰는 뷰를 공유하는 프로세스의 스레드 컨텍스트에서 매핑됩니다. 최상위 드라이버는 DispatchDeviceControl과 같은 디스패치 루틴에서 매핑 작업을 수행하여 뷰가 현재 프로세스 컨텍스트에서 매핑되도록 보장할 수 있습니다. 하위 수준 드라이버의 디스패치 루틴은 임의의 스레드 컨텍스트에서 실행되므로 디스패치 루틴에서 뷰를 안전하게 매핑할 수 없습니다. 자세한 내용은 드라이버 스레드 컨텍스트를 참조하세요.

  • 드라이버 내의 보기에 대한 모든 메모리 액세스는 블록을제외한try-를 통해 보호되어야 합니다. 악의적인 사용자 모드 애플리케이션은 보기의 매핑을 해제하거나 보기의 보호 상태를 변경할 수 있습니다. 차단을제외한 시도로 보호되지 않는 한 시스템 크래시가 발생합니다-. 자세한 내용은 예외 처리를 참조하세요.

또한 드라이버는 필요에 따라 보기의 내용의 유효성을 검사해야 합니다. 드라이버 작성기는 신뢰할 수 있는 사용자 모드 구성 요소만 보기에 액세스할 수 있다고 가정할 수 없습니다.

사용자 모드 애플리케이션과 섹션 개체를 공유해야 하는 드라이버(자체 보기를 만들 수 있어야 합니다)는 다음 프로토콜을 사용해야 합니다.

  • 사용자 모드 프로세스가 아닌 드라이버는 section 개체를 만들어야 합니다. 드라이버는 사용자 모드에서 전달된 핸들을 사용하면 안 됩니다.

  • 핸들을 사용자 모드로 전달하기 전에 드라이버는 ObReferenceObjectByHandle 을 호출하여 섹션 개체에 대한 참조를 가져와야 합니다. 이렇게 하면 악의적인 애플리케이션이 핸들을 닫아 섹션 개체를 삭제할 수 없습니다. 개체 참조는 드라이버의 디바이스 확장에 저장되어야 합니다.

  • 드라이버가 더 이상 섹션 개체를 사용하지 않으면 ObDereferenceObject 를 호출하여 개체 참조를 해제해야 합니다.

Microsoft Windows Server 2003 SP1(서비스 팩 1) 이상 버전을 실행하는 시스템에서는 커널 모드 드라이버만 \Device\PhysicalMemory를 열 수 있습니다. 그러나 드라이버는 사용자 애플리케이션에 핸들을 제공하기로 결정할 수 있습니다. 보안 문제를 방지하려면 드라이버가 신뢰하는 사용자 애플리케이션만 \Device\PhysicalMemory에 대한 액세스 권한을 부여해야 합니다.