SUID y SGID: Ejecutar un programa con permisos elevados

Cuando hablamos sobre el archivo /etc/sudoers aprendimos que es posible permitir que un usuario o grupo obtenga permisos de superusuario para ejecutar ciertos programas de manera permanente. Sin embargo, a menudo es necesario permitir que un usuario común pueda ejecutar un binario propiedad de otro usuario, o que un programa en particular siempre se ejecute con privilegios administrativos sin importar quién lo corra. Para estas situaciones disponemos de los permisos especiales SUID y SGID (Set User ID y Set Group ID) como veremos en este post.

SUID y SGID

Si un archivo ejecutable posee el permiso SUID y root es el propietario de dicho archivo, el proceso resultante de su ejecución tendrá permisos de superusuario y contará con los mismos accesos de root en todo el sistema. Esto pone de relieve la necesidad de restringir al mínimo posible los archivos que cuenten con este permiso especial. Típicamente, el único programa que cuenta con SUID es passwd, el cual permite que cada usuario del sistema pueda cambiar su propia contraseña (por defecto, no la de los demás) sin tener que depender para ello de un administrador.

Lo mismo aplica para SGID en un archivo, aunque el mismo brinda acceso a que un proceso se ejecute con los privilegios del grupo propietario de dicho archivo.

Ambos permisos especiales (SUID y SGID) pueden agregar a un archivo de la siguiente manera:

SUID

  • Forma octal: agregar un 4 al principio de los permisos a asignar. Por ejemplo:
chmod 4755 miejecutable.sh
  • Forma ugo (user-group-others): utilizar u+s (user + suid) antes del nombre del archivo. Por ejemplo:
chmod u+s miejecutable.sh

SGID

  • Forma octal: agregar un 2 al principio de los permisos a asignar. Por ejemplo:
chmod 2755 otroejecutable.sh
  • Forma ugo (user-group-others): utilizar g+s (user + suid) antes del nombre del archivo. Por ejemplo:
chmod g+s otroejecutable.sh

Podemos ver ambos casos en la Fig. 1, donde el SUID y el SGID se indican con una letra s o una S:

SUID y SGID
Figura 1 – SUID y SGID

En el próximo post veremos ejemplos concretos del uso de SUID y SGID. ¡Nos leemos en breve!