Ejecutar aplicaciones de Qt con SUID

Ejecutar aplicaciones de Qt con SUID

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 este 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. Solo en aquellos que han sido diseñados e implementados con ese uso en mente. Por ese motivo, y porque Qt es una 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, solo debemos invocar QCoreApplication::setSetuidAllowed() con su único argumento a true, antes de instanciar el objeto de la aplicación:

int main(int argc, char *argv[])
{
    QApplication::setSetuidAllowed(true);
    QApplication app(argc, argv);

    MainWindow w;
    w.show();

    return app.exec();
}

Referencias