Potential Query Manipulation with Common Rails Practises

2,891 views
Skip to first unread message

Michael Koziarski

unread,
Feb 6, 2013, 5:51:36 PM2/6/13
to rubyonrail...@googlegroups.com, oss-se...@lists.openwall.com
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Common patterns used in Ruby on Rails applications could allow an
attacker to generate SQL that, when combined with some database
server's typecasting code, generates queries that match incorrect records.

Note: This is a code and best-practise advisory, there is no patch to
apply or updated version to install.

Databases Affected: MySQL, SQLServer and some configurations of DB2
Not affected: SQLite, PostgreSQL, Oracle

Outline
- -------
When comparing two values of differing types most databases will
either generate an error or return 'false'. Other databases will
attempt to convert those values to a common type to enable comparison.

For example in MySQL comparing a string with an integer will cast the
string into an integer. Given that any string which isn't an invalid
integer will convert to 0, this could allow an attacker to bypass
certain queries.

If your application has XML or JSON parameter parsing enabled, an
attacker will be able to generate queries like this unless you take
care to typecast your input values. For example:

User.where(:login_token=>params[:token]).first

Could be made to generate the query:

SELECT * FROM `users` WHERE `login_token` = 0 LIMIT 1;

Which will match the first value which doesn't contain a valid
integer. This vulnerability affects multiple programming languages,
and multiple databases, be sure to audit your other applications to
see if they suffer the same issues.

Work Arounds
- ------------
There are two options to avoid these problems. The first is to
disable JSON and XML parameter parsing. Depending on the version of
rails you use you will have to place one of the following snippets in
an application initializer

Rails 3.2, 3.1 and 3.0:
ActionDispatch::ParamsParser::DEFAULT_PARSERS.delete(Mime::XML)
ActionDispatch::ParamsParser::DEFAULT_PARSERS.delete(Mime::JSON)

Rails 2.3:
ActionController::Base.param_parsers.delete(Mime::XML)
ActionController::Base.param_parsers.delete(Mime::JSON)

If your application relies on accepting these formats you will have to
take care to explicitly convert parameters to their intended types.
For example:

User.where(:login_token=>params[:token].to_s)


Fixes
- -----
Unfortunately it is not possible for ActiveRecord to automatically
protect against all instances of this attack due to the API we expose.
For example:

User.where("login_token = ? AND expires_at > ?", params[:token],
Time.now)

Without parsing the SQL fragments it is not possible to determine what
type params[:token] should be cast to.

Future releases of Rails will contain changes to mitigate the risk of
this class of vulnerability, however as long as this feature is still
supported this risk will remain.

Credits
- -------
Thanks to joernchen of Phenoelit for reporting this to us and to
Jonathan Rudenberg for helping to review the advisory.

- --
Cheers,

Koz
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (Darwin)
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iEYEARECAAYFAlES3ngACgkQ3CszDRD2lfNycACgljiq5sC41RM9RGw6qeoJGAqh
PTsAniVkqWo07BXpKIQx9hEKMT1hA0Hy
=3WN0
-----END PGP SIGNATURE-----
Reply all
Reply to author
Forward
0 new messages