Приветствую всех :)Ситуация: скрипт запускается из-под сишного суидного враппера:
char param[PATH_MAX] = "/mail/qmail/bin/uforeach.pl";
int main(int argc, char *argv[])
{
execv(param, argv);
return(0);
}
Из-под скрипта видно, что он запущен с
UID=1015, GID=0, EUID=0, EGID=0
После запуска скрипт хочет сделать себе EUID=UID и EGID=GID (понизить привилегии до уровня вызвавшего пользователя). Делаю все, как написано в man perlsec на сей счет:
#!/usr/bin/perl -w
use strict;
use integer;
use English;
print STDERR "1. PID=$PID, UID=$UID, GID=$GID, EUID=$EUID, EGID=$EGID\n";
my @temp = ($EUID, $EGID);
$EUID = $UID;
$EGID = $GID; # initgroups() also called!
# Make sure privs are really gone
($EUID, $EGID) = @temp;
print STDERR "2. PID=$PID, UID=$UID, GID=$GID, EUID=$EUID, EGID=$EGID\n";
die "Can't drop privileges" unless $UID == $EUID && $GID eq $EGID;
print STDERR "Ok\n";
И не работает.
Пускаю от враппер от юзера с UID=1015, GID=0, права rwsr-xr-x. Права на сам скрипт - обычный root:wheel 755.
Имеем следующий output:
1. PID=79963, UID=1015, GID=0 0 0, EUID=0, EGID=0 0 0
2. PID=79963, UID=1015, GID=0 0 0, EUID=0, EGID=0 0 0
Can't drop privileges at /mail/qmail/bin/uforeach.pl line 14.
Ключик -U вместо/вместе с -w не помогает.
Что можно сделать ?
На всякий случай: все это делается для того, чтобы в суидном скрипте выполнить foreach (</path/*.ext>), чего этот чертов taint mode не позволяет. Вот и сооружаю open(KID, "-") - "create a child process with reduced privilege who does the dirty work for you", как в мане написано. Да только приоритет понизить не могу :(
FreeBSD 4.7-RELEASE
Perl, version 5.005_03 built for i386-freebsd
Заранее спасибо.