Почему открытие канала не работает в режиме заражения Perl?
Вопрос
Мой оригинальный сценарий выглядит следующим образом:
my $cmd = "dir";
open (H, "$cmd |");
my @result = <H>;
close (H);
print STDERR @result,"\n";
Этот скрипт работает нормально.Если я добавлю следующую строку в скрипт, он не сработает:
$ENV{"LD_LIBRARY_PATH"} = "/opt/VRTSsfmh/lib";
$ENV{PATH}="/usr/bin:/bin:/sbin:/usr/sbin";
delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};
Что использует Perl при вызове pipe open?
Добавление следующего кода исправило проблему:
if ($^O =~ /Win32/i)
{
$ENV{'SystemRoot'} =~ /([A-Z]:(\\[A-Za-z0-9_]+)+)/;
my $system32_dir = $1."\\system32";
$ENV{'PATH'} = $system32_dir;
}
Решение
Ваш вопрос на самом деле не связан с режимом заражения.Вы устанавливаете
$ENV{PATH}="/usr/bin:/bin:/sbin:/usr/sbin";
Эти каталоги обычно не существуют на компьютере с Windows. dir
является cmd.exe внутренней командой, поэтому, чтобы иметь возможность выполнить это, вам нужно добавить каталог, в котором она находится, в path.
Теперь обратите внимание, что способ, которым вы это делаете, противоречит самому смыслу задания пути к известным определенным местоположениям.Определенно, нечестивый пользователь может изменить эту переменную среды, чтобы указать на свою опасную версию dir
.
Тот факт, что Windows не обязательно установлена в C:\Windows усложняет написание скрипта, защищенного от заражения, в Windows, если вы полагаетесь на любой из встроенных компонентов оболочки.
Редактировать: Вот короткая тестовая программа, которую вы можете использовать в качестве базовой:
#!/usr/bin/perl -T
use strict;
use warnings;
$ENV{PATH} = join(';', qw(C:\Windows C:\Windows\System32) );
delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};
open my $pipe_h, '-|', 'dir'
or die "Cannot open pipe to dir: $!";
print while <$pipe_h>;
close $pipe_h
or die "Cannot close pipe to dir: $!";
__END__
C:\Temp> perl -T v.pl
...
2009/05/25 08:58 AM 3,584 zzz.exe
64 File(s) 32,125,365 bytes
14 Dir(s) 39,251,894,272 bytes free
По сути, все, что вам нужно, - это чтобы системный администратор жестко закодировал приемлемый путь во время установки, а ненадежные пользователи не имели прав на запись в скрипте.
Другие советы
Режим заражения сложен.Вы действительно должны прочитать и понять perldoc perlsec
.Ваша проблема рассматривается в первом предложении Очищая Свой Путь Раздел.