Ejecutar aplicaciones de Qt con SUID

Jesús Torres
May 25, 2015 · 2 min read

Para los casos en los que necesitamos ejecutar un programa con un usuario distinto al que hemos usado para autenticarnos en el sistema, los sistemas estilo UNIX como Linux nos ofrecen el mecanismo SUID o SetUID. Este es básicamente un permiso que puede asignarse a los ejecutables para permitir que se lancen con los privilegios del usuario que es propietario del mismo y no con los del usuario que intenta ejecutarlo.

A un fichero con el bit SetUID activado se le identifica por una 's' en el listado de archivos del directorio que lo contiene:

# ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 51128 jul 18 2014 /usr/bin/passwd

Por eso el programa passwd, del ejemplo anterior, se ejecutará siempre con privilegios de root, independientemente del usuario que invoque dicho comando.

Lo que ocurre realmente es que el usuario real del proceso de passwd es el usuario que invocó el comando, pero el usuario efectivo —el usado para comprobar los privilegios y permisos del proceso— es el propietario del archivo —que en nuestro ejemplo es root—.

SUID con aplicaciones Qt

El activar el bit SetUID en una aplicación entraña ciertos riesgos. Un programa mal diseñado puede facilitar que un atacante tome el control del proceso, permitiendo que éste lo use para hacer las tareas que él quiera. Si dicho proceso dispone de privilegios de root gracias al permiso SetUID, el atacante tendrá acceso sin ningún límite a todo el sistema.

Por lo tanto, los usuarios y administradores no deben activar el bit SetUID en cualquier programa. Sólo en aquellos que han sido diseñados e implementados con ese uso en mente. Por ese motivo y porque Qt es un librería muy grande que si no se usa con cuidado ofrece múltiples vectores de ataque, las aplicaciones desarrolladas con este framework desde la versión 5.3 no pueden ejecutarse con el permiso SetUID.

Concretamente, la clase QCoreApplication es la responsable de comprobar si el usuario real del proceso es distinto del efectivo. Si tal cosa ocurre, Qt abortará la aplicación con el error FATAL: The application binary appears to be running setuid, this is a security hole.

Si estamos seguros de que nuestra aplicación es segura y que por tanto puede ser usada con permiso SetUID si el usuario lo desea, sólo debemos invocar QCoreApplication::setSetuidAllowed() con su único argumento a true, antes de instanciar el objeto de la aplicación:

Referencias

Jesús Torres

Docente e Investigador de la Universidad de La Laguna

Jesús Torres

Written by

Docente e Investigador de la Universidad de La Laguna.

Jesús Torres

Docente e Investigador de la Universidad de La Laguna

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade