PsImpersonateClient 함수(ntifs.h)

PsImpersonateClient 루틴으로 인해 서버 스레드가 클라이언트를 가장합니다.

구문

NTSTATUS PsImpersonateClient(
  [in, out] PETHREAD                     Thread,
  [in]      PACCESS_TOKEN                Token,
  [in]      BOOLEAN                      CopyOnOpen,
  [in]      BOOLEAN                      EffectiveOnly,
  [in]      SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
);

매개 변수

[in, out] Thread

클라이언트를 가장할 서버 스레드에 대한 포인터입니다.

[in] Token

가장 토큰으로 할당할 토큰에 대한 포인터입니다. 이 토큰은 기본 토큰 또는 가장 토큰일 수 있습니다. 가장을 종료하려면 NULL 로 설정합니다.

[in] CopyOnOpen

토큰을 직접 열 수 있는지 여부를 지정합니다. 토큰을 직접 열 수 없도록 지정하려면 TRUE 로 설정합니다. 이 경우 토큰을 복제하고 대신 중복 토큰을 사용해야 합니다. 토큰을 직접 열 수 있도록 하려면 FALSE 로 설정합니다.

[in] EffectiveOnly

서버가 클라이언트 보안 컨텍스트에서 현재 사용하지 않도록 설정된 그룹 및 권한을 사용하도록 설정하려면 FALSE 로 설정하고, 그렇지 않으면 TRUE 로 설정합니다.

[in] ImpersonationLevel

서버가 토큰에 액세스하는 가장 수준을 지정하는 SECURITY_IMPERSONATION_LEVEL 값입니다.

반환 값

PsImpersonateClient 는 다음과 같이 STATUS_SUCCESS 또는 적절한 NTSTATUS 값을 반환합니다.

반환 코드 설명
STATUS_ACCESS_DENIED
작업 제한으로 인해 클라이언트를 가장할 수 없었습니다.
STATUS_NO_MEMORY
작업을 완료할 메모리가 부족했습니다.

설명

PsImpersonateClient 를 사용하면 지정된 서버 스레드가 지정된 클라이언트를 가장합니다.

PsImpersonateClient가 호출될 때 서버 스레드가 이미 클라이언트를 가장하고 있을 수 있습니다. 이 경우 해당 클라이언트를 나타내는 토큰의 참조 수가 감소합니다. 나중에 사용할 수 있도록 이 토큰을 유지하려면 드라이버는 PsImpersonateClient를 호출하기 전에 PsReferenceImpersonationToken을 호출하고 PsReferenceImpersonationToken에서 반환된 포인터를 저장해야 합니다.

새 가장을 종료하고 서버 스레드를 이전 가장으로 반환하려면 PsImpersonateClient 를 다시 호출하여 토큰 매개 변수에 대해 저장된 포인터를 전달합니다. 모든 가장을 종료하려면 PsRevertToSelf 루틴을 호출합니다.

그렇지 않은 경우 가장을 종료하고 서버 스레드를 원래 보안 컨텍스트(즉, 기본 토큰으로 표시되는 컨텍스트)로 반환하려면 PsImpersonateClient를 다시 호출하여 토큰 매개 변수에 대한 NULL 포인터를 전달합니다.

스레드가 이미 가장 중이거나 작업 제한이 있는 경우 PsImpersonateClient 루틴이 서버 스레드를 이전 가장으로 성공적으로 반환하지 못할 수 있습니다.

루틴은 다음을 포함하여 다양한 조건을 확인하여 클라이언트 가장이 실제로 발생할 수 있는지 여부를 확인합니다.

  • 호출자가 전달한 토큰에 익명 인증 ID가 없습니다.
  • 서버 스레드 및 지정된 토큰에서 참조되는 프로세스의 토큰에는 동일한 SID(보안 식별자)가 있습니다.
  • 두 토큰 모두 제한되지 않습니다.

조건이 충족되지 않으면 루틴은 호출에 전달된 기존 토큰의 복사본을 만들고 보안 가장 수준이 제한되어 있지만 새로 복사한 토큰을 가장 토큰으로 할당합니다. 즉, 서버 스레드는 클라이언트에 대한 정보만 가져올 수 있습니다. 토큰 복사가 불가능한 경우 루틴이 NTSTATUS 코드와 함께 실패합니다.

신뢰할 수 없는 사용자 스레드의 권한 상태를 높이는 것은 매우 안전하지 않습니다(예: 사용자의 스레드를 사용하고 LocalSystem을 가장). 신뢰할 수 없는 사용자 스레드의 권한이 상승된 경우 사용자는 스레드 토큰이 상승된 후 스레드 토큰을 잡고 전체 시스템의 보안을 전복할 수 있습니다.

더 높은 권한 상태가 필요한 경우 작업을 시스템 작업자 스레드 에서 안전하게 처리할 수 있는 작업 큐로 디스패치해야 합니다. 이렇게 하면 가장이 필요하지 않습니다.

SeImpersonateClientEx 루틴을 사용하여 스레드가 사용자를 가장하도록 할 수 있습니다.

보안 및 액세스 제어에 대한 자세한 내용은 드라이버 개발자를 위한 Windows 보안 모델 및 Windows SDK의 이러한 topics 대한 설명서를 참조하세요.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows XP
대상 플랫폼 유니버설
헤더 ntifs.h(Ntifs.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI 규정 준수 규칙 HwStorPortProhibitedDDIs(storport), PowerIrpDDis(wdm)

추가 정보

PsGetCurrentThread

PsReferenceImpersonationToken

PsRevertToSelf

SECURITY_IMPERSONATION_LEVEL

SeImpersonateClientEx