Ruby
Rails
bundler

bundler-audit の警告を無視するための、シンプルな方法

bundler-audit は、Gemfile(.lock)で指定されている gem から脆弱性があるものを指摘してくれるツールです。特にCIで使うと効果的です。

出力例:

$ bundler-audit
Name: actionpack
Version: 3.2.10
Advisory: OSVDB-91452
Criticality: Medium
URL: http://www.osvdb.org/show/osvdb/91452
Title: XSS vulnerability in sanitize_css in Action Pack
Solution: upgrade to ~> 2.3.18, ~> 3.1.12, >= 3.2.13

bundler-audit の何が問題か?

rubocopのように、特定の警告を非表示にする機能が無いことです。

脆弱性の中には「プロジェクトでの使い方では発現しない」「新バージョンには互換性がない」などで、修正しない/できないものもあるので、そっとしておいて欲しいもの。

どうやって解決したか?

あらかじめ、bundler-audit の出力をファイルに保存し、CI時に出力と比較すれば良いのです。

$ bundler-audit check > expected-bundler-audit-output.txt
$ git commit -m "..." expected-bundler-audit-output.txt

CI時:

$ bundler-audit update
$ diff <(bundler-audit check) expected-bundler-audit-output.txt

期待結果と差がある(≒ 新たな脆弱性が発見された)場合は diff が 1 で終わるのでCIが失敗します。

なお、bundler-audit が出力のフォーマットを変えた場合にも失敗しますが、その場合は諦めて bundler-auditを更新して、expected-bundler-audit-output.txt を作り直します。