Pasemos un momento a los permisos de proceso. ¿Recuerdas que te dije que cuando ejecutas el comando passwd con el bit de permiso SUID habilitado, ejecutarás el programa como root? Eso es cierto. Sin embargo, ¿significa eso que, dado que eres temporalmente root, puedes modificar las contraseñas de otros usuarios? ¡No, afortunadamente no!
Esto se debe a los muchos UIDs que Linux implementa. Hay tres UIDs asociados con cada proceso:
Cuando inicias un proceso, se ejecuta con los mismos permisos que el usuario o grupo que lo ejecutó. Esto se conoce como ID de usuario efectivo. Este UID se utiliza para otorgar derechos de acceso a un proceso. Así que, naturalmente, si Bob ejecutó el comando touch, el proceso se ejecutaría como él, y cualquier archivo que creara sería de su propiedad.
Hay otro UID, llamado ID de usuario real. Este es el ID del usuario que inició el proceso. Estos se utilizan para rastrear quién es el usuario que inició el proceso.
Un último UID es el ID de usuario guardado. Esto permite que un proceso cambie entre el UID efectivo y el UID real, y viceversa. Esto es útil porque no queremos que nuestro proceso se ejecute con privilegios elevados todo el tiempo; es una buena práctica usar privilegios especiales en momentos específicos.
Ahora vamos a unir todo esto observando el comando passwd una vez más.
Al ejecutar el comando passwd, tu UID efectivo es tu ID de usuario; digamos que es 500 por ahora. Oh, pero espera, recuerda que el comando passwd tiene el permiso SUID habilitado. Así que cuando lo ejecutas, tu UID efectivo ahora es 0 (0 es el UID de root). Ahora este programa puede acceder a archivos como root.
Digamos que pruebas un poco de poder y quieres modificar la contraseña de Sally. Sally tiene un UID de 600. Bueno, no tendrás suerte. Afortunadamente, el proceso también tiene tu UID real, en este caso 500. Sabe que tu UID es 500 y, por lo tanto, no puedes modificar la contraseña del UID 600. (Esto, por supuesto, siempre se omite si eres un superusuario en una máquina y puedes controlar y cambiar todo).
Dado que ejecutaste passwd, iniciará el proceso usando tu UID real y guardará el UID del propietario del archivo (UID efectivo), para que puedas cambiar entre los dos. No es necesario modificar todos los archivos con acceso de root si no es necesario.
La mayoría de las veces, el UID real y el UID efectivo son los mismos, pero en casos como el comando passwd, cambiarán.