Почему открытие канала не работает в режиме заражения Perl?

StackOverflow https://stackoverflow.com/questions/964426

  •  12-09-2019
  •  | 
  •  

Вопрос

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

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.Ваша проблема рассматривается в первом предложении Очищая Свой Путь Раздел.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top