• Miércoles 20 de Noviembre de 2024, 18:36

Autor Tema:  Problema con suid bit, y envoltorios en C++  (Leído 1422 veces)

shuras

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Problema con suid bit, y envoltorios en C++
« en: Sábado 23 de Agosto de 2008, 01:20 »
0
Buenas. Mi objetivo es conseguir que una aplicación Web (un script en PHP) que se ejecuta con el usuario w-w-w-data (estamos hablando de Apache2 en Linux) sea capaz de ejecutar un programa, que es un guión shell (bash) , con un usuario predeterminado (en este caso "cuenta").
Para intentar conseguir esto lo que hago es que el script PHP usa la función exec llamando al programa. Bueno en vez de llamar al guión shell directamente, llamo a una envoltura que he hecho en C++. Esto es así, porque como muchos sabreis, en las nuevas versiones del kernel no se permite activar el bit suid en scripts, sólo en programas. Por tanto hice un programa en C++ que basicamente se encargaba de ejecutar un exec con los parametros de entrada para ejecutar el script shell o lo que le pases.
Dicho envoltorio tiene además activado el bit s y pertenece al usuario "cuenta" y al grupo "cuenta".

A continuación pongo el código del programa:

Código: Text
  1. #include <cstdio>
  2. #include <unistd.h>
  3.  
  4. int main(int argc, char** argv)
  5. {
  6.         if(argc>1)
  7.                 execv(argv[1], argv);
  8.         else
  9.                 return -1;
  10. }
  11.  
  12.  


Bueno, en resumidas cuentas, no consigo mi objetivo. Ejecuto la envoltura como el usuario w-w-w-data y dentro del script hago un whoami y dice que sigue siendo w-w-w-data. He probado también a poner como cabecera de los guiones shell "#!/bin/bash -p" (la opción -p) pero tampoco ha dado resultado.
Yo creo que en teoría debería funcionar. ¿Alguien sabe que está pasando? ¿Alguna idea?

Gracias.

PD: el foro no me deja poner tres w seguidas, se queja de que no tengo privilegios para poner enlaces :)

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Problema con suid bit, y envoltorios en C++
« Respuesta #1 en: Sábado 23 de Agosto de 2008, 02:43 »
0
execv() no ejecuta otro programa, sino que sustituye la imagen del actual proceso por otro. Por tanto el usuario sigue siendo el mismo, porque no se ejecuta desde un principio por tanto el kernel no tiene en cuenta el bit SetUID. Tienes que usar exec().

EDIT: Perdón, tienes que usar system()  :o

shuras

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Problema con suid bit, y envoltorios en C++
« Respuesta #2 en: Sábado 23 de Agosto de 2008, 13:11 »
0
Muchas gracias m0skit0, con tu ayuda he resuelto el problema.
Usando system(), y añadiendo a los guiones shell la opción -p (#!/bin/bash -p) consigo que funcione. Por si esta misma duda puede ayudar a alguien más, es importante decir que sin la opción "-p" no me funciona.

Un saludo, muchas gracias.

PD: Por si alguien quiere el programa, aunque es muy chorra lo pongo:

Código: Text
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <string>
  4. #include <iostream>
  5.  
  6. using namespace std;
  7.  
  8. int main(int argc, char** argv)
  9. {
  10.     string comando;
  11.  
  12.     if(argc<2)
  13.         return -1;
  14.  
  15.     for(int i=1;i<argc;i++)
  16.     {
  17.         comando.append(argv[i]);
  18.         if(i+1 != argc)
  19.             comando.append(" ");
  20.     }
  21.  
  22.     system(comando.c_str());
  23. }
  24.