はじめに
この記事は2016年4月6日に公開された RubyGems.org gem replacement vulnerability and mitigation の日本語訳です。
内容を見る限り、この脆弱性が実際に悪用された可能性は低そうですが、念のためgemの開発者やgemの利用者は一読しておくことをお勧めします。
翻訳の方針について
筆者はgem開発やセキュリティ問題にそこまで詳しくないため、一部翻訳に怪しいところがあるかもしれません。
また、翻訳は日本語としての読みやすさを重視してところどころ意訳しています。
もし完全に間違った訳になっていたり、意訳しすぎて原文のニュアンスが変わってしまったりしているところがあれば、コメントや編集リクエスト等でやさしく指摘してやってください。
(翻訳)RubyGems.orgでgemが置き換えられる脆弱性とその緩和策について
原文: RubyGems.org gem replacement vulnerability and mitigation
要約
RubyGems.org には不具合があり、攻撃者が我々のサーバー上にある .gem ファイルを異なるファイルに置き換えることができました。我々は2016年4月2日に部分的な修正を実施し、4月4日に完全に修正しました。また、2015年2月8日以降にアップロードされたすべての .gem ファイルを検証し、どれも置き換えられていないことを確認しました。gemの名前にダッシュが含まれるもので(例:'blank-blank')、2015年2月8日以前にアップロードされたものは、作者自身で検証する必要があります。検証する方法は以下で説明しています。
詳細
2016年4月2日、RubyGems.org のセキュリティチームは次のような脆弱性の報告を受けました。それは認可されていないユーザーが既存のgemバージョンにおける既存のgemファイルを特定の状況下でアップデートできるというものです。セキュリティチームはその報告を確認し、実際にそういった操作が可能になる不具合を発見しました。我々は4月2日の遅くにこの問題を修正し、前述した攻撃ができなくなったことを確認しました。
さらに詳細な調査をしたところ、前述のパッチでは同じような別の攻撃を防げないことを発見しました。我々は4月4日にこの問題を修正し、こちらも同様に攻撃ができなくなったことを確認しました。
どちらの攻撃手法も、攻撃者は特定のgemのバージョンを狙って我々のS3バケットにある既存の .gem ファイルを置き換えることができるものでした。
また、この攻撃手法で置き換えられたgemファイルは通常の gem install
コマンドではインストールできないことも確認しました。
既存のgemの検証内容
我々はすべてのgemのsha256チェックサムを検証し、いずれも不正に変更されていないことを確認しました。我々は 2015年2月8日以降にアップロードされたgemから sha256 の計算を開始しました。それ以前にアップロードされたgemはアップロードと同時に計算されたsha256を持っていません。そのため、それ以前に作られたgemについては、我々には検証する方法がありません。
さらに詳しく:
- 2015年2月8日以降にアップロードされたgemは100%検証されています。
- 2015年2月8日以前にアップロードされたgemについては、2015年2月8日以降に変更されていないことを検証しました。
さらに、2つめの攻撃手法においても該当するような事例がないことを確認しました。これはすべてのgemの、すべての日付に対してです。
より詳細な検証項目として、我々は同じファイルで2つ以上のS3オブジェクトバージョンを持つ全てのgemも検証しました。我々は750個以上のgemがS3に複数のバージョンを持っていることを確認しました。我々はそのすべてのオブジェクトバージョンを検証し、オブジェクトの最終更新日付とDB上の作成日付を比較しました。その結果、6つのgemで5秒以上の差異があることを発見しました。さらに、その6つのgemで異なるバージョンに対してチェックサムを計算し、2つのgemだけが異なるチェックサムになっていることがわかりました。我々は手作業でgemの内容を比較し、その内容が安全であることを確認しました。
経緯
1件目の脆弱性は2014年6月11日以降に存在していました。
2件目の脆弱性は RubyGems.org の開設当初から存在していました。
インパクト
gemの名前にダッシュが含まれるもので(例:'blank-blank')、2014年6月11日以降、2015年2月8日以前にアップロードされたものは攻撃を受けている可能性があります。(2015年2月8日から2016年4月2日の間にアップロードされたgemはすでに検証済みです。)
どうすればよいですか?
前述のインパクトに該当するgemのバージョンをアップロードしていた場合は、以下の手順で検証してください。
- gemをダウンロードする
-
gem unpack file.gem
を実行する - 予期しない変更が含まれていないことを確認する
-
gem spec file.gem
を実行する - gemspecに予期しない変更がないことを確認する
もし予期しない変更が含まれていた場合は gem yank
(訳注:gemの特定バージョンを削除)し、 RubyGems.org のセキュリティチーム に速やかに連絡してください。また、その際は調査に用いる .gem ファイルも含めてください。
クレジット
この問題を発見し、詳細なレポートを作成してくれたEric Chapweskeに大変感謝します。David Radcliffe と Arthur Nevesは修正と検証作業に貢献してくれました。Aaron Patterson, Nick Quaranto, André Arko, Samuel Giddins はレビューと検証に貢献してくれました。