先週のRubygems.orgの脆弱性報告を受けてgemを作りました
脆弱性の詳細
- RubyGems.org gem replacement vulnerability and mitigation - RubyGems Blog
- (翻訳)RubyGems.orgでgemが置き換えられる脆弱性とその緩和策について - Qiita
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が複数含まれている場合は考慮できていない
- https://github.com/rails/rails のようなやつ
- -> v0.2.0 で対応
rake release
以外でリリースされたgemは考慮できていない- gemのバージョンに対応したgitのtagがあること前提なので、
v0.0.1
の形式のtagがないとファイルの比較ができない - -> v0.2.0で
0.0.1
のようなvがない形式に対応
- gemのバージョンに対応したgitのtagがあること前提なので、
まとめ
自分がリリースしたgemはこのgemで全部調べましたが、問題あるのはなかったです。
gemを星の数ほどリリースしてる人は是非ご活用ください