くりにっき

フルスタックキュアエンジニアです

【今月のgem】gemが改ざんされているかどうかチェックするgemを作った

先週のRubygems.orgの脆弱性報告を受けてgemを作りました

github.com

脆弱性の詳細

gemの名前にダッシュが含まれるもので(例:'blank-blank')、2014年6月11日以降、2015年2月8日以前にアップロードされたものは攻撃を受けている可能性があります。(2015年2月8日から2016年4月2日の間にアップロードされたgemはすでに検証済みです。)

とのこと

gemが改ざんされているかどうかチェックするツールとか誰か作ってるだろうと思って探したのですが、Gemfile.lockに含まれてるgemが上記に当てはまるかどうかチェックするスクリプトはありました

https://gist.github.com/yb66/44b97baecbeec6900e039ffb9461d31e

ただ、gem中が改ざんされているかどうかまではチェックしていないし*1、何より自分がリリースしたどのgemをチェックすべきか分からないのでしょうがないので自分で作りました。

gemをたくさんリリースしすぎて手動でチェックするのはむりぽ(´・ω・`) *2

使い方

README に書いてることを日本語で説明を書いただけです

自分がリリースしたgemのうち攻撃を受けた可能性があるgemを検索

自分がowner持ってるgemのうち

  • 2014年6月11日~2015年2月8日にアップロード
  • gem名にダッシュが含まれる

を検索します

$ rubygems_check_replacement_vulnerability vulnerable_gems --username=<USERNAME>

使用例

$ rubygems_check_replacement_vulnerability vulnerable_gems --username=sue445
sue445's vulnerable gems
- faker-precure : 0.0.2, 0.0.3
- fluent-plugin-out_chatwork : 0.0.1, 0.0.2, 0.0.3
- pebbles-tokyu_ruby_kaigi : 0.0.2
- rspec-every_item : 0.0.1
- rspec-parameterized : 0.1.2
- rspec-temp_dir : 0.0.1, 0.0.2, 0.0.3

Rubygems.orgに上がっているgemとリポジトリに上がってるソースコードの差分を調べる

さっき表示されたgemを1つずつ調べます

$ rubygems_check_replacement_vulnerability verify_gem --name=<GEM_NAME> --repo-url=<REPO_URL>

わざわざgem名とリポジトリのURLを手動で入力させているのは、gemspecだけだとリポジトリが特定できないからです。*3

使用例

$ rubygems_check_replacement_vulnerability verify_gem --name=rspec-temp_dir --repo-url=git@github.com:sue445/rspec-temp_dir.git
Unpacked gem: '/var/folders/mx/mmp8n_lx48v8_fr294_zjggw0000gn/T/gem-20160414-51500-dtg1p7/rspec-temp_dir-0.0.1'
[Info] rspec-temp_dir 0.0.1 is safe!
Unpacked gem: '/var/folders/mx/mmp8n_lx48v8_fr294_zjggw0000gn/T/gem-20160414-51500-1hpgj5i/rspec-temp_dir-0.0.2'
[Info] rspec-temp_dir 0.0.2 is safe!
Unpacked gem: '/var/folders/mx/mmp8n_lx48v8_fr294_zjggw0000gn/T/gem-20160414-51500-7aquji/rspec-temp_dir-0.0.3'
[Info] rspec-temp_dir 0.0.3 is safe!

具体的にやってることはREADMEやソース読んでください。

既知の問題

  • 1つリポジトリにgemが複数含まれている場合は考慮できていない
  • rake release 以外でリリースされたgemは考慮できていない
    • gemのバージョンに対応したgitのtagがあること前提なので、 v0.0.1 の形式のtagがないとファイルの比較ができない
    • -> v0.2.0で 0.0.1 のようなvがない形式に対応

まとめ

自分がリリースしたgemはこのgemで全部調べましたが、問題あるのはなかったです。

gemを星の数ほどリリースしてる人は是非ご活用ください

*1:名前とアップロード日時のみチェック

*2:Rubygems,orgに上がってるやつだけで30個、過去バージョンも含めるともっと

*3:homepageは必須ではないので完全ではない