2010-08-28 76 views
2

我在这里有一点神秘,我不太了解根本原因。当试图从脚本中调用unlink时,我得到一个“在使用-T开关运行时取消链接的不安全依赖项”。这并不神秘,因为我意识到这意味着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通过使用本地时间(时间)函数脚本本身产生的,所以它不应该是污点。 $ item_photo会在污点检查前使用$ adID和$ extensioncheck进行重新分配,因此新的$ item_photo现在未被识别。我知道这是因为$ item_photo本身在脚本中将后者解除链接本身没有问题。 $ item_photo只用了足够长的时间,以便在使用未链接功能扔掉之前使用ImageMagick创建三个其他图像文件。从$ item_photo的ImageMagick处理创建的三个文件名就像这样创建。

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

的路径预先计划在新的文件名来创建网址,并在脚本的顶部被定义,因此他们不能有漏为好。这些文件的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; 

然后,我把它们写到记录,知道一切都是污点。

现在到了棘手的部分。在第二个脚本中,我使用unlink函数读取了要删除的这些文件,这就是我获得'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; 
    } 
} 

我知道我可以再次将它们解开,甚至只是在知道数据是安全的情况下将它们吹走,但这不是重点。我想要了解的是,为什么这首先发生,因为我不了解这些以前未被污染的数据如何被视为受污染。任何帮助启发我错过这个连接的地方都会得到真正的赞赏,因为我真的很想理解这一点,而不是仅仅为了解决这个问题而编写代码。

回答

4

将数据保存到文件不会将任何“污染”位保存在数据中。它只是来自外部源的数据,所以当Perl读取它时,它会自动被污染。在你的第二个脚本中,你将不得不明确地修改数据。

毕竟,在第二个脚本有机会读取文件之前,其他一些恶意程序可能已经更改了文件中的数据。

+0

必须再次超过我的perlsec,因为我可能错过了这一点。虽然在这种情况下,数据被写入只设置了所有者权限的文件夹,所以另一个恶意程序不应该能够从外部程序更改数据。 – Epiphany 2010-08-28 06:33:17

+0

“所以另一个恶意程序不应该能够改变数据”。那么,没有办法来验证。污点检查器需要是超偏执的,否则使用它就没有多大意义。 – Thilo 2010-08-28 06:43:10

+0

和Thilo:谢谢你们......我想我已经写了另外一套正则表达式,所以我可以继续。喜欢斗,格雷格! :) – Epiphany 2010-08-28 06:47:03