Lo que cambió es que se /bin/sh
convirtió bash
o se quedó, lo dash
que obtuvo una bandera adicional que -p
imita el comportamiento de bash.
Bash requiere que la -p
bandera no suelte el privilegio setuid como se explica en su página de manual :
Si el shell se inicia con el id. De usuario (grupo) efectivo no es igual al id. De usuario real (grupo), y no se proporciona la opción -p, no se leen archivos de inicio, las funciones de shell no se heredan del entorno, los SHELLOPTS , BASHOPTS, CDPATH y GLOBIGNORE, si aparecen en el entorno, se ignoran y la identificación de usuario efectiva se establece en la identificación de usuario real . Si se proporciona la opción -p en la invocación, el comportamiento de inicio es el mismo, pero el ID de usuario efectivo no se restablece.
Antes dash
no me importaba esto y permitía la ejecución de setuid (al no hacer nada para evitarlo) Pero Ubuntu 16.04 de dash
página de manual 's ha descrito una opción adicional, similar a bash
:
-p priv
No intente restablecer uid efectivo si no coincide con uid. Esto no está configurado de manera predeterminada para ayudar a evitar el uso incorrecto de los programas raíz setuid a través del sistema (3) o popen (3).
Esta opción no existía en upstream (que podría no haber sido reactivo a un parche propuesto * ) ni en Debian 9, pero está presente en Debian Buster, que recibió el parche desde 2018.
NOTA: como se explica por Stéphane Chazelas, ya es demasiado tarde para invocar "/bin/sh -p"
en system()
porque system()
se ejecuta nada dada a través de /bin/sh
lo que el setuid ya se deja caer. La respuesta de derobert explica cómo manejar esto, en el código anterior system()
.
* Más detalles sobre la historia aquí y allá .
system("bash -p")
se ejecuta, porsh -c "bash -p"
lo que los privilegios ya se han eliminado cuandobash
se ejecuta.