2010-02-25 9 views
9

Imagine que tengo un proceso existente ejecutándose bajo Windows como un usuario particular. ¿Se permitiría que ese proceso tome su token actual (con algo como OpenThreadToken y DuplicateTokenEx), lo pase a otro proceso en la misma máquina (quizás a través de un socket de red o algún otro IPC), y luego espere que ese proceso sea capaz de usarlo para llamar a CreateProcessAsUser?Está pasando un token de seguridad de Windows entre procesos permitidos

Según la documentación que he leído (http://msdn.microsoft.com/en-us/library/ms682429%28VS.85%29.aspx), no he visto nada que prohíba esto, pero quizás el token solo puede ser utilizado por el hilo o el proceso que lo creó.

(¿Por qué?) Quiero que una solicitud web venga a IIS, se autentique, haga que IIS organice la suplantación del usuario remoto y luego pase el token de suplantación a otro servidor (en la misma máquina) para que el proceso del servidor puede realizar algunas comprobaciones de seguridad en el contexto del usuario remoto)

Respuesta

8

Sí, eso es posible. Puede usar DuplicateHandle para obtener un identificador que sea válido para el proceso de destino (envíe el nuevo valor de identificador al proceso de destino, para que lo sepa). Sin embargo, el proceso de destino aún debe tener los privilegios para usar el token en consecuencia. P.ej. SE_IMPERSONATE para suplantar al usuario y SE_ASSIGN_PRIMARY para ser utilizado por CPAU. Por supuesto, hay algunas excepciones que puede leer en MSDN para ImpersonateLoggedOnUser y CPAU.

5

No lo he probado, pero parece que esta es la misma pregunta asked here. La descripción parece tener sentido. Pase el ID del proceso a través del mecanismo que elija (por ejemplo, IPC), luego llame al OpenProcess, OpenProcessToken y finalmente al ImpersonateLoggedOnUser. El identificador resultante se puede pasar a CreateProcessAsUser. Bueno ... Sé que podría pasarse a esa función, pero no sé si tendría el resultado deseado. Interesante pregunta, sin embargo.

+0

Gracias por el enlace - muy útil –

4

¿Por qué no usar simplemente pipes con nombre, y luego llamar a ImpersonateNamedPipeUser() - es seguro y fácil! Tenga en cuenta que el proceso que hace la suplantación DEBE tiene el privilegio de Suplantación.

+0

oops- make that ImpersonateNamedPipeClient() :) –

+0

Una idea interesante, pero no estoy muy seguro de cómo organizarlo en mi caso (el servidor está en Java, y yo estaba planeando llama al CreateProcessAsUser a través de JNI cuando se bifurca un subproceso que necesita realizar algunas comprobaciones de seguridad). Aunque lo voy a analizar un poco más, gracias. –

Cuestiones relacionadas