Cambiar EUID del proceso en ejecución


12

En Linux, ¿cómo puedo cambiar el EUID del proceso en ejecución desde la línea de comandos (siempre que tenga acceso de root)?

Respuestas:


17

Si el proceso se ejecuta con privilegios de root , puede adjuntar gdb al proceso y llamar a seteuid desde ese proceso.

Ejemplo:

[root@user-desktop ~]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=user_u:system_r:unconfined_t

[root@user-desktop ~]# gdb /bin/bash $$
GNU gdb Fedora (6.8-27.el5)
# cut copyright & license statements
This GDB was configured as "x86_64-redhat-linux-gnu"...
# cut some initialization output    
0x00000036b0a99335 in waitpid () from /lib64/libc.so.6
(gdb) call seteuid(500)
$1 = 0 
(gdb) quit
The program is running.  Quit anyway (and detach it)? (y or n) y
Detaching from program: /bin/bash, process 29017

[root@user-desktop ~]# id
uid=0(root) gid=0(root) euid=500(user) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=user_u:system_r:unconfined_t

3
+1 para un enfoque creativo para lograr la tarea ...
quack quixote

Wow ... sí, eso es creativo. De hecho, no había pensado en unirme al proceso con un depurador. Con un poco de piratería "esperar", uno podría implementar "cheuid <processID> <EUID>" que funcionaría para ALGUNAS situaciones. Específicamente, creo que tanto el ejecutor de gdb como el proceso afectado deberían ser root ... así que esto es de utilidad limitada. AFAIK solo ejecuta gdb como root, conectándose a un proceso no root, el seteuid fallará, ya que se ejecutará con los privilegios del proceso de ejecución, no con los privilegios del depurador.
pbr

2

Si está hablando de un proceso que cambia su propio EUID, hay muchas maneras de hacerlo.

  • setuid (): como efecto secundario, establece EUID cuando lo utiliza un proceso con EUID de 0
  • seteuid ()
  • setreuid ()

Dependiendo del UID efectivo del programa y de si hay un UID guardado, puede cambiar entre dos valores EUID en un programa no root. Con un programa privilegiado de root, debe tener cuidado: debe decidir si el cambio debe ser irreversible y utilizar la función correcta para el trabajo. (Usar setuid () como root es irreversible).

Si está intentando cambiar un proceso que ya se está ejecutando desde un proceso separado, entonces no hay una forma estándar de hacerlo, y tampoco estoy seguro de que haya muchas formas no estándar. Es posible que pueda obtener alguna información en / dev / kmem, pero me viene a la mente la expresión 'hielo delgado'.


2

No hay forma de hacer esto "desde la línea de comandos" a cualquier proceso en ejecución.

Puedo decir eso con cierta seguridad; el único "tal vez" fue / proc y busqué allí (literalmente y a través de google) y me encontré con un callejón sin salida con respecto a cualquier cosa en / proc que permitiera cambiar el EUID. Puede APRENDER cuáles son las configuraciones de UID y GID en / proc / {pid} / status, pero no puede cambiarlas usando nada en / proc, al menos por lo que puedo decir.

Pero es bastante fácil hacer que algo así funcione, una forma de cambiar el EUID de un proceso, desde la línea de comandos, si controla el código fuente del proceso que desea cambiar. Puede implementar un controlador de señal para decir SIGUSR1 y hacer que el proceso cambie su propio EUID, sin embargo, lo necesita cuando recibe esa señal. Luego, simplemente enviaría el proceso con esa señal SIGUSR1, a través de "kill" ... desde la línea de comandos, como ha pedido ... y cambiaría su EUID por usted.

Puede que esto no sea lo que estabas pensando, pero ... es una respuesta a tu pregunta sobre cómo hacerlo ... y es la única respuesta en la que puedo pensar.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.