brakemanとは
Ruby on Railsアプリケーション用の静的セキュリティ脆弱性解析スキャナーです。
使うことのデメリットはないので、デフォルトで設定しましょう。
環境
- Rails 5.2.3
- brakeman v4.8.0
インストール
group :development do
gem 'brakeman'
end
コマンド実行例
ヘルプ(オプションなどを表示)
$ bundle exec brakeman --help
全てのチェックを行う
$ bundle exec brakeman -A
警告のうち、無視してよい項目を指定するファイルを作成する
コメント(無視してよい理由)も書けるので、きちんと書いておきましょう。
デフォルトでは config/brakeman.ignore にファイルが作られます。
$ bundle exec brakeman -I
// -A と合わせて使う時は -IA とします。
$ bundle exec brakeman -IA
オプション指定例
$ bundle exec brakeman -5 -A -w1
-5 Railsのバージョンを指定。無くても自動検出してくれるので通常は指定不要です。Rails4 や 6 の場合は、それぞれ -4 や -6 を指定します。
-A 全ての項目をチェックします。
-w1 チェックする項目のレベル設定で、1〜3まで指定可能です。1は全警告を出力し、3は重要度の高い警告のみ出力します。
実際の運用(CircleCI上で動かす時)では -A -w1 を指定しています。
CircleCIでbrakemanを動かす
このCircleCIの設定 で以下の箇所を参照してください。
- run_brakeman
- brakeman_job
警告例
Missing Encryption - ForceSSL
Confidence: High
Category: Missing Encryption
Check: ForceSSL
Message: The application does not force use of HTTPS: `config.force_ssl` is not enabled
File: config/environments/production.rb
Line: 1
「production.rb
でconfig.force_ssl
の設定がされていない」という内容ですが、多くの環境ではLoad BalancerでSSLの暗号化/復号化を行うので、そういう場合はignore list
に入れましょう。
Unscoped Find - UnscopedFind
Confidence: Weak
Category: Unscoped Find
Check: UnscopedFind
Message: Unscoped call to `Foo#find`
Code: Foo.find(params[:id])
File: app/controllers/foos_controller.rb
Line: 100
brakemanのdocument に説明があります。
以下、翻訳(意訳)です。
偽陽性が高いので、対応の必要がなければignore list
に入れましょう。
別のモデルに属するモデルは、通常スコープクエリ(scoped query)を介してアクセスする必要があります。
たとえば、User belongs_to Account
というアソシエーションの場合、これは安全ではない範囲指定された検索である可能性があります。
Account.find(params[:id])
アクションによっては、攻撃者が自分以外のアカウントにアクセスできる可能性があります。
代わりに、現在ログインしているユーザーのスコープを設定する必要があります。
current_user = User.find(session[:user_id])
current_user.accounts.find(params[:id])