Commit 7380ea9a authored by mkanat%bugzilla.org's avatar mkanat%bugzilla.org

Bug 515191: [SECURITY] SQL Injection via Bug.search (CVE-2009-3125) and Bug.create (CVE-2009-3165)

Patch by Max Kanat-Alexander <mkanat@bugzilla.org> r=LpSolit, a=mkanat
parent 7fda8c35
...@@ -169,7 +169,19 @@ sub match { ...@@ -169,7 +169,19 @@ sub match {
next if $field eq 'OFFSET'; next if $field eq 'OFFSET';
if ( $field eq 'LIMIT' ) { if ( $field eq 'LIMIT' ) {
next unless defined $value; next unless defined $value;
$postamble = $dbh->sql_limit( $value, $criteria->{OFFSET} ); detaint_natural($value)
or ThrowCodeError('param_must_be_numeric',
{ param => 'LIMIT',
function => "${class}::match" });
my $offset;
if (defined $criteria->{OFFSET}) {
$offset = $criteria->{OFFSET};
detaint_signed($offset)
or ThrowCodeError('param_must_be_numeric',
{ param => 'OFFSET',
function => "${class}::match" });
}
$postamble = $dbh->sql_limit($value, $offset);
next; next;
} }
elsif ( $field eq 'WHERE' ) { elsif ( $field eq 'WHERE' ) {
...@@ -185,6 +197,8 @@ sub match { ...@@ -185,6 +197,8 @@ sub match {
next; next;
} }
$class->_check_field($field, 'match');
if (ref $value eq 'ARRAY') { if (ref $value eq 'ARRAY') {
# IN () is invalid SQL, and if we have an empty list # IN () is invalid SQL, and if we have an empty list
# to match against, we're just returning an empty # to match against, we're just returning an empty
...@@ -364,6 +378,17 @@ sub create { ...@@ -364,6 +378,17 @@ sub create {
return $object; return $object;
} }
# Used to validate that a field name is in fact a valid column in the
# current table before inserting it into SQL.
sub _check_field {
my ($invocant, $field, $function) = @_;
my $class = ref($invocant) || $invocant;
if (!Bugzilla->dbh->bz_column_info($class->DB_TABLE, $field)) {
ThrowCodeError('param_invalid', { param => $field,
function => "${class}::$function" });
}
}
sub check_required_create_fields { sub check_required_create_fields {
my ($class, $params) = @_; my ($class, $params) = @_;
...@@ -406,6 +431,7 @@ sub insert_create_data { ...@@ -406,6 +431,7 @@ sub insert_create_data {
my (@field_names, @values); my (@field_names, @values);
while (my ($field, $value) = each %$field_values) { while (my ($field, $value) = each %$field_values) {
$class->_check_field($field, 'create');
push(@field_names, $field); push(@field_names, $field);
push(@values, $value); push(@values, $value);
} }
......
...@@ -258,6 +258,7 @@ sub search { ...@@ -258,6 +258,7 @@ sub search {
} }
$params = _map_fields($params); $params = _map_fields($params);
delete $params->{WHERE};
# Do special search types for certain fields. # Do special search types for certain fields.
if ( my $bug_when = delete $params->{delta_ts} ) { if ( my $bug_when = delete $params->{delta_ts} ) {
......
...@@ -53,7 +53,9 @@ use constant WS_ERROR_CODE => { ...@@ -53,7 +53,9 @@ use constant WS_ERROR_CODE => {
param_required => 50, param_required => 50,
params_required => 50, params_required => 50,
object_does_not_exist => 51, object_does_not_exist => 51,
param_must_be_numeric => 52,
xmlrpc_invalid_value => 52, xmlrpc_invalid_value => 52,
param_invalid => 53,
# Bug errors usually occupy the 100-200 range. # Bug errors usually occupy the 100-200 range.
improper_bug_id_field_value => 100, improper_bug_id_field_value => 100,
bug_id_does_not_exist => 101, bug_id_does_not_exist => 101,
......
...@@ -338,6 +338,11 @@ ...@@ -338,6 +338,11 @@
There is no valid transition from There is no valid transition from
[%+ get_status("UNCONFIRMED") FILTER html %] to an open state. [%+ get_status("UNCONFIRMED") FILTER html %] to an open state.
[% ELSIF error == "param_invalid" %]
[% title = "Invalid Parameter" %]
<code>[% param FILTER html %]</code> is not a valid parameter
for the [% function FILTER html %] function.
[% ELSIF error == "param_must_be_numeric" %] [% ELSIF error == "param_must_be_numeric" %]
[% title = "Invalid Parameter" %] [% title = "Invalid Parameter" %]
Invalid parameter <code>[% param FILTER html %]</code> passed to Invalid parameter <code>[% param FILTER html %]</code> passed to
......
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