Windows Device Driver 와 SDDL
Windows Device Driver 와 SDDL
- 어큐시스 윈도우 디바이스 드라이버 개발팀
- 본 내용은 어큐시스의 지적 재산으로서 개작, 복사, 인용, 참조시에 반드시 출처를 밝히셔야 합니다. 출처를 밝히는 내용으로 한하여 자유롭게 참고 및 인용이 가능합니다.
0. 문제의 내용
윈도우 드라이버를 작성하게 되면 AddDevice 루틴에서는 IoCreateDevice 함수를 이용하여, 장치를 연결할 수 있는 Object 를 생성할 수 있다.
그런데 이러한 디바이스 Object 가 윈도우 드라이버 설치 당시(장치 드라이버 설치 시간)에서는 상관이 없으나, 재부팅 등을 통해 설치를 완료 한 후
사용자의 라이브러리 또는 응용프로그램에서 CreateFile 로 장치를 연결하려면, 반드시 응용프로그램을 관리자 권한으로 실행해야 하는 문제가 있는 경우가 있다.
1. 문제의 확인
이를 장치에 대해서 WinObj (https://docs.microsoft.com/en-us/sysinternals/downloads/winobj) 으로 Device 트리 항목에서 장치의 심볼명 또는 장치명으로 관찰하게 되면, 장치의 접근 속성에 대해 알아 볼 수 있는데 다음과 같이 Everyone 에 대해서 Read/Write 속성을 모두 가지지 못하는 경우 CreateFile 이 실패하고, DeviceIoControl 등을 이용해 디바이스 드라이버의 통신이 불가능하여, 반드시 관리자 권한으로 실행해야 하는 문제가 있다.
상기 WinObj 에서 나타난 바와 같이 그림에서 Everyone 이 Write 속성을 가지지 못하는 경우 CreateFile 에서 관리자 권한으로 응용프로그램 또는 동적연결라이브러리가 관리자권한의
응용프로그램에서 로드되지 못하는 경우 CreateFile 이 실패하게 된다.
이를 해결하기 위해서는 Windows Device Driver 의 INF 파일을 수정하여, 해당 드라이버의 접근 권한(SDDL)을 지정해야 한다. 지정되지 않는 SDDL 의 경우 기본적으로 장치를 설치할때에는 다음과 같이 Write 속성이 Everyone 에 적용되지만 재 부팅후(장치 설치 후 재부팅)에는 위 그림과 같이 Everyone 의 Write 권한이 없는 것으로 나오게 되어 결과적으로 CreateFile 이 실패한다(핸들을 정상적으로 반환하지 못한다).
2. INF 파일의 수정
해당 드라이버의 INF 파일을 수정하는 방법은 다음과 같다.
[DriverClassReg]
HKR,,,0,%CLASS_NAME%
HKR,,Icon,,-5
HKR,,Security,,”D:P(A;;GA;;;WD)(A;;GA;;;SY)(A;;GA;;;BA)”
[DDInstall_[사용자 장치명].NT.HW]
AddReg=DDInstall_AF_PCIe_64.NT.AddReg[DDInstall_[사용자 장치명].NT.AddReg]
HKR,,DeviceCharacteristics,0x10001,0x0100
HKR,,Security,,”D:P(A;;GA;;;WD)(A;;GA;;;SY)(A;;GA;;;BA)”
상기 * [사용자 장치명]은 고객사 드라이버의 보호를 위해 사용자가 수정해야 함.
이 문제를 해결하기 위해 위와 같이 INF 파일에 SDDL 을 구성한다. SDDL 은 다음과 같이 구성된다. (출처 : 데브구르, SDK 문서)
결국 위의 HKR,,Security,,”D:P(A;;GA;;;WD)(A;;GA;;;SY)(A;;GA;;;BA)” 은
첫번째 : (A;; GA;;;WD) 로 Allow , All, Everyone 의미 (Everyone 에게 모든 GR,GW,GX 권한 부여)
두번째 : (A;;GA;;;SY) 로 Allow, All, System 의미 (System 에게 모든 GR,GW,GX 권한 부여)
세번째 : (A;;GA;;;BA) 로 Allow, All, Built-in administrator group 의미 (Built-in administrator group 에 GR,GW,GX 권한 부여)
상기 3가지를 의미하는 것으로서 결국 Everyone, System,Built-in administrator group 사용자 (3개) 에게 모든 읽고,쓰고,실행하고, traverse 할수 있는 권한을 부여하므로 완전한 모든 제어를 관리자 권한없이 수행할 수 있도록 한다.
위 내용을 INF 파일에 적용하고 드라이버를 컴파일 한 후 서명하게 되면, 아래와 같이 Everyone 에도 Write 권한이 부여되어 별도의 관리자 권한 없이도 드라이버 접근 및 CreateFile 의 수행에 문제가 없다(정상적으로 핸들을 반환한다)
참고자료.
WinObj 다운로드 경로 :
https://docs.microsoft.com/en-us/sysinternals/downloads/winobj
SDDL 설명 자료:
https://docs.microsoft.com/ko-kr/windows/win32/secauthz/security-descriptor-definition-language
데브구르 SDDL 설명 자료: (PDF 파일)