¿Por qué necesito setuid(0) dentro de un programa C setuid-root que llama a un programa administrativo con system()?

StackOverflow https://stackoverflow.com/questions/1051370

Pregunta

Tuve que hacer un truco sucio de Linux para que alguien pudiera iniciar una impresora con el cupsenable printername comando shell siendo un usuario no root.No quería que pudieran usar la totalidad del cupsenable sintaxis como root, así que escribí un contenedor C que desinfecta la entrada en argv[1] y llamadas system("cupsenable sanitizedprintername").

Hice el programa setuid root, pero aun así, cupsenable falló con "permiso denegado".Luego inserté un setuid(0) llamar antes system() y, he aquí, funcionó.

Ignore la cuestión de que existe una mejor manera de dar a los usuarios el control de la impresora.Probablemente haya una manera mejor.Lo que me interesa son las complejidades de chmod u+s vs. setuid(0) vs. system().¿Por qué se comportó de esa manera?

¿Fue útil?

Solución

De man system:

  

No use system() de un programa con privilegios de set-user-ID o set-group-ID, porque podrían usarse valores extraños para algunas variables de entorno para subvertir la integridad del sistema. Utilice la familia de funciones exec(3) en su lugar, pero no execlp(3) o execvp(3). De hecho, /bin/sh no funcionará correctamente desde programas con privilegios set-user-ID o set-group-ID en sistemas en los que man bash es bash versión 2, ya que bash 2 elimina los privilegios al inicio.

Y de -p:

  

Si el shell se inicia con la identificación efectiva del usuario (grupo) no es igual a la identificación real del usuario (grupo), y la opción SHELLOPTS no se proporciona, no se leen los archivos de inicio, las funciones del shell no se heredan entorno, la variable setuid(0), si aparece en el entorno, se ignora y la identificación de usuario efectiva se establece en la identificación de usuario real.

Parece que su <=> llamada eludió esa protección.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top