perl taint mode: Dependência insegura

1

ERROR: Insecure dependency in '' while running with -T switch at

Estou executando um script bash do script perl.

my $date_tmp="31-DEC-2016";
my $new  = '/bin/sh ./compareDate.sh "$date_tmp"';

Vou capturar a saída na minha variável $new . Como faço isso enquanto perl está sendo executado com o modo de corrupção?

    
por user139868 23.10.2015 / 15:16

1 resposta

4

De perlsec :

   ...otherwise the only way to bypass the
   tainting mechanism is by referencing subpatterns from a regular
   expression match.  Perl presumes that if you reference a substring
   using $1, $2, etc., that you knew what you were doing when you wrote
   the pattern.

Portanto, supondo que você precise obter dados de um script externo e agir, é necessário validar os dados obtidos. Eu vou sair em um membro e sugerir que o seu compareDate.sh é esperado para retornar o número de dias entre a data indicada e hoje. Semelhante a:

$ /bin/sh ./compareDate.sh "$date_tmp"
42

Então pode ser limpo assim:

my $new  = '/bin/sh ./compareDate.sh "$date_tmp"';    # TAINTED
if ($new =~ /^(\d+)$/) {
  $new = $1;                                          # Not tainted
} else {
  die "Unexpected output from compareDate.sh!\n";
}

O código não simplesmente desvendou a variável (embora isso seja possível por ser excessivamente permissivo com nossas verificações), ela validou que ela tinha o que era esperado. Se alguém tivesse mexido com isso para que ele contivesse:

$ /bin/sh ./compareDate.sh "$date_tmp"
42; /bin/rm -rf *;

Em seguida, a validação falhará. Apenas números podem passar e não esperamos que eles nos causem problemas. Obviamente, saídas mais complexas podem exigir mais validação.

Quando eu escrevi o acima, eu estava olhando para o código principalmente, e há $date_tmp é atribuída uma string literal do código e deve ser imaculada. Mas, como aponta o jordanm, a mensagem de erro está nos dizendo que a execução do backtick não está acontecendo. Em vez de a saída do shell ser o problema, alguma mancha anterior está impedindo sua execução.

A única variável nos backticks é $date_tmp , portanto, uma validação semelhante precisa acontecer entre a atribuição e o uso nos backticks.

    
por 23.10.2015 / 18:48

Tags