This post tries to give an overview about the background and impact of the new Rails XML parameter parsing vulnerability patched today.
The bug
The root cause of the vulnerability is Rails handling of formatted parameters. In addition to standard GET and POST parameter formats, Rails can handle multiple different data encodings inside the body of POST requests. By default JSON and XML are supported. While support for JSON is widely used in production, the XML functionality does not seem to be known by many Rails developers.
XML parameter parsing
The code responsible for parsing these different data types is shown below:
# actionpack/lib/action_dispatch/middleware/params_parser.rb .... DEFAULT_PARSERS = { Mime::XML => : xml_simple, Mime::JSON => :json } .... def parse_formatted_parameters(env) ... when Proc strategy.call(request.raw_post) when : xml_simple, : xml_node data = Hash.from_xml(request.raw_post) || {} data.with_indifferent_access when :yaml YAML.load(request.raw_post) when :json data = ActiveSupport::JSON.decode(request.raw_post) data = {:_json => data} unless data.is_a?(Hash) data.with_indifferent_access else false end ...
Continue reading “Analysis of Rails XML Parameter Parsing Vulnerability”
Continue reading