Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Einige Dateisysteme sind möglicherweise hilfreich, um Vorgänge im Namen des ursprünglichen Aufrufers auszuführen. Ein Netzwerkdateisystem muss z. B. die Sicherheitsinformationen des Aufrufers zum Zeitpunkt des Öffnens einer Datei erfassen, sodass ein späterer Vorgang mit den entsprechenden Anmeldeinformationen ausgeführt werden kann. Zweifellos gibt es zahlreiche andere Sonderfälle, in denen diese Art von Feature nützlich ist, sowohl innerhalb eines Dateisystems als auch in bestimmten Anwendungen.
Zu den wichtigen Routinen für den Identitätswechsel gehören:
PsImpersonateClientSeImpersonateClientEx--initiiert Identitätswechsel. Sofern kein bestimmter Thread angegeben ist, erfolgt der Identitätswechsel im aktuellen Threadkontext.
PsRevertToSelf--beendet den Identitätswechsel innerhalb des aktuellen Threadkontexts.
PsReferencePrimaryToken---enthält einen Verweis auf das primäre (Prozess)-Token für den angegebenen Prozess. Diese Funktion kann verwendet werden, um das Token für jeden Prozess im System zu erfassen.
PsDereferencePrimaryToken--veröffentlicht einen Verweis auf ein zuvor referenziertes primäres Token.
SeCreateClientSecurityFromSubjectContext--gibt einen Clientsicherheitskontext zurück, der für den Identitätswechsel aus einem Betreffkontext nützlich ist (z. B. für den FSD während der IRP_MJ_CREATE Verarbeitung bereitgestellt).
SeCreateClientSecurity- erstellt einen Clientsicherheitskontext basierend auf den Sicherheitsanmeldeinformationen eines vorhandenen Threads im System.
ImitateSecurityContext--imitiert Sicherheitskontext innerhalb ksecdd.sys, des Kernelsicherheitsdiensts.
RevertSecurityContext--beendet den Identitätswechsel innerhalb von ksecdd.sys, des Kernel-Sicherheitsdienstes.
Die Implementierung von Identitätsimitation ist einfach. Im folgenden Codebeispiel wird die grundlegende Impersonierung veranschaulicht.
NTSTATUS PerformSpecialTask(IN PFSD_CONTEXT Context)
{
BOOLEAN CopyOnOpen;
BOOLEAN EffectiveOnly;
SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
NTSTATUS Status;
PACCESS_TOKEN oldToken;
//
// We need to perform a task in the system process context
//
if (NULL == Context->SystemProcess) {
return STATUS_NO_TOKEN;
}
//
// Save the existing token, if any (otherwise NULL)
//
oldToken = PsReferenceImpersonationToken(PsGetCurrentThread(),
&CopyOnOpen,
&EffectiveOnly,
&ImpersonationLevel);
Status = PsImpersonateClient( PsGetCurrentThread(),
Context->SystemProcess,
TRUE,
TRUE,
SecurityImpersonation);
if (!NT_SUCCESS(Status)) {
if (oldToken)
PsDereferenceImpersonationToken(oldToken);
return Status;
}
//
// Perform task - whatever it is
//
//
// Restore to previous impersonation level
//
if (oldToken) {
Status = PsImpersonateClient(PsGetCurrentThread(),
oldToken,
CopyOnOpen,
EffectiveOnly,
ImpersonationLevel);
if (!NT_SUCCESS(Status)) {
//
// This is bad - we can't restore, we can't leave it this way
//
PsRevertToSelf();
}
PsDereferenceImpersonationToken(oldToken);
} else {
PsRevertToSelf();
}
return Status;
}
Es gibt zahlreiche Varianten dieses Identitätswechselcodes, die für Dateisystementwickler verfügbar sind, aber dies bietet eine grundlegende Abbildung der Technik.