Perl 오염 모드: 안전하지 않은 종속성

Perl 오염 모드: 안전하지 않은 종속성

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

Perl 스크립트에서 bash 스크립트를 실행하고 있습니다.

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

변수에 출력을 캡처하겠습니다 $new. perltaint 모드가 켜져 있을 때 이 작업을 어떻게 수행할 수 있나요?

답변1

~에서페르세크:

   ...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.

따라서 외부 스크립트에서 데이터를 가져와서 작업해야 한다고 가정하면 얻은 데이터의 유효성을 검사해야 합니다. 나는 사지에 나가서 compareDate.sh주어진 날짜와 오늘 사이의 일수를 반환하도록 제안합니다. 처럼:

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

그러면 다음과 같이 청소할 수 있습니다.

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

코드는 단순히 변수를 지우는 것이 아니라(비록 우리의 검사가 너무 느슨하기는 하지만 가능합니다) 예상된 내용이 있는지 확인합니다. 누구든지 이것을 망친다면 다음을 포함하도록 하십시오:

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

그러면 확인이 실패합니다. 오직 숫자만이 통과할 수 있으며, 우리는 그것이 우리에게 문제를 일으키기를 원하지 않습니다. 분명히 더 복잡한 출력에는 더 많은 검증이 필요할 수 있습니다.


위 내용을 작성할 때 주로 코드를 보고 있었는데, $date_tmp코드에서 리터럴 문자열을 할당받았고, 오염되지 않아야 했습니다. 그러나 Jordan이 지적했듯이 오류 메시지는 백틱 실행이 전혀 발생하지 않는다는 것을 알려줍니다. 문제는 셸의 출력이 아니라 실행을 방해하는 일부 초기 오염입니다.

백틱의 유일한 변수는 이므로 $date_tmp할당과 백틱 사용 간에 유사하게 확인해야 합니다.

관련 정보