]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 1074980: Forbid the { foo => $cgi->param() } syntax to prevent data override
authorFrédéric Buclin <LpSolit@gmail.com>
Mon, 6 Oct 2014 14:36:30 +0000 (14:36 +0000)
committerDavid Lawrence <dkl@mozilla.com>
Mon, 6 Oct 2014 14:36:30 +0000 (14:36 +0000)
r=dkl,a=sgreen

t/002goodperl.t

index e95870d70adaa675a2978bd6d81110e90674a44c..d1858361f7bfbbc5a5f9bcf5d48e243e69cb4089 100644 (file)
@@ -19,7 +19,7 @@ use lib 't';
 use Support::Files;
 
 use Test::More tests => (scalar(@Support::Files::testitems)
-                         + scalar(@Support::Files::test_files)) * 5;
+                         + scalar(@Support::Files::test_files)) * 6;
 
 my @testitems = (@Support::Files::test_files, @Support::Files::testitems);
 my @require_taint = qw(email_in.pl importxml.pl mod_perl.pl whine.pl);
@@ -139,4 +139,35 @@ foreach my $file (@testitems) {
     
     close(FILE);
 }
+
+# Forbird the { foo => $cgi->param() } syntax, for security reasons.
+foreach my $file (@testitems) {
+    $file =~ s/\s.*$//; # nuke everything after the first space (#comment)
+    next unless $file; # skip null entries
+    if (!open(FILE, $file)) {
+        ok(0, "could not open $file --WARNING");
+        next;
+    }
+    my $lineno = 0;
+    my @unsafe_args;
+
+    while (my $file_line = <FILE>) {
+        $lineno++;
+        $file_line =~ s/^\s*(.+)\s*$/$1/; # Remove leading and trailing whitespaces.
+        if ($file_line =~ /^[^#]+=> \$cgi\->param/) {
+            push(@unsafe_args, "$file_line on line $lineno");
+        }
+    }
+
+    if (@unsafe_args) {
+        ok(0, "$file incorrectly passes a CGI argument to a hash --ERROR\n" .
+              join("\n", @unsafe_args));
+    }
+    else {
+        ok(1, "$file has no vulnerable hash syntax");
+    }
+
+    close(FILE);
+}
+
 exit 0;