以前に汚染されていないデータが再び汚染されるにはどうすればよいですか?

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

  •  01-10-2019
  •  | 
  •  

質問

ここには、根本的な原因をよく理解していないという謎が少しあります。スクリプトからUnlinkを呼び出しようとしたときに、-t Switchで実行中に、Unlinkの不安定な依存関係を取得しています。これは、Perlが汚染されたデータを使用しようとしていると言っていることを意味していることに気づいているため、それは謎ではありません。謎は、このデータが以前は別のスクリプトで汚染されていなかったため、問題なくディスクに保存されていました。

次の方法は次のとおりです...最初のスクリプトは、次のものを使用してバイナリファイル名を作成します

# For the binary file upload
my $extensioncheck = '';

my $safe_filename_characters = "a-zA-Z0-9_.";
  if ( $item_photo )  
  { 
    # Allowable File Type Check
    my ( $name, $path, $extension ) = fileparse ( $item_photo, '\..*' );
    $extensioncheck = lc($extension);
    if (( $extensioncheck ne ".jpg" ) && ( $extensioncheck ne ".jpeg" ) &&
        ( $extensioncheck ne ".png" ) && ( $extensioncheck ne ".gif" ))
    {
      die "Your photo file is in a prohibited file format.";  
    }

    # Rename file to Ad ID for adphoto directory use and untaint
    $item_photo = join "", $adID, $extensioncheck;
    $item_photo =~ tr/ /_/;  
    $item_photo =~ s/[^$safe_filename_characters]//g;  
    if ( $item_photo =~ /^([$safe_filename_characters]+)$/ ) { $item_photo = $1; }
    else {  die "Filename contains invalid characters"; }  
    }

$ adidは、LocalTime(Time)関数を使用してスクリプト自体によって生成されるため、汚染されないでください。 $ item_photoは、汚染チェックの前に$ adidと$ extensionチェックを使用して再割り当てされているため、新しい$ item_photoは汚染されていません。 $ item_photo自体がスクリプトで後者をリンクすることに問題がないため、私はこれを知っています。 $ item_photoは、Unlink関数を使用して投げられる前に、ImageMagickを使用して他の3つの画像ファイルを作成するのに十分な長さのみ使用されます。 $ item_photoのImageMagick処理から作成された3つのファイル名は、単にそうであるように作成されます。

$largepicfilename  = $adID . "_large.jpg";
$adpagepicfilename = $adID . "_adpage.jpg";
$thumbnailfilename = $adID . "_thumbnail.jpg";

パスはURLを作成するために新しいファイル名に加えられ、スクリプトの上部で定義されているため、汚染されません。これらのファイルのURLはそのように生成されます。

my $adpageURL = join "", $adpages_dir_URL, $adID, '.html';
my $largepicURL  = join "", $adphotos_dir_URL, $largepicfilename;
my $adpagepicURL = join "", $adphotos_dir_URL, $adpagepicfilename;
my $thumbnailURL = join "", $adphotos_dir_URL, $thumbnailfilename;

それから私はそれらを記録に書き、すべてが汚染されていないことを知っています。

今、ねじれた部分が来ます。 2番目のスクリプトでは、これらのファイルを読み取り、Unlink関数を使用して削除されます。これは、「Insecue依存関係」フラグを取得する場所です。

# Read in the current Ad Records Database
open (ADRECORDS, $adrecords_db) || die("Unable to Read Ad Records Database");
flock(ADRECORDS, LOCK_SH);
seek (ADRECORDS, 0, SEEK_SET);
my @adrecords_data = <ADRECORDS>;
close(ADRECORDS);

# Find the Ad in the Ad Records Database
ADRECORD1:foreach $AdRecord(@adrecords_data)
{
  chomp($AdRecord);
  my($adID_In, $adpageURL_In, $largepicURL_In, $adpagepicURL_In, $thumbnailURL_In)=split(/\|/,$AdRecord);

  if ($flagadAdID ne $adID_In) { $AdRecordArrayNum++; next ADRECORD1 }
  else
  {
    #Delete the Ad Page and Ad Page Images
    unlink ("$adpageURL_In");
    unlink ("$largepicURL_In");
    unlink ("$adpagepicURL_In");
    unlink ("$thumbnailURL_In");
    last ADRECORD1;
  }
}

私は彼らを再び塗りつぶすことができるか、データが安全であることを知って彼らを吹き飛ばすことさえできることを知っていますが、それはポイントではありません。私が望んでいるのは、これが最初に起こっている理由を理解することです。これは、この以前に汚染されていないデータが現在汚染されていると見なされていることを理解していないからです。私がこの接続を見逃している場所を啓発するための助けは本当に感謝されるでしょう。なぜなら、私はそれを修正するためにハックを書くだけでなく、これを本当に理解したいからです。

役に立ちましたか?

解決

ファイルにデータを保存しても、データに「汚染された」ビットは保存されません。それは単なるデータであり、外部ソースからのものなので、Perlがそれを読むと自動的に汚染されます。 2番目のスクリプトでは、データを明示的に抑制する必要があります。

結局のところ、他のいくつかの悪意のあるプログラムは、2番目のスクリプトがそれを読む機会がある前に、ファイル内のデータを変更した可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top