TL;DR ¿Cómo funciona, por ejemplo, su o sudo sin PAM?
Hola,
Quiero jugar con suid y esas cosas, ya tengo la parte SUID y la parte SUID y esas cosas, pero el problema es que no me pide una contraseña y como quiero que pida una contraseña y encuentre su y sudo bastante destrozado en la fuente estoy muy confundido.
Revisé la documentación de setsuid() y getuid() y no parece que haya nada sobre la autenticación de contraseña.
¿Cómo se lograría la autenticación de contraseña sin PAM? Uso sudo sin pam y funciona bien, su con pam, ambos funcionan bien, estoy confundido sobre cómo lo haría funcionar
Este código C++ es lo que tengo ahora:
// a.cc // #include <iostream> #include <unistd.h> #include <cerrno> #include <cstring> int main(int argc, char *argv[]) { uid_t user = getuid(); if (setuid(0) == -1) { std::cerr << strerror(errno) << '\n'; return 1; } system(argv[1]); if (setuid(user) == -1) { std::cerr << errno << '\n'; return 1; } return 0; }y después de compilarlo con, por ejemplo, GCC y el archivo se llama a.cc:
$ g++ a.cc -oay dándole permisos de ejecución y SUID y dando la propiedad a root
$ sudo chown root:root ./a $ sudo chmod 4555 ./asimplemente funciona, pero sin autenticación de contraseña
$ ./a id uid=0(root) gid=1000(ari) groups=1000(ari),5(tty),10(wheel),27(video),78(kvm),250(portage)(ari es mi usuario)
Incluso después de cerrar sesión o ejecutar sudo -k para finalizar el tiempo de espera de sudo, aún funciona sin autenticación de contraseña.
Gracias por las respuestas de antemano
Primero, lo básico: cada proceso tiene un ID de usuario y un ID de grupo (voy a ignorar los atributos complementarios como los ID de grupo adicionales).
El ID de usuario 0 es raíz. Eso es todo, fin de la historia.
Cuando tiene un proceso cuyo ID de usuario es 0, es un proceso raíz. Fin de la historia.
La forma en que un proceso adquiere su ID de usuario 0 es irrelevante. Si el ID de usuario de un proceso es 0, es un proceso raíz y eso es todo.
Cuando realiza los movimientos para configurar un proceso setuid, ese setuid(0) es en sí mismo, ya está. Eres un proceso raíz. Eso es todo. No hay nada más que decir al respecto.
setsuid() y getuid() documentación y no parece que haya nada sobre la autenticación de contraseña.
Correcto. Todo lo que hacen es ajustar/actualizar el ID de usuario. Eso es todo. No hay nada más que eso.
Los procesos su y sudo hacen lo siguiente:
$ ls -al /bin/su /bin/sudo -rwsr-xr-x. 1 root root 57504 Aug 17 04:59 /bin/su ---s--x--x. 1 root root 185440 Aug 7 13:17 /bin/sudo¿Esto te parece familiar? Los permisos de su programa setuid hecho a mano se ven idénticos a esto, ¿no es así?
su caso, o una coincidencia aceptable en la configuración de sudo ). Si no lo hace, terminan sin que se lleve a cabo ninguna otra acción. Toda la lógica de validación de contraseñas, que involucra PAM o algún otro marco de autenticación, es implementada por los propios procesos su y sudo . A menos que proporcione credenciales de autenticación aceptables (lo que sea que signifique para su o sudo ), finalizan sin que se lleve a cabo ninguna otra acción. Una autenticación exitosa da como resultado un shell, o un comando ejecutado, pero eso es por la razón muy simple y elemental de que los propios programas su y sudo usaron setuid (el bit de permiso y la llamada al sistema) para adquirir privilegios de root, como el primer orden de negocio.