こんにちは、hachi8833です。先週はRailsウォッチをお休みしてしまったことをお詫びいたします。
表題のニュースは先週のものですが、それなりに重要性が高いため改めて記事にいたしました。gemspecファイルからの入力もユーザー入力である以上サニタイズが必要なんですね。
RubyGemsで複数の脆弱性が発見・修正された(抜粋・まとめ)
参照
- 公式発表(2017/08/27): Multiple vulnerabilities in RubyGems
- 公式ブログ(2017/08/29): 2.6.13 Released
- 英語まとめ記事: Rubygems vulnerability writeup
- Heroku: changelog
要点
公式ブログでRubyGemsの2.6.13がリリースされました。2.6.13では、従来のRubyGems gemで見つかった複数の脆弱性が修正されています。
影響を受けるRubyバージョン
- Ruby 2.2系のうち、2.2.7以前のバージョン
- Ruby 2.3系のうち、2.3.4以前のバージョン
- Ruby 2.4系のうち、2.4.1以前のバージョン
- trunkのリビジョンが59672より前のバージョン
公式ブログ公開時点(2017/08/29)では、修正済みRubyGemsを含むRubyはリリースされていません。
その代わり、RubyGemsのバージョンを単独で2.6.13以降にアップデートすることで問題を回避できます。
修正方法
コマンドプロンプトで以下を実行することで、RubyGems gemをアップデートできます。
gem update --system
事情があってRubyGemsをアップデートできない場合、Rubyのバージョンに応じて以下のパッチを適用できます。
補足: rbenvやRVMなどのバージョン管理ソフトウェアで複数のRubyを使っている場合、念のため、修正可能なすべてのバージョンで上のコマンドを実行しておくのがよいでしょう。当然ながら、VM、またはDockerやsystemd nspawnなどのコンテナでRubyを使っている場合はそちらもチェックし、必要であればアップデートします。
RubyGems 2.6.13の主な修正内容
DNSリクエストがハイジャックされる脆弱性の修正(CVE-2017-0902)
- DNSへの名前参照に対して中間者攻撃(MITM)が可能になっていたのを修正(8d91516fb)
# lib/rubygems/remote_fetcher.rb
- if /\.#{Regexp.quote(host)}\z/ =~ target
+ if URI("http://" + target).host.end_with?(".#{host}")
return URI.parse "#{uri.scheme}://#{target}#{uri.path}"
end
ANSIエスケープシーケンスの脆弱性の修正(CVE-2017-0899)
- gem spec内文字列を取り出すときに非表示文字(いわゆる印刷できない文字)を除去するようになった(ef0aa611)
# lib/rubygems/text.rb
+ # Remove any non-printable characters and make the text suitable for
+ # printing.
+ def clean_text(text)
+ text.gsub(/[\u0000-\u0008\u000b-\u000c\u000e-\u001F\u007f]/, ".".freeze)
+ end
gem query
コマンドでのDOS脆弱性の修正(CVE-2017-0900)
- summaryのサイズに制限を加えた(8a38a4fc)
# lib/rubygems/commands/query_command.rb
def spec_summary entry, spec
- entry << "\n\n" << format_text(spec.summary, 68, 4)
+ summary = truncate_text(spec.summary, "the summary for #{spec.full_name}")
+ entry << "\n\n" << format_text(summary, 68, 4)
end
spec内のgem名に..
を含めて任意のファイルを上書きできる脆弱性の修正(CVE-2017-0901)
# lib/rubygems/specification.rb
+ VALID_NAME_PATTERN = /\A[a-zA-Z0-9\.\-\_]+\z/ # :nodoc:
補足: Herokuでの対応について
HerokuではRuby 2.4.1についてホスト側で対応済みなので、ユーザーはローカルの環境について対応すればよいことになります。
- Ruby 2.4.1: Changelog 8/28: RubyGems を2.6.13にアップデート
本記事執筆時点のHerokuのドキュメントでは、GemfileでRubyバージョンを指定していない場合はデフォルトで1つ前のバージョン(現時点ではRuby 2.3.4)が使われると記載されています。アプリがデフォルトのRubyバージョンに依存しないよう、アプリのGemfileには以下のようにRubyバージョンを明示的に記載することが強く推奨されています。
# Gemfile
source 'https://rubygems.org'
ruby '2.4.1' # 👈
gem 'rails', '5.1.3'
gem 'bcrypt'
...
なお、以下のバージョンについてのChangelogはありますが、RubyGemsのバージョンは2.6.13にはなっておらず、パッチが適用済みかどうかについては確認できませんでした。
- Ruby 2.3.4: Changelog 8/30: RubyGems を2.5.21にアップデート
- Ruby 2.2.7: Changelog 8/30: RubyGems を2.4.53にアップデート