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 :path
option.
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.