securely access buffers in NtImpersonateThread()
Modified: trunk/reactos/ntoskrnl/ps/create.c
_____
Modified: trunk/reactos/ntoskrnl/ps/create.c
--- trunk/reactos/ntoskrnl/ps/create.c 2005-01-28 19:28:24 UTC (rev
13354)
+++ trunk/reactos/ntoskrnl/ps/create.c 2005-01-28 20:48:43 UTC (rev
13355)
@@ -177,56 +177,73 @@
IN HANDLE ThreadToImpersonateHandle,
IN PSECURITY_QUALITY_OF_SERVICE
SecurityQualityOfService)
{
+ SECURITY_QUALITY_OF_SERVICE SafeServiceQoS;
SECURITY_CLIENT_CONTEXT ClientContext;
PETHREAD Thread;
PETHREAD ThreadToImpersonate;
- NTSTATUS Status;
-
- Status = ObReferenceObjectByHandle (ThreadHandle,
- 0,
- PsThreadType,
- UserMode,
- (PVOID*)&Thread,
- NULL);
- if (!NT_SUCCESS (Status))
+ KPROCESSOR_MODE PreviousMode;
+ NTSTATUS Status = STATUS_SUCCESS;
+
+ PreviousMode = ExGetPreviousMode();
+
+ if(PreviousMode != KernelMode)
+ {
+ _SEH_TRY
{
- return Status;
+ ProbeForRead(SecurityQualityOfService,
+ sizeof(SECURITY_QUALITY_OF_SERVICE),
+ sizeof(ULONG));
+ SafeServiceQoS = *SecurityQualityOfService;
+ SecurityQualityOfService = &SafeServiceQoS;
}
-
- Status = ObReferenceObjectByHandle (ThreadToImpersonateHandle,
- 0,
- PsThreadType,
- UserMode,
- (PVOID*)&ThreadToImpersonate,
- NULL);
- if (!NT_SUCCESS(Status))
+ _SEH_HANDLE
{
- ObDereferenceObject (Thread);
+ Status = _SEH_GetExceptionCode();
+ }
+ _SEH_END;
+
+ if(!NT_SUCCESS(Status))
+ {
return Status;
}
+ }
- Status = SeCreateClientSecurity (ThreadToImpersonate,
- SecurityQualityOfService,
- 0,
- &ClientContext);
- if (!NT_SUCCESS(Status))
+ Status = ObReferenceObjectByHandle(ThreadHandle,
+ THREAD_IMPERSONATE,
+ PsThreadType,
+ PreviousMode,
+ (PVOID*)&Thread,
+ NULL);
+ if(NT_SUCCESS(Status))
+ {
+ Status = ObReferenceObjectByHandle(ThreadToImpersonateHandle,
+ THREAD_DIRECT_IMPERSONATION,
+ PsThreadType,
+ PreviousMode,
+ (PVOID*)&ThreadToImpersonate,
+ NULL);
+ if(NT_SUCCESS(Status))
{
- ObDereferenceObject (ThreadToImpersonate);
- ObDereferenceObject (Thread);
- return Status;
- }
+ Status = SeCreateClientSecurity(ThreadToImpersonate,
+ SecurityQualityOfService,
+ 0,
+ &ClientContext);
+ if(NT_SUCCESS(Status))
+ {
+ SeImpersonateClient(&ClientContext,
+ Thread);
+ if(ClientContext.ClientToken != NULL)
+ {
+ ObDereferenceObject (ClientContext.ClientToken);
+ }
+ }
- SeImpersonateClient (&ClientContext,
- Thread);
- if (ClientContext.ClientToken != NULL)
- {
- ObDereferenceObject (ClientContext.ClientToken);
+ ObDereferenceObject(ThreadToImpersonate);
}
+ ObDereferenceObject(Thread);
+ }
- ObDereferenceObject (ThreadToImpersonate);
- ObDereferenceObject (Thread);
-
- return STATUS_SUCCESS;
+ return Status;
}
/*
Show replies by date