LINUX.ORG.RU

смена EUID в perl-скрипте


0

0

Приветствую всех :)

Ситуация: скрипт запускается из-под сишного суидного враппера:

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

Заранее спасибо.

anonymous
Ответ на: комментарий от vilfred

Проблема решилась использованием readdir вместо foreach...

Всем спасибо :)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.