2008년 11월 14일
Named Pipe 사용시 주의 사항(Security)
클라이언트 파이프가 서버 파이프로 접속이 이루어지는것만으로도 서버파이프는 클라이언트의 Security Context로 Impersonation 할 수 있다.
(ImpersonateNamedPipeClient() API 사용)
일반적인 경우는 문제가 발생하지 않지만 서버 파이프가 높은 실행권한을 가지고 있는 환경에서는 문제가 발생한다.
예)
Server Pipe(제한된 사용자 권한) <----- Client Pipe(로컬 서비스 실행권한)
만약 악의적인 사용자가 정상적인 Server Pipe보다 먼저 동일한 이름으로 Server Pipe를 생성하고 대기하는 경우
서비스 권한의 Client Pipe가 접속이되면 Server Pipe(제한된 사용자 권한)는 위에서 언급한 ImpersonateNamePipeClient()를 사용하여 Client Pipe(로컬서비스) 권한으로 권한 상승을 할 수 있게된다.
[문제점 해결 방법]
* 높은권한에서 낮은권한 방향으로 접속하는 구조를 가지지 않도록 프로그램을 설계해야 한다.
* 높은권한에서 낮은권한 방향으로 접속을 해야만 하는 경우는 Impersonation Level을 설정하여 Impersonation을 통제한다.
예)
HANDLE CreateFile(LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile);
CreateFile의 dwFlagsAndAttributes에 Impersonation Level 값을 설정한다.
HANDLE hClientPipe = CreateFile("\\\\.\\pipe\\TestPpie",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
SECURITY_SQOS_PRESENT | SECURITY_ANONYMOUS,
NULL);
[Impersonation Level]
* SecurityAnonymous : 자격변경의 가장 까다루운 수준, 서버는 클라이언트로 자격변경을 하지 못한다.
* SecurityIdentification : 서버로부터 클라이언트의 보안 ID와 클라이언트의 권한을 받아가게한다, 자격변경은 하지 못한다.
* SecurityImpersonation : 서버가 로컬 시스템에서 클라이언트로의 자격변경을 할 수 있게 한다.
* SecurityDelegation : 가장 높은 수준의 자격 변경을 한다. 서버로 하여금 로컬/원격컴퓨터 모두에게 자격 변경이 된다.
NT4와 그 이전 버전은 이 수준의 자격 변경을 완벽하게 지원하지는 못한다.
[참고]
Microsoft Windows Internals 4(Fourth Edition)
# by | 2008/11/14 16:18 | Windows Programing | 트랙백 | 덧글(0)





☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]