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/shadow
bien: 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á id
informes de ambos conjuntos de UID/GID).
Respuesta2
En general, el EUID funciona como se espera, el "problema" aquí es system(3)
su sh
uso. 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/sh
estébash
la versión 2: como medida de seguridad,bash
2 elimina los privilegios al iniciar. (Debian usa un shell diferente,dash(1)
que no hace esto cuando se invoca comosh
.)
Resulta que el manual no está actualizado. Hoy en díadash
se comporta comobash
. Francamente, no sé qué shell usa tu sistema operativo.sh
(etiquetasteubuntu, Ubuntu usa dash
; pero kali
en 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 denied
observó.
Incluso si sh
no 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.