Параметр не работает, если бит setuid включен в сценарии perl cgi - PullRequest
0 голосов
/ 02 января 2012

Когда разрешения этого скрипта равны u=rwx,g=rwx,o=r, скрипты работают просто отлично ... Однако мне нужно включить бит setuid, чтобы вызов smartctl возвращал желаемые данные вместо ошибки.

#!/usr/bin/perl

use strict;
use warnings;
use CGI qw(:standard);

my $device = param("device") || "sda";

print header("text/plain");

print "device = $device\n\n";


$ENV{"PATH"} = "/usr/sbin";
open( PS, "smartctl -A /dev/$device |" );
while( <PS> )
{
    print $_ . "\n";
}
close( PS );

Когда я устанавливаю разрешение на u=rwxs,g=rwxs,o=r, скрипт работает, когда в запросе не указано device. Но когда указано device, ничего не возвращается после print "device = $device\n\n";

1 Ответ

2 голосов
/ 02 января 2012

Вам нужно взглянуть на конфигурацию Perl.

perl -MConfig -e 'print "d_suidsafe = $Configu{d_suidsafe}\n"; }'

Если он ничего не говорит (ничего не видно после =), тогда Perl велели считать сценарии SUID небезопасными. Он обрабатывает их иначе от обычных скриптов. Проверьте систему 'taint' (опция командной строки -T); он должен предупредить о проблеме «внедрения скрипта», упомянутой ниже.


Рекомендации по кодированию:

  1. Используйте форму с тремя аргументами open.
  2. Проверьте, успешно ли 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, доверие пользователей вообще является серьезной проблемой. Все это вдвойне (если не умножить), когда доступ осуществляется через веб-браузер.

...