Вам нужно взглянуть на конфигурацию Perl.
perl -MConfig -e 'print "d_suidsafe = $Configu{d_suidsafe}\n"; }'
Если он ничего не говорит (ничего не видно после =
), тогда Perl велели считать сценарии SUID небезопасными. Он обрабатывает их иначе от обычных скриптов. Проверьте систему 'taint' (опция командной строки -T
); он должен предупредить о проблеме «внедрения скрипта», упомянутой ниже.
Рекомендации по кодированию:
- Используйте форму с тремя аргументами
open
.
- Проверьте, успешно ли
open
.
Как это:
open my $PS, "-|", "smartctl -A /dev/$device"
or die "Could not popen smartctl: $!";
Ну, возможно, нет die
, но сообщайте об ошибке аккуратно и не используйте неоткрытый дескриптор файла.
if (open my $PS, "-|", "smartctl -A /dev/$device")
{
while (<$PS>)
{
print "$_\n";
}
close $PS;
}
else
{
print "Failed to open device: $!";
}
Обратите внимание, что вам нужно отклонить или дезинфицировать ввод лица, написавшего: sda; cp /bin/sh /tmp/...; chmod 6777 /tmp/...
в поле параметра устройства. Это немного похоже на SQL-инъекцию, только на этот раз это «инъекция Perl-скрипта». Они могут быть более жестокими, чем это: sda; rm -fr / 2>/dev/null &
делает довольно хорошую работу по очистке системы файлов и каталогов, которую может изменить пользователь, для которого установлен скрипт. Вы не можете доверять пользователям ни на дюйм в лучшие времена. В программе setuid, доверие пользователей вообще является серьезной проблемой. Все это вдвойне (если не умножить), когда доступ осуществляется через веб-браузер.