Question

J'ai un peu un mystère que je ne comprends pas tout à fait la cause racine. Je reçois une « dépendance non sécurisée dans unlink lors de l'exécution avec interrupteur -T » en essayant d'invoquer unlink à partir d'un script. Ce n'est pas le mystère, comme je me rends compte que ce moyen Perl est de dire que je suis en train d'utiliser des données souillées. Le mystère est que ces données étaient déjà viciée dans un autre script qui a sauvé sur disque sans aucun problème.

Voici comment ça se passe ... Le premier script crée un nom de fichier binaire en utilisant les éléments suivants

# 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"; }  
    }

$ est généré par numéro de l'annonce du script lui-même en utilisant une fonction localtime (temps), donc il ne devrait pas être viciée. $ Item_photo est réassigné à l'aide $ et $ numéro de l'annonce extensioncheck avant que le chèque taint, de sorte que le nouveau $ item_photo est maintenant viciée. Je sais cela parce que $ item_photo lui-même n'a pas de problème avec lui-même unlink celui-ci dans le script. $ Item_photo est seulement utilisé assez longtemps pour créer trois autres fichiers d'image en utilisant ImageMagick avant qu'il ne soit jeté à l'aide de la fonction unlink. Les trois noms de fichiers créés à partir du traitement de ImageMagick de item_photo sont créés simplement $ comme ainsi.

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

Les chemins sont préfixés aux nouveaux noms de fichiers pour créer les URL, et sont définis en haut du script, de sorte qu'ils ne peuvent pas être entachées aussi. Les URL de ces fichiers sont générés comme ceci.

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;

Alors je les écris au dossier, sachant que tout est viciée.

Maintenant vient la partie çela. Dans un second script que je lis ces fichiers dans à supprimer en utilisant la fonction unlink, et c'est là où je reçois mon drapeau « dépendance 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;
  }
}

Je sais que je peux juste untaint eux à nouveau, ou même simplement les souffler à travers sachant que les données sont en sécurité, mais ce n'est pas le point. Ce que je veux est de comprendre pourquoi cela se produit en premier lieu, comme je ne comprends pas comment cela les données déjà viciée est maintenant considéré comme contaminé. Toute aide à éclairer où je manque cette connexion serait vraiment apprécié, parce que je veux vraiment comprendre ce plutôt que de simplement écrire le hack pour le corriger.

Était-ce utile?

La solution

Enregistrement des données dans un fichier ne enregistre un bit « contaminé » avec les données. Il est juste des données, provenant d'une source externe, donc quand Perl le lit il devient automatiquement viciée. Dans votre second script, vous devrez untaint explicitement les données.

Après tout, un autre programme malveillant aurait pu changer les données dans le fichier avant le second script a une chance de le lire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top