Почему открытие канала не работает в режиме загрязнения Perl? - PullRequest
1 голос
/ 08 июня 2009

Мой оригинальный сценарий выглядит следующим образом:

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, когда вызывается открытие канала?

Добавление следующего кода устранило проблему:

if ($^O =~ /Win32/i) 
{
    $ENV{'SystemRoot'} =~ /([A-Z]:(\\[A-Za-z0-9_]+)+)/;
    my $system32_dir = $1."\\system32";
    $ENV{'PATH'} = $system32_dir;
}

Ответы [ 2 ]

7 голосов
/ 08 июня 2009

Ваш вопрос на самом деле не связан с режимом порчи. Вы установили

$ENV{PATH}="/usr/bin:/bin:/sbin:/usr/sbin";

Эти каталоги обычно не существуют на компьютере с Windows. dir является внутренней командой cmd.exe, поэтому для ее выполнения необходимо добавить каталог, в котором она находится, по пути.

Теперь обратите внимание, что то, как вы это делаете, противоречит всему смыслу установки пути к известным определенным местам. Для гнусного пользователя определенно возможно изменить эту переменную среды так, чтобы она указала на его опасную версию 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

Обычно системному администратору нужно жестко задавать допустимый путь во время установки, а недоверенным пользователям не иметь права на запись в сценарий.

0 голосов
/ 08 июня 2009

Режим испорчен сложен. Вы действительно должны прочитать и понять perldoc perlsec. Ваша проблема решена в первом предложении раздела Очистка вашего пути .

...