lunes, 8 de marzo de 2010

setuid

setuid - set user id

int setuid(uid_t uid);


Descripción: Permite asignar el valor uid al euid (id de usuario efectivo) y al uid(id de usuario real) del proceso que invoca la llamada. Se distinguen los siguientes casos.

El identificador de usuario efectivo del proceso que efectúa la llamada es el de root. En este caso uid=uid y euid=uid.

El identificador del usuario efectivo del proceso que efectúa la llamada no es el de root. En este caso euid=uid si se cumple alguna de las siguientes condiciones:

El valor del parámetro uid coincide con el valor del uid del proceso.

Esta llamada se está invocando dentro de la ejecución de un programa que tiene su bit S_ISUID activado y el valor del parámetro uid coincide con el valor del uid del propietario del programa.


Parámetros: uid – valor a cambiar de uid y/o euid.


Retorno:

0 si se ejecuta con éxito.

-1 si se produce un error.


Ejemplo:

1. Este ejemplo consiste en el programa para iniciar una sesión en el sistema. Este programa se ejecuta con el euid de root. Después de preguntar el nombre de usuario y la contraseña, consulta en el archivo /etc/passwd/ los valores de uid y gid, para hacer respectivamente, llamadas a setuid y setgid y que los identificadores uid, euid, gid, egid pasen a ser los del usuario que quiere iniciar la sesión de trabajo. Luego llama a exec para ejecutar un shell para que dé servicio al usuario. Este shell se va ejecutar con los identificadores de usuario y grupo, tanto reales como efectivos, de acuerdo con el usuario que ha iniciado su sesión.


2. Para el siguiente ejemplo se deben de tener los siguientes archivos en un directorio:

-El programa ejecutable, que pertenece al user1, con los siguientes permisos –rwsrwxrwx.

-Un archivo1, que pertenece al user1 con permisos –rwx------.

-Un archivo2, que pertenece al user2 con permisos –rwx------.


-rwsrwxrwx 1 user1 test 7163 2010-03-08 06:36 a.out

-rwx------ 1 user1 test 0 2010-03-08 06:25 archivo1.txt

-rwx------ 1 user2 test 0 2010-03-08 06:28 archivo2.txt


#include fcntl.h

#include sys/types.h

#include unistd.h

main()

{

int x, y;

int fd1,fd2;

x=getuid();

y=geteuid();

printf("\nUID= %d, EUID= %d \n", x, y);

fd1=open("archivo1.txt", O_RDONLY);

fd2=open("archivo2.txt", O_RDONLY);

printf("arch1= %d, arch2= %d \n", fd1, fd2);

setuid(x);

printf("Despues del setuid(%d): UID= %d, EUID= %d \n",x,getuid(),geteuid());

fd1=open("archivo1.txt", O_RDONLY);

fd2=open("archivo2.txt", O_RDONLY);

printf("arch1= %d, arch2= %d \n", fd1, fd2);

setuid(y);

printf("Despues del setuid(%d): UID= %d, EUID= %d \n",y,getuid(),geteuid());

}

El usuario user1 tiene uid=2001 y el user2 tiene uid=2003. Se consideran tres casos:

a. El user1 ejecuta el programa y se obtiene lo siguiente:

UID= 2001, EUID= 2001

arch1= 3, arch2= -1

Despues del setuid(2001): UID= 2001, EUID= 2001

arch1= 4, arch2= -1

Despues del setuid(2001): UID= 2001, EUID= 2001

Puesto que el euid de user1 se mantiene siempre en euid=2001, puede abrir archivo1 porque posee permiso de lectura, y el euid coincide con el uid del propietario que es él, es decir, euid=uid=2001. No puede abrir archivo2, porque pertenece al user2 cuyo uid=2003.

b. El user2 ejecuta el programa, se obtiene lo siguiente:

UID= 2003, EUID= 2001

arch1= 3, arch2= -1

Despues del setuid(2003): UID= 2003, EUID= 2003

arch1= -1, arch2= 4

Despues del setuid(2001): UID= 2003, EUID= 2001

Puesto que el programa tiene el sticky bit activado, al ejecutarlo el user2, su euid se hace igual al uid del propietario de este archivo que es user1, uid=2003 y euid=2001. Al cambiar si euid, user2 puede abrir el archivo1, pero no puede abrir el archivo2, a pesar de que es el propietario y se tiene permiso de lectura, ya que para efectos de permiso de apertura de archivo se trabaja con el uid. Tras ejecutar el programa la instrucción setuid(2003), el user2 pasa a tener uid=euid=2003, con lo que ahora puede abrir el archivo2. Tras ejecutar setuid(2001), el user2 pasa a tener de nuevo su euid=2001.

c. El user2 ejecuta el programa, pero ahora los permisos del archivo son –rwxrwxrwx, se obtiene lo siguiente:

UID= 2003, EUID= 2003

arch1= -1, arch2= 3

Despues del setuid(2003): UID= 2003, EUID= 2003

arch1= -1, arch2= 4

Despues del setuid(2003): UID= 2003, EUID= 2003

Se observa que puesto que su euid se mantiene siempre con el valor de 2003, puede abrir el archivo2 ya que posee el permiso de lectura y su euid coincide con el uid del propietario que es él, euid=uid=2003. Sin embargo no puede abrir archivo1 porque pertence al user1 con uid=2001.

No hay comentarios:

Publicar un comentario