Tu comprensión de setuid es correcta. Cuando ejecuta un programa que tiene el bit suid, el proceso hereda los permisos del propietario de ese programa. El conocimiento que te falta es lo que hace el shell después de invocarlo. Muchas implementaciones populares de privilegios sh drop cuando se inician: restablecen su UID efectivo a su UID real. Esto incluye bash, dash, mksh y BusyBox sh, así que en Linux no verá nada más.
Cuando el programa ejecuta un shell (por ejemplo, llamando a la función system
desde la biblioteca estándar de C, o un equivalente en otro idioma), el shell comienza con privilegios elevados pero cae a los privilegios ordinarios antes de ejecutar cualquier código de usuario. Esto mitiga las vulnerabilidades en los programas de setuid donde el atacante solo ejecuta un comando de shell que no estaba destinado a ejecutarse con privilegios elevados (por ejemplo, porque el comando de shell estaba oculto en el código de la biblioteca que el programador de la aplicación no conocía). p>
Esto no mitiga las explotaciones en las que el atacante puede ejecutar código arbitrario. Es solo que para obtener un shell, tienes que trabajar un poco más duro que llamar a system
. Haga arreglos para llamar a algún intérprete diferente, por ej. ejecute execve("/usr/bin/perl", "/usr/bin/perl")
(bifurque primero si no desea terminar el programa principal).