Railsユーザーがソースコード検査やWebサイト診断を受ける前に真っ先に使った方が良いセキュリティ検査ツールがあまり使われていないように感じています。
Brakemanはかなり良くできたツールです。私は何年も前から補助的に使っています。
Brakemanのインストールと使い方
Brakemanのページを見れば説明の必要もないですが、一応説明します。
rbenvを使っている場合、Railsで利用しているRubyのバージョンをローカルに合わせておきます。Rubyユーザーは普通にrbenvなどを使うべきでしょう。
$ cd MyRailsProject $ rbenv local 2.3.3
Brakemanのgemをインストールします。
$ gem install brakeman
Brakemanを実行します。BrakemanはRailsプロジェクトのソースコードを静的に検査するツールなのでbundleなどを実行する必要はありません。
$ brakeman -A -f html -o brakeman.html
上記のコマンドは
- -A 全ての検査を行う
- -f html HTML形式の出力(オススメ)
- -o 出力ファイル名
を指定して実行しています。
Gnome環境なら
$ gnome-open brakeman.html
とするとHTMLで整形された出力を参照できます。
以下のような出力を得られます。
この実行結果はとある日本製のオープンソースCMSのRailsアプリに対して実行した結果です。1 Messageの部分をクリックすると問題の行を表示してくれる親切さです。
- 70の脆弱なコード候補や設定問題が見つかった
- そのうち13は危険性が高い問題だった
- SQLインジェクションに脆弱なRailsバージョンで固定している
など、色々と判ります。
軽く結果を参照してみたところ、フォルスポジティブ(誤検出)もありますが、明らかに本当にダメ(攻撃可能)だろう、と思われるモノも複数ありました。詳しくは見ていません。RailsバージョンはSQLインジェクションに脆弱ですが、このCMSに影響があるのかなどもチェックしていません。
Brakemanは例としてでチェックしたRailsアプリケーションには十分有用であることが判ります。他の多くのRailsアプリケーションにも有用であることが多いでしょう。
弊社でもRailsのソースコード検査もしていますが、Brakemanを予め使っておいて頂くのは大歓迎です。Brakemanレベルの検査は機械的可能な検査、初歩的な検査です。人力で検査するとBrakemanで見つかる以上の問題が普通に見つかります。Brakemanでこれだけ出てくる場合、ソースコード検査をすると必ず色々と出てきます。Brakemanを使って予め存在する問題を修正しておいて頂く方が、実は助かります。
Railsユーザーの皆さん、セキュリティ検査をする前にBrakemanを使ってみましょう。役立つことが多いと思います。そしてBrakemanは完璧ではない事にも留意してください。普通にソースコード検査をすると検出できないモノが色々出てきます。
Brakemanがハングアップ/メモリを使い切る場合の対処
あるRailsプロダクトにBrakemanを使ったところ、ハングアップしたような状態になり、最後はメモリを使い切ってクラッシュしてしまいました。
調べてみたところ、相性が悪いファイルがプロジェクトの中にあると無限ループしてメモリを使い果たします。相性の悪いファイルはstraceコマンドで見つけることができます。
brakemanを実行する際、その前にstraceを付けるだけです。(straceが無い場合はインストールしてください)
$ strace brakeman -A -f html -o brakeman.html
openシステムコールを探し、どのファイルを処理している時に固まるか調べます。ファイル名が判るので、そのファイルをプロジェクトの中から削除します。次に普通にbrakemanを実行すると、通常通り処理が進むはずです。
- 実はこのアプリはたまたまgithubで見て「どの程度だろう?」とよくあるRailsである脆弱性の部分を見てみると、ものの数分でJavaScriptインジェクションに脆弱であることを見つけたアプリです。オープンソースの物だから、と言ってもこういう感じであるのが”普通”です。これに関してはレポートしておきました。しばらくして修正されたようです。ある会社さんが開発元だったので、レポートと同時にコード検査サービスのご利用をお勧めしておきました。 ↩