2010-08-28 40 views
2

J'ai un peu un mystère ici que je ne comprends pas bien la cause de. Je reçois une 'dépendance Insecure in unlink en cours d'exécution avec -T switch' lorsque j'essaie d'invoquer unlink à partir d'un script. Ce n'est pas le mystère, car je me rends compte que cela signifie que Perl dit que j'essaie d'utiliser des données corrompues. Le mystère est que ces données étaient auparavant intactes dans un autre script qui l'a enregistré sur le disque sans aucun problème.Comment mes données précédemment non corrompues peuvent-elles être contaminées à nouveau?

Voilà comment il va ... 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"; } 
    } 

$ numéro de l'annonce est généré par le script lui-même en utilisant une fonction localtime (temps), donc il ne devrait pas être entaché. $ item_photo est réaffecté à l'aide de $ adID et $ extensioncheck AVANT la vérification des fautes, de sorte que le nouveau $ item_photo est maintenant non corrompu. Je le sais parce que $ item_photo lui-même n'a aucun problème à se dissocier de ce dernier dans le script. $ item_photo n'est utilisé que assez longtemps pour créer trois autres fichiers image en utilisant ImageMagick avant d'être lancé avec la fonction unlink. Les trois noms de fichiers créés à partir du traitement ImageMagick de $ item_photo sont créés simplement comme ceci.

$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ées comme cela. Ensuite, je les écris à l'enregistrement, sachant que tout n'est pas entaché.

Vient maintenant la partie vissée. Dans un deuxième script, j'ai lu ces fichiers à supprimer en utilisant la fonction unlink, et c'est là que j'obtiens mon drapeau 'Insecue dependency'.

# 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 les untaint à 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, c'est comprendre POURQUOI cela se passe en premier lieu, car je ne comprends pas comment ces données auparavant intactes sont maintenant considérées comme corrompues. Toute aide pour éclaircir l'endroit où je manque cette connexion serait vraiment appréciée, parce que je veux vraiment comprendre cela plutôt que d'écrire simplement le hack pour le réparer.

Répondre

4

L'enregistrement de données dans un fichier n'enregistre aucun bit "corrompu" avec les données. C'est juste des données, provenant d'une source externe, donc quand Perl les lit, il devient automatiquement corrompu. Dans votre deuxième script, vous devrez explicitement supprimer les données. Après tout, un autre programme malveillant pourrait avoir changé les données dans le fichier avant que le deuxième script ait une chance de le lire.

+0

Je dois à nouveau parcourir mon perlsec, car j'ai peut-être manqué ce point. Bien que dans ce cas, les données sont écrites dans un dossier avec uniquement les autorisations de propriétaire définies, un autre programme malveillant ne devrait pas pouvoir modifier les données d'un programme externe. – Epiphany

+0

"donc un autre programme malveillant ne devrait pas pouvoir changer les données". Eh bien, il n'y a aucun moyen de vérifier cela. Le vérificateur d'altération doit être super paranoïaque, sinon il n'y a pas grand intérêt à l'utiliser. – Thilo

+0

et Thilo: Merci les gars ... Je suppose que je vais écrire un autre ensemble de regexes pour que je puisse continuer. J'adore la doo, Greg! :) – Epiphany