Como executar com êxito o script Perl com setuid () quando usado como cgi-bin?
Eu tenho um script Perl que é chamado via Apache ou na linha de comando.
Para fins de teste, transmito o nome de usuário com o qual quero que o script Perl funcione e usoPOSIX::setuid
para definir ouid
.
Se eu executar o script na linha de comando, o comandouid
está definido corretamente:
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";
}
A saída da linha de comandos mostra o corretouid
do especificado$username
, ao invés deuid
da conta de teste que começou a executar o script.
Se eu chamar o script via Apache, então ouid
permanece definido como o ID doapache
usuário e nunca muda.
Não acredito que posso usarsuExec
aqui, porque, depois de ler a documentação:
Não consigo colocar uma cópia desse script emhttp://www.example.com/~username
para cada$username
. O script precisa ser executado em um local e eu preciso especificar ouid
de dentro do script.
Eu preciso que o script seja executado como o nome de usuário especificado em tempo de execução, e não como um nome de usuário único especificado uma vez em uma diretiva de host virtual em um arquivo de configuração do Apache. Alterar esse arquivo de configuração e reiniciar o Apache toda vez que um novo usuário executa esse script não é realista.
Como faço para obter um script Perl executando como um cgi-bin para alterar ouid
corretamente, ao usarsetuid()
?