bash - guide - commands to install arch linux
chroot+execvp+bash (5)
Como dice Jason C, el intérprete ejecutado no es interactivo.
Su solución obligará a la shell a ser interactiva si acepta -i
para significar eso (y bash lo hace):
char *shellargv[] = { SHELL, "-i", "-login", ... };
execvp(SHELL, shellargv);
Sin embargo, quiero agregar que tradicionalmente un shell actuará como un shell de inicio de sesión si ARGV[0]
comienza con un guión.
char *shellargv[] = {"-"SHELL, "-i", ...};
execvp(SHELL, shellargv);
Sin embargo, por lo general, Bash detectará automáticamente si debe ejecutarse interactivamente o no. Su falla en su caso puede deberse a que faltan nodos /dev/*
.
Actualizar
¡Lo tengo! Ver mi solución (quinto comentario)
Aquí está mi problema:
He creado un pequeño binario llamado "jail" y en / etc / password lo he convertido en el shell por defecto para un usuario de prueba.
Aquí está el código fuente simplificado:
#define HOME "/home/user"
#define SHELL "/bin/bash"
...
if(chdir(HOME) || chroot(HOME)) return -1;
...
char *shellargv[] = { SHELL, "-login", "-rcfile", "/bin/myscript", 0 };
execvp(SHELL, shellargv);
Bueno, no importa cuánto lo intente, parece que, cuando mi usuario de prueba inicie sesión, / bin / myscript nunca se obtendrá. Del mismo modo, si dejo caer un archivo .bashrc
en el directorio de inicio del usuario, también se ignorará.
¿Por qué bash esnob estos tipos?
-
Algunas precisiones, no necesariamente relevantes, pero para aclarar algunos de los puntos señalados en los comentarios:
- El binario ''jail'' es realmente suid, lo que le permite hacer chroot () con éxito.
- He usado ''ln'' para poner a disposición los binarios apropiados, mi celda está bien acolchada :)
- El problema no parece estar en el usuario del chroot ... algo más es negligente.
El shell no es interactivo. Intente agregar -i a la lista de argumentos.
Gracias por su ayuda chicos,
Me lo imaginé:
Olvidé a setuid () / setgid () , chroot (), setuid () / setgid () de vuelta, luego pasé un entorno apropiado usando execve ()
Oh, y, si no paso ningún argumento para bash, será fuente ~ / .bashrc
Si paso "-l" si será fuente / etc / profile
¡Aclamaciones!
Me identifico con querer hacer esto tú mismo, pero si aún no lo has hecho, revisa jail chroot project y jailkit para ver algunas herramientas para crear un shell carcelero.
Para cuando su usuario inicie sesión y su shell intente obtener este archivo, se está ejecutando bajo su UID. La llamada al sistema chroot()
solo es utilizable por root, tendrás que ser más inteligente que esto.
Además, eliminar el directorio de inicio de un usuario hará que su caparazón sea inútil, ya que (a menos que tengan muchas cosas allí) no tendrán acceso a ningún archivo binario. Cosas útiles como ls
, por ejemplo.