Blog header transparent bg

Bundler may install gems from a different source than expected (CVE-2013-0334)

by André Arko on

Versions Affected: All versions < 1.7.0
Not Affected: Any Gemfile with one or zero sources

Fixed Versions: 1.7.0
Releases: 1.7.0

Bundler 1.7 is a security-only release to address CVE-2013-0334, a vulnerability where a gem might be installed from an unintended source server, particularly while using both rubygems.org and gems.github.com.

Impact

Any Gemfile with multiple top-level source lines cannot reliably control the gem server that a particular gem is fetched from. As a result, Bundler might install the wrong gem if more than one source provides a gem with the same name.

This is especially possible in the case of Github’s legacy gem server, hosted at gems.github.com. An attacker might create a malicious gem on RubyGems.org with the same name as a commonly-used Github gem. From that point forward, running bundle install might result in the malicious gem being used instead of the expected gem.

To mitigate this, the Bundler and RubyGems.org teams worked together to copy almost every gem hosted on gems.github.com to rubygems.org, reducing the number of gems that can be used for such an attack.

Resolution

To resolve this issue, upgrade to Bundler 1.7 by running gem install bundler. The next time you run bundle install for any Gemfile that contains multiple sources, each gem available from multiple sources will print a warning.

It is recommended to use a source block to contain all gems intended to be installed from rubygems.org. An example of a vulnerable file would be:

```ruby source ‘https://rubygems.org’

gem ‘rails’ ```

The fix would be to move all gems into a source block for rubygems.org:

ruby source 'https://rubygems.org' do gem 'rails' end

For detailed information about the changes to how sources are handled in Bundler version 1.7, see the release announcement.

Workarounds

If you are unable to upgrade to Bundler 1.7, it is possible to work around the issue by removing all but one source line from your Gemfile. Gems from other sources must be installed via the :git option, which is not susceptible to this issue, or unpacked into the application repository and used via the :pathoption.

Unfortunately, backporting a fix for this issue proved impractical, as previous versions of Bundler lacked the ability to distinguish between gem servers.

Credits

Thanks to Andreas Loupasakis and Fotos Georgiadis for reporting this issue, James Tucker, Tony Arcieri, Eric Hodel, Michael Koziarski, and Kurt Seifried for assistance with the eventual solution, and David Radcliffe for importing legacy Github gems into RubyGems.org.