RubyGems常見的漏洞和曝光
CVE-2013-4287: RubyGems 2.0.7及更舊版本的演算法複雜性漏洞
RubyGems通過一個容易受到回溯攻擊的正則表達式來驗證版本,這導致了拒絕服務攻擊。對於特別製作的RubyGems版本,攻擊者可以通過CPU消耗來導致拒絕服務。
受影響的版本包括2.0.7及更舊版本、2.1.0.rc.1和2.1.0.rc.2。
版本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常量。
值得注意的是,使用 bundler 從 git 安裝 gem 的用戶如果惡意作者將 gemspec 更改為無效版本,則會存在漏洞。
可以通過在 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
CVE-2013-4363: RubyGems 2.1.4 及更舊版本的算法複雜性漏洞
CVE-2013-4287 的修補程序未經充分驗證,因此在 CVE-2013-4287 之後,驗證 gem 版本的組合正則表達式仍然存在漏洞。
RubyGems通過一個容易受到回溯攻擊的正則表達式來驗證版本,這導致了拒絕服務攻擊。對於特別製作的RubyGems版本,攻擊者可以通過CPU消耗來導致拒絕服務。
RubyGems 版本 2.1.4 及更舊版本存在漏洞。
版本1.9.0到2.0.0p247是有漏洞的,因為它們包含了RubyGems的嵌入版本。
似乎無法通過安裝 gem 來利用此漏洞,用於 RubyGems 1.8.x 或更新版本的用途。 RubyGems API 的漏洞使用包括打包 gem(通過 gem build
、Gem::Package 或 Gem::PackageTask)、將用戶輸入發送給 Gem::Version.new、Gem::Version.correct? 或使用 Gem::Version::VERSION_PATTERN 或 Gem::Version::ANCHORED_VERSION_PATTERN 常數。
值得注意的是,使用 bundler 從 git 安裝 gem 的用戶如果惡意作者將 gemspec 更改為無效版本,則會存在漏洞。
可以通過在 lib/rubygems/version.rb 中的 Gem::Version::ANCHORED_VERSION_PATTERN 中將“*”重複更改為“?”重複來修復此漏洞。對於 RubyGems 2.1.x
- ANCHORED_VERSION_PATTERN = /\A\s*(#{VERSION_PATTERN})*\s*\z/ # :nodoc:
+ ANCHORED_VERSION_PATTERN = /\A\s*(#{VERSION_PATTERN})?\s*\z/ # :nodoc:
對於 RubyGems 2.0.x
- ANCHORED_VERSION_PATTERN = /\A\s*(#{VERSION_PATTERN})*\s*\z/ # :nodoc:
+ ANCHORED_VERSION_PATTERN = /\A\s*(#{VERSION_PATTERN})?\s*\z/ # :nodoc:
對於 RubyGems 1.8.x
- ANCHORED_VERSION_PATTERN = /\A\s*(#{VERSION_PATTERN})*\s*\z/ # :nodoc:
+ ANCHORED_VERSION_PATTERN = /\A\s*(#{VERSION_PATTERN})?\s*\z/ # :nodoc:
此漏洞由 Alexander Cherepanov 發現 cherepan@mccme.ru
CVE-2015-3900: RubyGems 2.4.6 及更早版本的請求劫持漏洞
RubyGems 提供了一個域將客戶端指向一個用於提取 gem 和對其進行 API 調用的單獨主機的能力。此機制是通過 DNS 實現的,具體而言是原始請求域下的 SRV 記錄 _rubygems._tcp。
例如,這是使用 rubygems.org 的用戶看到的
> dig _rubygems._tcp.rubygems.org SRV
;; ANSWER SECTION:
_rubygems._tcp.rubygems.org. 600 IN SRV 0 1 80 api.rubygems.org.
RubyGems 在將請求發送到該主機之前未驗證 SRV 記錄中返回的主機名。
這使得客戶端容易受到 DNS 劫持攻擊的影響,攻擊者可以返回自己選擇的 SRV 並使客戶端使用它。例如
> dig _rubygems._tcp.rubygems.org SRV
;; ANSWER SECTION:
_rubygems._tcp.rubygems.org. 600 IN SRV 0 1 80 gems.nottobetrusted.wtf
修復方法,詳細信息請參閱 https://github.com/rubygems/rubygems/commit/6bbee35,顯示我們現在驗證記錄是否在原始域下。這限制了客戶端必須使用原始信任/安全域,否則他們將不得不使用。
RubyGems 版本介於 2.0 和 2.4.6 之間的漏洞。
已發布修復此問題的 RubyGems 版本 2.0.16、2.2.4 和 2.4.7。
Ruby 版本 1.9.0 到 2.2.0 存在漏洞,因為它們包含了 RubyGems 的嵌入版本。
此漏洞由Jonathan Claudius JClaudius@trustwave.com 報告。