Commit 0af9c776 authored by Dave Lawrence's avatar Dave Lawrence

Bug 725663 - (CVE-2012-0453) [SECURITY] CSRF vulnerability in the XML-RPC API when using mod_perl

r/a=LpSolit
parent a50a0814
...@@ -14,6 +14,7 @@ our @EXPORT = qw( ...@@ -14,6 +14,7 @@ our @EXPORT = qw(
WS_ERROR_CODE WS_ERROR_CODE
ERROR_UNKNOWN_FATAL ERROR_UNKNOWN_FATAL
ERROR_UNKNOWN_TRANSIENT ERROR_UNKNOWN_TRANSIENT
XMLRPC_CONTENT_TYPE_WHITELIST
WS_DISPATCH WS_DISPATCH
); );
...@@ -162,6 +163,8 @@ use constant WS_ERROR_CODE => { ...@@ -162,6 +163,8 @@ use constant WS_ERROR_CODE => {
unknown_method => -32601, unknown_method => -32601,
json_rpc_post_only => 32610, json_rpc_post_only => 32610,
json_rpc_invalid_callback => 32611, json_rpc_invalid_callback => 32611,
xmlrpc_illegal_content_type => 32612,
json_rpc_illegal_content_type => 32613,
}; };
# These are the fallback defaults for errors not in ERROR_CODE. # These are the fallback defaults for errors not in ERROR_CODE.
...@@ -170,6 +173,11 @@ use constant ERROR_UNKNOWN_TRANSIENT => 32000; ...@@ -170,6 +173,11 @@ use constant ERROR_UNKNOWN_TRANSIENT => 32000;
use constant ERROR_GENERAL => 999; use constant ERROR_GENERAL => 999;
use constant XMLRPC_CONTENT_TYPE_WHITELIST => qw(
text/xml
application/xml
);
sub WS_DISPATCH { sub WS_DISPATCH {
# We "require" here instead of "use" above to avoid a dependency loop. # We "require" here instead of "use" above to avoid a dependency loop.
require Bugzilla::Hook; require Bugzilla::Hook;
......
...@@ -73,10 +73,18 @@ use XMLRPC::Lite; ...@@ -73,10 +73,18 @@ use XMLRPC::Lite;
our @ISA = qw(XMLRPC::Deserializer); our @ISA = qw(XMLRPC::Deserializer);
use Bugzilla::Error; use Bugzilla::Error;
use Bugzilla::WebService::Constants qw(XMLRPC_CONTENT_TYPE_WHITELIST);
use Scalar::Util qw(tainted); use Scalar::Util qw(tainted);
sub deserialize { sub deserialize {
my $self = shift; my $self = shift;
# Only allow certain content types to protect against CSRF attacks
if (!grep($_ eq $ENV{'CONTENT_TYPE'}, XMLRPC_CONTENT_TYPE_WHITELIST)) {
ThrowUserError('xmlrpc_illegal_content_type',
{ content_type => $ENV{'CONTENT_TYPE'} });
}
my ($xml) = @_; my ($xml) = @_;
my $som = $self->SUPER::deserialize(@_); my $som = $self->SUPER::deserialize(@_);
if (tainted($xml)) { if (tainted($xml)) {
......
...@@ -1699,6 +1699,11 @@ ...@@ -1699,6 +1699,11 @@
<[% type FILTER html %]> field. (See the XML-RPC specification <[% type FILTER html %]> field. (See the XML-RPC specification
for details.) for details.)
[% ELSIF error == "xmlrpc_illegal_content_type" %]
When using XML-RPC, you cannot send data as
[%+ content_type FILTER html %]. Allowed content types
are [% constants.XMLRPC_CONTENT_TYPE_WHITELIST.join(', ') %].
[% ELSIF error == "zero_length_file" %] [% ELSIF error == "zero_length_file" %]
[% title = "File Is Empty" %] [% title = "File Is Empty" %]
The file you are trying to attach is empty, does not exist, or you don't The file you are trying to attach is empty, does not exist, or you don't
......
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