¿Cuál es el significado de usar EUID? Si RUID y EUID de un proceso son 1000, 0 y si ejecutamos cualquier comando, el comando se ejecuta con un nivel de privilegios de 1000, ¿por qué?

¿Cuál es el significado de usar EUID? Si RUID y EUID de un proceso son 1000, 0 y si ejecutamos cualquier comando, el comando se ejecuta con un nivel de privilegios de 1000, ¿por qué?

Según tengo entendido,

  • RUIDO: el uid de la persona que llama al proceso se llama uid real.
  • EUID: uid efectivo significa privilegio permitido para ese proceso.
// setuid_file.c
#include<stdio.h>
int main(void)
{
        int uid;
        uid=getuid();
        printf("RUID : getuid() : %d\n",uid);
        uid=geteuid();
        printf("EUID : geteuid() : %d\n",uid);

        system("whoami");
        system("cat /etc/sudoers"); //only root user can access. here we can write any command which only root user can execute.
}
 
gcc setuid_file.c -o euid_zero
chmod ug+s euid_zero

Entonces, en la terminal raíz, configuré suid y guid para el ejecutable euid_zero. Ahora, si intento ejecutar el ejecutable usando un usuario normal, a continuación se muestra el resultado.

ll euid_zero
-rwsr-sr-x 1 root root 16768 Dec 30 00:59 euid_zero

whoami
kali

id
uid=1000(kali) gid=1000(kali) groups=1000(kali)

./euid_zero

RUID : getuid() : 1000
EUID : geteuid() : 0
kali
cat: /etc/sudoers: Permission denied
                                      

Entonces, aquí el EUID es cero, entonces tampoco podemos obtener el privilegio de root. Entonces, eso significa que tenemos privilegios de acceso según RUID, entonces, ¿cuál es el significado de EUID si no se utiliza EUID?

Respuesta1

Permite que el procesotemporalmenteaumentar y disminuir privilegios según sea necesario.

Por ejemplo, un demonio de servidor de archivos (smbd, ftpd) comienza como root, pero luego estableceeuid() en el EUID del usuario que ha iniciado sesión. Ahora puede ejecutarse la mayor parte del tiempo con el EUID del usuario que ha iniciado sesión, lo que permite que el kernel aplique comprobaciones de acceso a archivos, pero aún puede aumentar sus privilegios a EUID 0 para ciertas operaciones.

Pero tenga en cuenta que cuando usa system(), esto invoca el comando a través de /bin/sh,y el shell Bash elimina privilegios deliberadamentesiempre que detecte una discrepancia entre UID y EUID. Tu propio proceso setuidpodríade hecho, se abren /etc/shadowbien: sólo las herramientas iniciadas a través del sistema() no podrán hacerlo.

Si reemplaza todas las llamadas al sistema() con fork+exec, o incluso un simple open("/etc/shadow", O_RDONLY), verá que tener RUID=1000 pero EUID=0 le permite acceder al archivo. (Además, también verá idinformes de ambos conjuntos de UID/GID).

Respuesta2

En general, el EUID funciona como se espera, el "problema" aquí es system(3)su shuso. Consulte el manual (man 3 system):

system()De hecho, no funcionará correctamente desde programas con privilegios set-user-ID o set-group-ID en sistemas en los que /bin/shesté bashla versión 2: como medida de seguridad, bash2 elimina los privilegios al iniciar. (Debian usa un shell diferente, dash(1)que no hace esto cuando se invoca como sh.)

Resulta que el manual no está actualizado. Hoy en díadashse comporta comobash. Francamente, no sé qué shell usa tu sistema operativo.sh (etiquetaste, Ubuntu usa dash; pero kalien su pregunta puede sugerir Kali, no estoy seguro de qué usa Kali). Consulte con ls -l /bin/sh, probablemente sea dash. Independientemente de lo que sea, lo más probable es que pierda privilegios y esta es la razón por la que Permission deniedobservó.

Incluso si shno hubieras perdido privilegios, system()no sería una buena idea. El manual ya vinculado lo desaconseja explícitamente:

No lo use system()desde un programa privilegiado (un programa set-user-ID o set-group-ID, o un programa con capacidades) porque se podrían usar valores extraños para algunas variables de entorno para subvertir la integridad del sistema.

información relacionada