euid, ruid, suid
Variables de Identificación de Usuario
ruid
: El ID de usuario real denota al usuario que inició el proceso.euid
: Conocido como el ID de usuario efectivo, representa la identidad de usuario utilizada por el sistema para determinar los privilegios del proceso. Generalmente,euid
reflejaruid
, salvo en casos como la ejecución de un binario SetUID, dondeeuid
asume la identidad del propietario del archivo, otorgando permisos operativos específicos.suid
: Este ID de usuario guardado es crucial cuando un proceso de alto privilegio (normalmente en ejecución como root) necesita renunciar temporalmente a sus privilegios para realizar ciertas tareas, solo para luego recuperar su estado elevado inicial.
Nota Importante
Un proceso que no opera bajo root solo puede modificar su euid
para que coincida con el ruid
, euid
o suid
actual.
Comprensión de las Funciones set*uid
setuid
: Contrario a las suposiciones iniciales,setuid
modifica principalmenteeuid
en lugar deruid
. Específicamente, para procesos privilegiados, alinearuid
,euid
ysuid
con el usuario especificado, a menudo root, solidificando efectivamente estos IDs debido a la anulación desuid
. Se pueden encontrar información detallada en la página del manual de setuid.setreuid
ysetresuid
: Estas funciones permiten el ajuste sutil deruid
,euid
ysuid
. Sin embargo, sus capacidades dependen del nivel de privilegio del proceso. Para procesos no root, las modificaciones están restringidas a los valores actuales deruid
,euid
ysuid
. En contraste, los procesos root o aquellos con la capacidadCAP_SETUID
pueden asignar valores arbitrarios a estos IDs. Se puede obtener más información en la página del manual de setresuid y en la página del manual de setreuid.
Estas funcionalidades no están diseñadas como un mecanismo de seguridad, sino para facilitar el flujo operativo previsto, como cuando un programa adopta la identidad de otro usuario al alterar su ID de usuario efectivo.
Es importante destacar que si bien setuid
puede ser común para la elevación de privilegios a root (ya que alinea todos los IDs a root), diferenciar entre estas funciones es crucial para comprender y manipular los comportamientos de los ID de usuario en diferentes escenarios.
Mecanismos de Ejecución de Programas en Linux
Llamada al Sistema execve
execve
Funcionalidad:
execve
inicia un programa, determinado por el primer argumento. Toma dos argumentos de matriz,argv
para los argumentos yenvp
para el entorno.Comportamiento: Conserva el espacio de memoria del llamante pero actualiza la pila, el montón y los segmentos de datos. El código del programa es reemplazado por el del nuevo programa.
Preservación del ID de Usuario:
Los IDs de
ruid
,euid
y los IDs de grupo suplementarios permanecen sin cambios.euid
puede tener cambios sutiles si el nuevo programa tiene el bit SetUID establecido.suid
se actualiza desdeeuid
después de la ejecución.Documentación: Se puede encontrar información detallada en la página del manual de
execve
.
Función system
system
Funcionalidad: A diferencia de
execve
,system
crea un proceso hijo usandofork
y ejecuta un comando dentro de ese proceso hijo usandoexecl
.Ejecución de Comandos: Ejecuta el comando a través de
sh
conexecl("/bin/sh", "sh", "-c", comando, (char *) NULL);
.Comportamiento: Como
execl
es una forma deexecve
, opera de manera similar pero en el contexto de un nuevo proceso hijo.Documentación: Se pueden obtener más información en la página del manual de
system
.
Comportamiento de bash
y sh
con SUID
bash
y sh
con SUIDbash
:Tiene una opción
-p
que influye en cómo se trataneuid
yruid
enbash
.Sin
-p
,bash
estableceeuid
comoruid
si difieren inicialmente.Con
-p
, se conserva eleuid
inicial.Se pueden encontrar más detalles en la página del manual de
bash
.sh
:No posee un mecanismo similar a
-p
enbash
.El comportamiento con respecto a los IDs de usuario no se menciona explícitamente, excepto bajo la opción
-i
, que enfatiza la preservación de la igualdad deeuid
yruid
.Se dispone de información adicional en la página del manual de
sh
.
Estos mecanismos, distintos en su funcionamiento, ofrecen una amplia gama de opciones para ejecutar y transicionar entre programas, con matices específicos en la gestión y preservación de los IDs de usuario.
Pruebas de Comportamientos de ID de Usuario en Ejecuciones
Ejemplos tomados de https://0xdf.gitlab.io/2022/05/31/setuid-rabbithole.html#testing-on-jail, compruébalo para obtener más información
Caso 1: Uso de setuid
con system
setuid
con system
Objetivo: Comprender el efecto de setuid
en combinación con system
y bash
como sh
.
Código en C:
Compilación y Permisos:
Análisis:
ruid
yeuid
comienzan como 99 (nobody) y 1000 (frank) respectivamente.setuid
alinea ambos a 1000.system
ejecuta/bin/bash -c id
debido al enlace simbólico de sh a bash.bash
, sin-p
, ajustaeuid
para que coincida conruid
, lo que resulta en ambos siendo 99 (nobody).
Caso 2: Uso de setreuid con system
Código C:
Compilación y Permisos:
Ejecución y Resultado:
Análisis:
setreuid
establece tanto el ruid como el euid en 1000.system
invoca a bash, que mantiene los IDs de usuario debido a su igualdad, operando efectivamente como frank.
Caso 3: Uso de setuid con execve
Objetivo: Explorar la interacción entre setuid y execve.
Ejecución y Resultado:
Análisis:
ruid
sigue siendo 99, peroeuid
se establece en 1000, en línea con el efecto desetuid
.
Ejemplo de Código C 2 (Llamando a Bash):
Ejecución y Resultado:
Análisis:
Aunque
euid
se establece en 1000 porsetuid
,bash
restablece euid aruid
(99) debido a la ausencia de-p
.
Ejemplo de Código C 3 (Usando bash -p):
Ejecución y Resultado:
Referencias
Última actualización