¿Cómo ejecutar correctamente el script Perl con setuid () cuando se usa como cgi-bin?
Tengo un script de Perl que se llama a través de Apache o en la línea de comandos.
Para fines de prueba, le paso el nombre de usuario con el que quiero que funcione el script Perl y usoPOSIX::setuid
para configurar eluid
.
Si ejecuto el script desde la línea de comando, entonces eluid
está configurado correctamente:
use CGI::Pretty qw/:standard/;
use POSIX qw(setuid getuid);
...
my ($pwName, $pwCode, $pwUid, $pwGid, $pwQuota, $pwComment,
$pwGcos, $pwHome, $pwLogprog) = getpwnam($username);
if ((defined $pwUid) && (getuid() == $pwUid)) {
setuid($pwUid);
print header;
print Dumper use CGI::Pretty qw/:standard/;
use POSIX qw(setuid getuid);
...
my ($pwName, $pwCode, $pwUid, $pwGid, $pwQuota, $pwComment,
$pwGcos, $pwHome, $pwLogprog) = getpwnam($username);
if ((defined $pwUid) && (getuid() == $pwUid)) {
setuid($pwUid);
print header;
print Dumper $<;
}
else {
print header(-status => 401);
print "Could not setuid to correct uid (currently: )".getuid()."\n";
}
lt;;
}
else {
print header(-status => 401);
print "Could not setuid to correct uid (currently: )".getuid()."\n";
}
La salida de la línea de comandos muestra el correctouid
del especificado$username
, en vez deuid
de la cuenta de prueba que comenzó a ejecutar el script.
Si llamo el script a través de Apache, entonces eluid
permanece establecido en el id de laapache
usuario, y nunca cambia.
No creo que pueda usarsuExec
aquí, porque, después de leer la documentación:
No puedo poner una copia de este script enhttp://www.example.com/~username
para cada$username
. El script debe ejecutarse desde una ubicación, y necesito especificar eluid
desde dentro del guión.
Necesito que el script se ejecute como el nombre de usuario especificado en tiempo de ejecución, y no como un solo nombre de usuario especificado una vez en una directiva de host virtual en un archivo de configuración de Apache. Cambiar este archivo de configuración y reiniciar Apache cada vez que un nuevo usuario ejecuta este script no es realista.
¿Cómo obtengo un script Perl ejecutándose como cgi-bin para cambiar eluid
correctamente, cuando se usasetuid()
?