Ruby: 8/27発表のRubyGems脆弱性と修正方法のまとめ

こんにちは、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のバージョンに応じて以下のパッチを適用できます。 2.2.7用パッチ 2.3.4用パッチ 2.4.1用パッチ: 以下の2つのパッチを上から順に適用する必要があります。 RubyGems 2.6.11→2.6.12 RubyGems 2.6.12→2.6.13 補足: rbenvやRVMなどのバージョン管理ソフトウェアで複数のRubyを使っている場合、念のため、修正可能なすべてのバージョンで上のコマンドを実行しておくのがよいでしょう。当然ながら、VM、またはDockerやsystemd nspawnなどのコンテナでRubyを使っている場合はそちらもチェックし、必要であればアップデートします。 [Rails 5] rbenvでRubyをインストールして新規Rails開発環境を準備する 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) rubygems.orgで受け付けない無効な文字をspec名から除去するようになった(44cc27cd, ad5c0a53) # 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: … Continue reading Ruby: 8/27発表のRubyGems脆弱性と修正方法のまとめ