Fix for bug 108982: enable taint mode for all user-facing CGI files.

Patch by Brad Baetz <bbaetz@student.usyd.edu.au> r= jake, justdave
parent 72f340e3
#!/usr/bonsaitools/bin/perl -w
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
......
#!/usr/bonsaitools/bin/perl -w
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
...@@ -75,10 +74,12 @@ sub initBug { ...@@ -75,10 +74,12 @@ sub initBug {
my $self = shift(); my $self = shift();
my ($bug_id, $user_id) = (@_); my ($bug_id, $user_id) = (@_);
my $old_bug_id = $bug_id;
if ( (! defined $bug_id) || (!$bug_id) ) { if ((! defined $bug_id) || (!$bug_id) || (!&::detaint_natural($bug_id))) {
# no bug number given # no bug number given
return {}; $self->{'bug_id'} = $old_bug_id;
$self->{'error'} = "InvalidBugId";
return $self;
} }
# default userid 0, or get DBID if you used an email address # default userid 0, or get DBID if you used an email address
......
#!/usr/bonsaitools/bin/perl -w
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
......
#!/usr/bonsaitools/bin/perl -w
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
...@@ -75,10 +74,12 @@ sub initBug { ...@@ -75,10 +74,12 @@ sub initBug {
my $self = shift(); my $self = shift();
my ($bug_id, $user_id) = (@_); my ($bug_id, $user_id) = (@_);
my $old_bug_id = $bug_id;
if ( (! defined $bug_id) || (!$bug_id) ) { if ((! defined $bug_id) || (!$bug_id) || (!&::detaint_natural($bug_id))) {
# no bug number given # no bug number given
return {}; $self->{'bug_id'} = $old_bug_id;
$self->{'error'} = "InvalidBugId";
return $self;
} }
# default userid 0, or get DBID if you used an email address # default userid 0, or get DBID if you used an email address
......
#!/usr/bonsaitools/bin/perl -w
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
......
...@@ -93,6 +93,9 @@ sub url_quote { ...@@ -93,6 +93,9 @@ sub url_quote {
sub ParseUrlString { sub ParseUrlString {
# We don't want to detaint the user supplied data...
use re 'taint';
my ($buffer, $f, $m) = (@_); my ($buffer, $f, $m) = (@_);
undef %$f; undef %$f;
undef %$m; undef %$m;
...@@ -118,6 +121,7 @@ sub ParseUrlString { ...@@ -118,6 +121,7 @@ sub ParseUrlString {
$name = $item; $name = $item;
$value = ""; $value = "";
} }
if ($value ne "") { if ($value ne "") {
if (defined $f->{$name}) { if (defined $f->{$name}) {
$f->{$name} .= $value; $f->{$name} .= $value;
...@@ -141,7 +145,6 @@ sub ParseUrlString { ...@@ -141,7 +145,6 @@ sub ParseUrlString {
} }
} }
sub ProcessFormFields { sub ProcessFormFields {
my ($buffer) = (@_); my ($buffer) = (@_);
return ParseUrlString($buffer, \%::FORM, \%::MFORM); return ParseUrlString($buffer, \%::FORM, \%::MFORM);
...@@ -259,18 +262,18 @@ sub ValidateBugID { ...@@ -259,18 +262,18 @@ sub ValidateBugID {
# Validates and verifies a bug ID, making sure the number is a # Validates and verifies a bug ID, making sure the number is a
# positive integer, that it represents an existing bug in the # positive integer, that it represents an existing bug in the
# database, and that the user is authorized to access that bug. # database, and that the user is authorized to access that bug.
# We detaint the number here, too
my ($id) = @_; $_[0] = trim($_[0]); # Allow whitespace arround the number
detaint_natural($_[0])
# Make sure the bug number is a positive integer.
# Whitespace can be ignored because the SQL server will ignore it.
$id =~ /^\s*([1-9][0-9]*)\s*$/
|| DisplayError("The bug number is invalid. If you are trying to use " . || DisplayError("The bug number is invalid. If you are trying to use " .
"QuickSearch, you need to enable JavaScript in your " . "QuickSearch, you need to enable JavaScript in your " .
"browser. To help us fix this limitation, look " . "browser. To help us fix this limitation, look " .
"<a href=\"http://bugzilla.mozilla.org/show_bug.cgi?id=70907\">here</a>.") "<a href=\"http://bugzilla.mozilla.org/show_bug.cgi?id=70907\">here</a>.")
&& exit; && exit;
my ($id) = @_;
# Get the values of the usergroupset and userid global variables # Get the values of the usergroupset and userid global variables
# and write them to local variables for use within this function, # and write them to local variables for use within this function,
# setting those local variables to the default value of zero if # setting those local variables to the default value of zero if
...@@ -685,6 +688,8 @@ sub quietly_check_login() { ...@@ -685,6 +688,8 @@ sub quietly_check_login() {
$::COOKIE{"Bugzilla_login"} = $loginname; # Makes sure case $::COOKIE{"Bugzilla_login"} = $loginname; # Makes sure case
# is in # is in
# canonical form. # canonical form.
# We've just verified that this is ok
detaint_natural($::COOKIE{"Bugzilla_logincookie"});
} else { } else {
$::disabledreason = $disabledtext; $::disabledreason = $disabledtext;
} }
...@@ -1430,6 +1435,8 @@ if (defined $ENV{"REQUEST_METHOD"}) { ...@@ -1430,6 +1435,8 @@ if (defined $ENV{"REQUEST_METHOD"}) {
if (defined $ENV{"HTTP_COOKIE"}) { if (defined $ENV{"HTTP_COOKIE"}) {
# Don't trust anything which came in as a cookie
use re 'taint';
foreach my $pair (split(/;/, $ENV{"HTTP_COOKIE"})) { foreach my $pair (split(/;/, $ENV{"HTTP_COOKIE"})) {
$pair = trim($pair); $pair = trim($pair);
if ($pair =~ /^([^=]*)=(.*)$/) { if ($pair =~ /^([^=]*)=(.*)$/) {
......
#!/usr/bonsaitools/bin/perl -w
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
......
#!/usr/bonsaitools/bin/perl -w #!/usr/bonsaitools/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
...@@ -29,6 +29,8 @@ ...@@ -29,6 +29,8 @@
use diagnostics; use diagnostics;
use strict; use strict;
use lib qw(.);
# Include the Bugzilla CGI and general utility library. # Include the Bugzilla CGI and general utility library.
require "CGI.pl"; require "CGI.pl";
...@@ -139,10 +141,10 @@ exit; ...@@ -139,10 +141,10 @@ exit;
sub validateID sub validateID
{ {
# Validate the value of the "id" form field, which must contain a positive # Validate the value of the "id" form field, which must contain an
# integer that is the ID of an existing attachment. # integer that is the ID of an existing attachment.
$::FORM{'id'} =~ /^[1-9][0-9]*$/ detaint_natural($::FORM{'id'})
|| DisplayError("You did not enter a valid attachment number.") || DisplayError("You did not enter a valid attachment number.")
&& exit; && exit;
......
#!/usr/bonsaitools/bin/perl -w #!/usr/bonsaitools/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
...@@ -26,6 +26,8 @@ ...@@ -26,6 +26,8 @@
use diagnostics; use diagnostics;
use strict; use strict;
use lib qw(.);
require "CGI.pl"; require "CGI.pl";
use Date::Parse; use Date::Parse;
...@@ -783,6 +785,11 @@ sub GenerateSQL { ...@@ -783,6 +785,11 @@ sub GenerateSQL {
die "Internal error: $errstr" if $chart < 0; die "Internal error: $errstr" if $chart < 0;
return Error($errstr); return Error($errstr);
} }
# This is either from the internal chart (in which case we
# already know about it), or it was in %chartfields, so it is
# a valid field name, which means that its ok.
trick_taint($f);
$q = SqlQuote($v); $q = SqlQuote($v);
my $func; my $func;
$term = undef; $term = undef;
...@@ -1067,7 +1074,15 @@ my @fields = ("bugs.bug_id", "bugs.groupset"); ...@@ -1067,7 +1074,15 @@ my @fields = ("bugs.bug_id", "bugs.groupset");
foreach my $c (@collist) { foreach my $c (@collist) {
if (exists $::needquote{$c}) { if (exists $::needquote{$c}) {
push(@fields, "$::key{$c}"); # The value we are actually using is $::key{$c}, which was created
# using the DefCol() function earlier. We test for the existance
# of $::needsquote{$c} to find out if $c is a legitimate key in the
# hashes that were defined by DefCol(). If $::needsquote{$c} exists,
# then $c is valid and we can use it to look up our key.
# If it doesn't exist, then we know the user is screwing with us
# and we'll just skip it.
trick_taint($c);
push(@fields, $::key{$c});
} }
} }
...@@ -1142,6 +1157,7 @@ if (defined $::FORM{'order'} && $::FORM{'order'} ne "") { ...@@ -1142,6 +1157,7 @@ if (defined $::FORM{'order'} && $::FORM{'order'} ne "") {
} }
die "Invalid order: $::FORM{'order'}" unless die "Invalid order: $::FORM{'order'}" unless
$::FORM{'order'} =~ /^([a-zA-Z0-9_., ]+)$/; $::FORM{'order'} =~ /^([a-zA-Z0-9_., ]+)$/;
$::FORM{'order'} = $1; # detaint this, since we've checked it
# Extra special disgusting hack: if we are ordering by target_milestone, # Extra special disgusting hack: if we are ordering by target_milestone,
# change it to order by the sortkey of the target_milestone first. # change it to order by the sortkey of the target_milestone first.
......
...@@ -8,7 +8,7 @@ priority, version, rep_platform, assigned_to, delta_ts, component, ...@@ -8,7 +8,7 @@ priority, version, rep_platform, assigned_to, delta_ts, component,
reporter, target_milestone?, bug_severity, creation_ts, qa_contact?, reporter, target_milestone?, bug_severity, creation_ts, qa_contact?,
status_whiteboard?, op_sys, short_desc?, keywords*, dependson*, status_whiteboard?, op_sys, short_desc?, keywords*, dependson*,
blocks*, cc*, long_desc?, attachment*)> blocks*, cc*, long_desc?, attachment*)>
<!ATTLIST bug error (NotFound|NotPermitted) #IMPLIED> <!ATTLIST bug error (NotFound|NotPermitted|InvalidBugId) #IMPLIED>
<!ELEMENT bug_id (#PCDATA)> <!ELEMENT bug_id (#PCDATA)>
<!ELEMENT short_desc (#PCDATA)> <!ELEMENT short_desc (#PCDATA)>
<!ELEMENT bug_status (#PCDATA)> <!ELEMENT bug_status (#PCDATA)>
......
#!/usr/bonsaitools/bin/perl -w #!/usr/bonsaitools/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
......
#!/usr/bonsaitools/bin/perl -w #!/usr/bonsaitools/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
...@@ -23,6 +23,8 @@ ...@@ -23,6 +23,8 @@
use diagnostics; use diagnostics;
use strict; use strict;
use lib qw(.);
sub sillyness { # shut up "used only once" warnings sub sillyness { # shut up "used only once" warnings
my $zz = @::legal_keywords; my $zz = @::legal_keywords;
} }
......
#!/usr/bonsaitools/bin/perl -w #!/usr/bonsaitools/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
...@@ -26,6 +26,8 @@ ...@@ -26,6 +26,8 @@
use diagnostics; use diagnostics;
use strict; use strict;
use lib qw(.);
require "CGI.pl"; require "CGI.pl";
# Shut up misguided -w warnings about "used only once": # Shut up misguided -w warnings about "used only once":
......
#!/usr/bonsaitools/bin/perl -w #!/usr/bonsaitools/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
use diagnostics; use diagnostics;
use strict; use strict;
use lib qw(.);
require "CGI.pl"; require "CGI.pl";
use vars %::COOKIE, %::FILENAME; use vars %::COOKIE, %::FILENAME;
......
#!/usr/bonsaitools/bin/perl -w #!/usr/bonsaitools/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
...@@ -25,6 +25,8 @@ use vars %::FORM; ...@@ -25,6 +25,8 @@ use vars %::FORM;
use diagnostics; use diagnostics;
use strict; use strict;
use lib qw(.);
require "CGI.pl"; require "CGI.pl";
ConnectToDatabase(); ConnectToDatabase();
......
#!/usr/bonsaitools/bin/perl -w #!/usr/bonsaitools/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
...@@ -23,6 +23,8 @@ ...@@ -23,6 +23,8 @@
use diagnostics; use diagnostics;
use strict; use strict;
use lib qw(.);
require "CGI.pl"; require "CGI.pl";
ConnectToDatabase(); ConnectToDatabase();
......
#!/usr/bonsaitools/bin/perl -w #!/usr/bonsaitools/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
...@@ -23,6 +23,8 @@ ...@@ -23,6 +23,8 @@
use diagnostics; use diagnostics;
use strict; use strict;
use lib qw(.);
require "CGI.pl"; require "CGI.pl";
require "defparams.pl"; require "defparams.pl";
......
#!/usr/bonsaitools/bin/perl -w #!/usr/bonsaitools/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
use diagnostics; use diagnostics;
use strict; use strict;
use lib qw(.);
require "CGI.pl"; require "CGI.pl";
ConnectToDatabase(); ConnectToDatabase();
...@@ -67,9 +69,6 @@ if (0 == @buglist) { ...@@ -67,9 +69,6 @@ if (0 == @buglist) {
# minus sign). # minus sign).
foreach my $id (@buglist) { foreach my $id (@buglist) {
ValidateBugID($id); ValidateBugID($id);
($::FORM{$id} =~ /^\d+$/)
|| DisplayError("Only use non-negative numbers for your bug votes.")
&& exit;
} }
###################################################################### ######################################################################
...@@ -144,7 +143,7 @@ while (MoreSQLData()) { ...@@ -144,7 +143,7 @@ while (MoreSQLData()) {
} }
SendSQL("delete from votes where who = $who"); SendSQL("delete from votes where who = $who");
foreach my $id (@buglist) { foreach my $id (@buglist) {
if ($::FORM{$id} > 0) { if (detaint_natural($::FORM{$id}) && $::FORM{$id} > 0) {
SendSQL("insert into votes (who, bug_id, count) values ($who, $id, $::FORM{$id})"); SendSQL("insert into votes (who, bug_id, count) values ($who, $id, $::FORM{$id})");
} }
$affected{$id} = 1; $affected{$id} = 1;
......
#!/usr/bonsaitools/bin/perl -w #!/usr/bonsaitools/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
...@@ -27,6 +27,9 @@ use diagnostics; ...@@ -27,6 +27,9 @@ use diagnostics;
use strict; use strict;
use CGI "param"; use CGI "param";
use AnyDBM_File; use AnyDBM_File;
use lib qw(.);
require "globals.pl"; require "globals.pl";
require "CGI.pl"; require "CGI.pl";
......
#!/usr/bonsaitools/bin/perl -w #!/usr/bonsaitools/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
...@@ -35,6 +35,8 @@ ...@@ -35,6 +35,8 @@
use diagnostics; use diagnostics;
use strict; use strict;
use lib qw(.);
require "CGI.pl"; require "CGI.pl";
# Shut up misguided -w warnings about "used only once". "use vars" just # Shut up misguided -w warnings about "used only once". "use vars" just
......
...@@ -194,8 +194,27 @@ sub SqlLog { ...@@ -194,8 +194,27 @@ sub SqlLog {
} }
} }
# This is from the perlsec page, slightly modifed to remove a warning
# From that page:
# This function makes use of the fact that the presence of
# tainted data anywhere within an expression renders the
# entire expression tainted.
# Don't ask me how it works...
sub is_tainted {
return not eval { my $foo = join('',@_), kill 0; 1; };
}
sub SendSQL { sub SendSQL {
my ($str, $dontshadow) = (@_); my ($str, $dontshadow) = (@_);
# Don't use DBI's taint stuff yet, because:
# a) We don't want out vars to be tainted (yet)
# b) We want to know who called SendSQL...
# Is there a better way to do b?
if (is_tainted($str)) {
die "Attempted to send tainted string to the database";
}
my $iswrite = ($str =~ /^(INSERT|REPLACE|UPDATE|DELETE)/i); my $iswrite = ($str =~ /^(INSERT|REPLACE|UPDATE|DELETE)/i);
if ($iswrite && !$::dbwritesallowed) { if ($iswrite && !$::dbwritesallowed) {
die "Evil code attempted to write stuff to the shadow database."; die "Evil code attempted to write stuff to the shadow database.";
......
#!/usr/bonsaitools/bin/perl -w #!/usr/bonsaitools/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
use diagnostics; use diagnostics;
use strict; use strict;
use lib qw(.);
require "CGI.pl"; require "CGI.pl";
# Shut up misguided -w warnings about "used only once". "use vars" just # Shut up misguided -w warnings about "used only once". "use vars" just
......
#!/usr/bonsaitools/bin/perl -w #!/usr/bonsaitools/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
...@@ -23,6 +23,9 @@ ...@@ -23,6 +23,9 @@
use diagnostics; use diagnostics;
use strict; use strict;
use lib qw(.);
use Bug; use Bug;
require "CGI.pl"; require "CGI.pl";
$::lockcount = 0; $::lockcount = 0;
......
#!/usr/bonsaitools/bin/perl -w #!/usr/bonsaitools/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
......
#!/usr/bonsaitools/bin/perl -w #!/usr/bonsaitools/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
...@@ -25,6 +25,8 @@ ...@@ -25,6 +25,8 @@
use diagnostics; use diagnostics;
use strict; use strict;
use lib qw(.);
require "CGI.pl"; require "CGI.pl";
# Shut up misguided -w warnings about "used only once". For some reason, # Shut up misguided -w warnings about "used only once". For some reason,
......
#!/usr/bonsaitools/bin/perl -w #!/usr/bonsaitools/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
...@@ -29,6 +29,8 @@ use strict; ...@@ -29,6 +29,8 @@ use strict;
my $UserInEditGroupSet = -1; my $UserInEditGroupSet = -1;
my $UserInCanConfirmGroupSet = -1; my $UserInCanConfirmGroupSet = -1;
use lib qw(.);
require "CGI.pl"; require "CGI.pl";
use RelationSet; use RelationSet;
...@@ -42,6 +44,7 @@ use vars %::versions, ...@@ -42,6 +44,7 @@ use vars %::versions,
%::legal_opsys, %::legal_opsys,
%::legal_platform, %::legal_platform,
%::legal_priority, %::legal_priority,
%::settable_resolution,
%::target_milestone, %::target_milestone,
%::legal_severity, %::legal_severity,
%::superusergroupset; %::superusergroupset;
...@@ -58,13 +61,18 @@ my $requiremilestone = 0; ...@@ -58,13 +61,18 @@ my $requiremilestone = 0;
# This list will either consist of a single bug number from the "id" # This list will either consist of a single bug number from the "id"
# form/URL field or a series of numbers from multiple form/URL fields # form/URL field or a series of numbers from multiple form/URL fields
# named "id_x" where "x" is the bug number. # named "id_x" where "x" is the bug number.
# For each bug being modified, make sure its ID is a valid bug number
# representing an existing bug that the user is authorized to access.
my @idlist; my @idlist;
if (defined $::FORM{'id'}) { if (defined $::FORM{'id'}) {
ValidateBugID($::FORM{'id'});
push @idlist, $::FORM{'id'}; push @idlist, $::FORM{'id'};
} else { } else {
foreach my $i (keys %::FORM) { foreach my $i (keys %::FORM) {
if ($i =~ /^id_([1-9][0-9]*)/) { if ($i =~ /^id_([1-9][0-9]*)/) {
push @idlist, $1; my $id = $1;
ValidateBugID($id);
push @idlist, $id;
} }
} }
} }
...@@ -74,12 +82,6 @@ scalar(@idlist) ...@@ -74,12 +82,6 @@ scalar(@idlist)
|| DisplayError("You did not select any bugs to modify.") || DisplayError("You did not select any bugs to modify.")
&& exit; && exit;
# For each bug being modified, make sure its ID is a valid bug number
# representing an existing bug that the user is authorized to access.
foreach my $id (@idlist) {
ValidateBugID($id);
}
# If we are duping bugs, let's also make sure that we can change # If we are duping bugs, let's also make sure that we can change
# the original. This takes care of issue A on bug 96085. # the original. This takes care of issue A on bug 96085.
if (defined $::FORM{'dup_id'} && $::FORM{'knob'} eq "duplicate") { if (defined $::FORM{'dup_id'} && $::FORM{'knob'} eq "duplicate") {
...@@ -538,7 +540,7 @@ sub ChangeResolution { ...@@ -538,7 +540,7 @@ sub ChangeResolution {
my ($str) = (@_); my ($str) = (@_);
if ($str ne $::dontchange) { if ($str ne $::dontchange) {
DoComma(); DoComma();
$::query .= "resolution = '$str'"; $::query .= "resolution = " . SqlQuote($str);
} }
} }
...@@ -695,6 +697,8 @@ SWITCH: for ($::FORM{'knob'}) { ...@@ -695,6 +697,8 @@ SWITCH: for ($::FORM{'knob'}) {
last SWITCH; last SWITCH;
}; };
/^resolve$/ && CheckonComment( "resolve" ) && do { /^resolve$/ && CheckonComment( "resolve" ) && do {
# Check here, because its the only place we require the resolution
CheckFormField(\%::FORM, 'resolution', \@::settable_resolution);
ChangeStatus('RESOLVED'); ChangeStatus('RESOLVED');
ChangeResolution($::FORM{'resolution'}); ChangeResolution($::FORM{'resolution'});
last SWITCH; last SWITCH;
...@@ -1030,8 +1034,15 @@ The changes made were: ...@@ -1030,8 +1034,15 @@ The changes made were:
foreach my $i (split('[\s,]+', $::FORM{$target})) { foreach my $i (split('[\s,]+', $::FORM{$target})) {
if ($i eq "") { if ($i eq "") {
next; next;
}
my $orig = $i;
if (!detaint_natural($i)) {
PuntTryAgain("$orig is not a legal bug number");
} }
# Don't use CanSeeBug, since we want to keep deps to bugs a
# user can't see
SendSQL("select bug_id from bugs where bug_id = " . SendSQL("select bug_id from bugs where bug_id = " .
SqlQuote($i)); SqlQuote($i));
my $comp = FetchOneColumn(); my $comp = FetchOneColumn();
...@@ -1049,7 +1060,8 @@ The changes made were: ...@@ -1049,7 +1060,8 @@ The changes made were:
my @stack = @{$deps{$target}}; my @stack = @{$deps{$target}};
while (@stack) { while (@stack) {
my $i = shift @stack; my $i = shift @stack;
SendSQL("select $target from dependencies where $me = $i"); SendSQL("select $target from dependencies where $me = " .
SqlQuote($i));
while (MoreSQLData()) { while (MoreSQLData()) {
my $t = FetchOneColumn(); my $t = FetchOneColumn();
if ($t == $id) { if ($t == $id) {
......
#!/usr/bonsaitools/bin/perl -w #!/usr/bonsaitools/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
...@@ -27,6 +27,8 @@ use vars %::FORM; ...@@ -27,6 +27,8 @@ use vars %::FORM;
use diagnostics; use diagnostics;
use strict; use strict;
use lib qw(.);
require "CGI.pl"; require "CGI.pl";
ConnectToDatabase(); ConnectToDatabase();
......
#!/usr/bonsaitools/bin/perl -w #!/usr/bonsaitools/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
...@@ -24,6 +24,8 @@ use diagnostics; ...@@ -24,6 +24,8 @@ use diagnostics;
use strict; use strict;
use vars ( %::FORM ); use vars ( %::FORM );
use lib qw(.);
require "CGI.pl"; require "CGI.pl";
print "Content-type: text/html\n\n"; print "Content-type: text/html\n\n";
......
#!/usr/bonsaitools/bin/perl -w #!/usr/bonsaitools/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
...@@ -25,6 +25,8 @@ use strict; ...@@ -25,6 +25,8 @@ use strict;
use vars %::COOKIE; use vars %::COOKIE;
use lib qw(.);
require "CGI.pl"; require "CGI.pl";
my $cookiepath = Param("cookiepath"); my $cookiepath = Param("cookiepath");
......
#!/usr/bonsaitools/bin/perl -w #!/usr/bonsaitools/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
...@@ -41,6 +41,8 @@ ...@@ -41,6 +41,8 @@
use diagnostics; use diagnostics;
use strict; use strict;
use lib qw(.);
eval "use GD"; eval "use GD";
my $use_gd = $@ ? 0 : 1; my $use_gd = $@ ? 0 : 1;
eval "use Chart::Lines"; eval "use Chart::Lines";
......
#!/usr/bonsaitools/bin/perl -w #!/usr/bonsaitools/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
use diagnostics; use diagnostics;
use strict; use strict;
use lib qw(.);
require "CGI.pl"; require "CGI.pl";
use vars %::FORM; use vars %::FORM;
......
#!/usr/bonsaitools/bin/perl -w #!/usr/bonsaitools/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
use diagnostics; use diagnostics;
use strict; use strict;
use lib qw(.);
require "CGI.pl"; require "CGI.pl";
ConnectToDatabase(); ConnectToDatabase();
......
#!/usr/bonsaitools/bin/perl -w #!/usr/bonsaitools/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
...@@ -23,6 +23,8 @@ ...@@ -23,6 +23,8 @@
use diagnostics; use diagnostics;
use strict; use strict;
use lib qw(.);
require "CGI.pl"; require "CGI.pl";
ConnectToDatabase(); ConnectToDatabase();
......
#!/usr/bonsaitools/bin/perl -w #!/usr/bonsaitools/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
use diagnostics; use diagnostics;
use strict; use strict;
use lib qw(.);
require "CGI.pl"; require "CGI.pl";
if (!defined $::FORM{'attach_id'}) { if (!defined $::FORM{'attach_id'}) {
...@@ -43,7 +45,7 @@ ConnectToDatabase(); ...@@ -43,7 +45,7 @@ ConnectToDatabase();
quietly_check_login(); quietly_check_login();
if ($::FORM{attach_id} !~ /^[1-9][0-9]*$/) { if (!detaint_natural($::FORM{attach_id})) {
DisplayError("Attachment ID should be numeric."); DisplayError("Attachment ID should be numeric.");
exit; exit;
} }
......
#!/usr/bonsaitools/bin/perl -w #!/usr/bonsaitools/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
...@@ -23,6 +23,8 @@ ...@@ -23,6 +23,8 @@
use diagnostics; use diagnostics;
use strict; use strict;
use lib qw(.);
require "CGI.pl"; require "CGI.pl";
ConnectToDatabase(); ConnectToDatabase();
...@@ -168,6 +170,10 @@ node [URL="${urlbase}show_bug.cgi?id=\\N", style=filled, color=lightgrey] ...@@ -168,6 +170,10 @@ node [URL="${urlbase}show_bug.cgi?id=\\N", style=filled, color=lightgrey]
# Cleanup any old .dot files created from previous runs. # Cleanup any old .dot files created from previous runs.
my $since = time() - 24 * 60 * 60; my $since = time() - 24 * 60 * 60;
foreach my $f (glob("data/webdot/*.dot")) { foreach my $f (glob("data/webdot/*.dot")) {
# Here we are deleting all old files. All entries are from the
# data/webdot/ directory. Since we're deleting the file (not following
# symlinks), this can't escape to delete anything it shouldn't
trick_taint($f);
if (ModTime($f) < $since) { if (ModTime($f) < $since) {
unlink $f; unlink $f;
} }
......
#!/usr/bonsaitools/bin/perl -w #!/usr/bonsaitools/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
...@@ -25,6 +25,8 @@ ...@@ -25,6 +25,8 @@
use diagnostics; use diagnostics;
use strict; use strict;
use lib qw(.);
require "CGI.pl"; require "CGI.pl";
ConnectToDatabase(); ConnectToDatabase();
...@@ -61,7 +63,7 @@ if (defined $::FORM{'voteon'}) { ...@@ -61,7 +63,7 @@ if (defined $::FORM{'voteon'}) {
# Make sure the user ID is a positive integer representing an existing user. # Make sure the user ID is a positive integer representing an existing user.
if (defined $::FORM{'user'}) { if (defined $::FORM{'user'}) {
$::FORM{'user'} =~ /^([1-9][0-9]*)$/ detaint_natural($::FORM{'user'})
|| DisplayError("The user number is invalid.") || DisplayError("The user number is invalid.")
&& exit; && exit;
SendSQL("SELECT 1 FROM profiles WHERE userid = $::FORM{'user'}"); SendSQL("SELECT 1 FROM profiles WHERE userid = $::FORM{'user'}");
......
...@@ -55,13 +55,40 @@ foreach my $file (@testitems) { ...@@ -55,13 +55,40 @@ foreach my $file (@testitems) {
} }
my $file_line1 = <FILE>; my $file_line1 = <FILE>;
close (FILE); close (FILE);
$file =~ m/.*\.(.*)/;
my $ext = $1;
if ($file_line1 !~ /\/usr\/bonsaitools\/bin\/perl/) { if ($file_line1 !~ /\/usr\/bonsaitools\/bin\/perl/) {
ok(1,"$file does not have a shebang"); ok(1,"$file does not have a shebang");
} else { } else {
if ($file_line1 =~ m#/usr/bonsaitools/bin/perl -w#) { my $flags;
ok(1,"$file uses -w"); if ($file eq "processmail") {
# special case processmail, which is tainted checked
$flags = "wT";
} elsif (!defined $ext || $ext eq "pl") {
# standalone programs (eg syncshadowdb) aren't taint checked yet
$flags = "w";
} elsif ($ext eq "pm") {
ok(0, "$file is a module, but has a shebang");
next;
} elsif ($ext eq "cgi") {
# cgi files must be taint checked, but only the user-accessible
# ones have been checked so far
if ($file =~ m/^edit/) {
$flags = "w";
} else {
$flags = "wT";
}
} else {
ok(0, "$file has shebang but unknown extension");
next;
}
if ($file_line1 =~ m#/usr/bonsaitools/bin/perl -$flags#) {
ok(1,"$file uses -$flags");
} else { } else {
ok(0,"$file is MISSING -w --WARNING"); ok(0,"$file is MISSING -$flags --WARNING");
} }
} }
} }
......
#!/usr/bonsaitools/bin/perl -w #!/usr/bonsaitools/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
...@@ -28,6 +28,8 @@ ...@@ -28,6 +28,8 @@
use diagnostics; use diagnostics;
use strict; use strict;
use lib qw(.);
# Include the Bugzilla CGI and general utility library. # Include the Bugzilla CGI and general utility library.
require "CGI.pl"; require "CGI.pl";
......
#!/usr/bonsaitools/bin/perl -w #!/usr/bonsaitools/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
...@@ -22,6 +22,8 @@ ...@@ -22,6 +22,8 @@
use diagnostics; use diagnostics;
use strict; use strict;
use lib qw(.);
require "CGI.pl"; require "CGI.pl";
use RelationSet; use RelationSet;
......
#!/usr/bonsaitools/bin/perl -w #!/usr/bonsaitools/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*- # -*- Mode: perl; indent-tabs-mode: nil -*-
# #
# The contents of this file are subject to the Mozilla Public # The contents of this file are subject to the Mozilla Public
...@@ -23,10 +23,13 @@ ...@@ -23,10 +23,13 @@
use diagnostics; use diagnostics;
use strict; use strict;
use lib qw(.);
use Bug; use Bug;
require "CGI.pl"; require "CGI.pl";
if (!defined $::FORM{'id'} || $::FORM{'id'} !~ /^\s*\d+(,\d+)*\s*$/) { if (!defined $::FORM{'id'} || !$::FORM{'id'}) {
print "Content-type: text/html\n\n"; print "Content-type: text/html\n\n";
PutHeader("Display as XML"); PutHeader("Display as XML");
print "<FORM METHOD=GET ACTION=\"xml.cgi\">\n"; print "<FORM METHOD=GET ACTION=\"xml.cgi\">\n";
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment