El bit setuid parece no tener efecto en bash

14

Estaba experimentando un poco y noté algo extraño: establecer el bit setuid en una copia de bash ubicado en /usr/bin/bash-testparece no tener ningún efecto. Cuando ejecuté una instancia de bash-test, mi directorio de inicio no estaba configurado /rooty cuando ejecuté el whoamicomando bash-test, mi nombre de usuario no se informó como tal root, lo que sugiere que bash-testno se estaba ejecutando como root. Sin embargo, si configuré el bit setuid whoami, se me informó que era root en cualquier shell, como se esperaba.

Intenté configurar el bit setuid /usr/bin/bashtambién y observé el mismo comportamiento.

¿Por qué bash no se ejecuta como root cuando configuro el bit setuid en él? ¿Podría Selinux tener algo que ver con esto?


fuente
1
encontrará información adicional sobre el setuid en esta pregunta.
Anthon
Ver también Setuid Desmitificado por Chen, Dean y Wagner. Es un documento viejo pero todavía se aplica.

Respuestas:

21

La explicación es un poco molesta: bash es la razón. stracees nuestro amigo (debe ser SUID root para que esto funcione):

getuid()                                = 1000
getgid()                                = 1001
geteuid()                               = 0
getegid()                               = 1001
setuid(1000)                            = 0
setgid(1001)                            = 0

bash detecta que se ha iniciado la raíz SUID (UID! = EUID) y usa su poder raíz para desechar esta energía, restableciendo EUID a UID. Y más tarde incluso FSUID, solo para estar seguro ...:

getuid()                                = 1000
setfsuid(1000)                          = 1000
getgid()                                = 1001
setfsgid(1001)                          = 1001

Al final: no hay posibilidad. Debe comenzar bash con la raíz UID (es decir, sudo).

Editar 1

La página del manual dice esto:

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 los 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 el ID de usuario efectivo se establece en el ID 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.

Pero esto no funciona para mí. -pni siquiera se menciona entre las opciones de inicio. También lo intenté --posix; tampoco funcionó.

Hauke ​​Laging
fuente
2

En cualquier caso, un programa raíz SUID no se ejecuta con el entorno de la raíz ( $HOMEconfiguración del shell, lo que sea), se ejecuta con poderes de raíz (es decir, puede eliminar cualquier archivo, cambiar cualquier permiso, etc.).

vonbrand
fuente