RubyGems 导航菜单

博客

返回到博客帖子

CVE-2013-4287 RubyGems 2.0.7 及更早版本中的算法复杂性漏洞

RubyGems 使用正则表达式验证版本,但该表达式容易发生由于回溯造成的拒绝服务。对于特制的 RubyGems 版本,攻击者能够通过消耗 CPU 造成拒绝服务。

RubyGems 版本 2.0.7 及更早版本、2.1.0.rc.1 和 2.1.0.rc.2 容易受到攻击。

RubyGems 版本 2.1.02.0.81.8.261.8.23.1 包含修复。

Ruby 版本 1.9.0 至 2.0.0p247 容易受到攻击,因为它们包含嵌入式的 RubyGems 版本。

似乎无法通过为 RubyGems 1.8.x 或 2.0.x 安装宝石来利用该漏洞。易受攻击的 RubyGems API 用例包括打包宝石(通过 gem build、Gem::Package 或 Gem::PackageTask)、向 Gem::Version.new、Gem::Version.correct? 发送用户输入或使用 Gem::Version::VERSION_PATTERN 或 Gem::Version::ANCHORED_VERSION_PATTERN 常量。

值得注意的是,如果恶意作者将 gemspec 更改为无效版本,那么从 git 安装宝石的 bundler 用户容易受到攻击。

可以通过在 lib/rubygems/version.rb 中将 Gem::Version::VERSION_PATTERN 中的第一组更改为原子组来修复该漏洞。对于 RubyGems 2.0.x

*  VERSION_PATTERN = '[0-9]+(\.[0-9a-zA-Z]+)*(-[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?' # :nodoc:
+  VERSION_PATTERN = '[0-9]+(?>\.[0-9a-zA-Z]+)*(-[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?' # :nodoc:

对于 RubyGems 1.8.x

*  VERSION_PATTERN = '[0-9]+(\.[0-9a-zA-Z]+)*' # :nodoc:
+  VERSION_PATTERN = '[0-9]+(?>\.[0-9a-zA-Z]+)*' # :nodoc:

该漏洞由 Damir Sharipov dammer2k@gmail.com 发现

Eric Hodel