Perché l'apertura di una pipe non funziona nella modalità contaminata di Perl?

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

  •  12-09-2019
  •  | 
  •  

Domanda

La mia sceneggiatura originale è la seguente:

my $cmd = "dir";
open (H, "$cmd |");
my @result = <H>;
close (H);
print STDERR @result,"\n";

Questo script funziona bene.Se aggiungo la seguente riga allo script, non funziona:

$ENV{"LD_LIBRARY_PATH"} = "/opt/VRTSsfmh/lib";
$ENV{PATH}="/usr/bin:/bin:/sbin:/usr/sbin";
delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};

Cosa usa Perl quando viene chiamato pipe open?

L'aggiunta del seguente codice ha risolto il problema:

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

Soluzione

La tua domanda non è realmente correlata alla modalità taint.Tu imposti

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

Queste directory normalmente non esistono su una macchina Windows. dir è un comando interno di cmd.exe quindi per poterlo eseguire è necessario aggiungere la directory in cui risiede al percorso.

Ora, nota che il modo in cui lo fai contraddice l'intero scopo di impostare il percorso verso posizioni definite conosciute.È sicuramente possibile per un utente malvagio modificare questa variabile d'ambiente per puntare alla sua versione pericolosa di dir.

Il fatto che Windows non sia necessariamente installato in C:\Windows complica la scrittura di uno script a prova di contaminazione su Windows se si fa affidamento su uno qualsiasi dei componenti integrati della shell.

MODIFICARE: Ecco un breve programma di test che puoi utilizzare come base:

#!/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

Fondamentalmente, ciò di cui hai bisogno è che l'amministratore di sistema codifichi il percorso accettabile al momento dell'installazione e che gli utenti non attendibili non dispongano delle autorizzazioni di scrittura sullo script.

Altri suggerimenti

Modalità Taint è complicato. È davvero necessario leggere e comprendere perldoc perlsec . Il tuo problema è affrontato nella prima frase del ripulire il percorso sezione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top