はじめに
こんにちは。GMOアドマーケティングの石丸(@thomi40)です。
これまで弊社のテックブログではOWASP ZAPやBurp Suiteを用いた脆弱性診断に関する記事を紹介してきました。
この記事は GMOアドマーケティング Advent Calendar 2020 14日目の記事です。はじめにこんにちは、GMOアドマーケティングのR.Yです。今回はタイトルの通り、Railsで作った脆弱性をOWASP ZAPで診断してみたいと思います。自分は主にRailsを使ったWebアプリの開発やWebアプリの脆弱性診断を行うことが多いので、この記事を書くことによってRailsのセキュリティ周りや脆弱性診断を行うツールについての理解をより深められたら良いなと思います。1.用意するものRuby On Rails 5.2.3OWASP ZAP 2.9.02.調べる脆弱性SQLインジェクション2-1.SQ...
今回はOWASP ZAPやBurp Suiteとは違ったアプローチの脆弱性診断として、Ruby on Railsアプリ用の静的解析脆弱性診断ツール「Brakeman」について紹介します。
検証用アプリの環境構築
今回はDocker環境で、Ruby: 2.4.4, Rails: 6.1.4.1, Brakeman: 5.1.2 のバージョンを指定しました。まずは検証用に
scaffold
で雛形を作成します。
1 2 |
$ docker-compose run web rails g scaffold user name:string email:string password_digest:string $ docker-compose run web rails g scaffold task name:string user:references |
環境に合わせて
bundle install
を実行すれば導入完了です。
1 2 3 |
group :development do gem 'brakeman' end |
Brakemanの使い方
Brakemanの導入方法によって変わりますが、使い方は非常にシンプルで、実行したいRailsアプリケーションのディレクトリ上でbrakeman
コマンドの実行を行うだけで診断結果が表示されます。今回はdocker環境でRailsアプリケーションを構築したため、以下のコマンドを実行してみます。
1 |
$ docker-compose run --rm web brakeman |
scaffold
で雛形を作ったアプリケーションに対して実行を行うと、以下のように脆弱性が検知されなかったことが確認できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ docker-compose run --rm web brakeman (省略) Loading scanner... (省略) == Overview == Controllers: 3 Models: 3 Templates: 13 Errors: 0 Security Warnings: 0 == Warning Types == No warnings found |
1 |
User.where("name = '#{params[:name]}'") |
brakeman
コマンドを実行すると、期待通りSQLインジェクションが検知されたことが確認できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
$ docker-compose run --rm web brakeman (省略) == Overview == Controllers: 3 Models: 3 Templates: 13 Errors: 0 Security Warnings: 1 == Warning Types == SQL Injection: 1 == Warnings == Confidence: High Category: SQL Injection Check: SQL Message: Possible SQL injection Code: User.where("name = '#{params[:name]}'") File: app/controllers/users_controller.rb Line: 6 ERROR: 3 |
Brakemanのオプション
Brakemanには以下のように様々なオプションが用意されています。brakeman/OPTIONS.md at main · presidentbeef/brakeman (参照: 2021年11月24日)
今回は2つのオプションについて紹介します。
1. brakeman -A: すべてのチェック項目を実施
Brakemanはデフォルトでは検証しない項目があるため、すべての項目に対してチェックを行いたい場合は-A
オプションを指定します。scaffold
で雛形を作ったアプリケーションに対して実行すると、新たに2件のWarningが検知されました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
$ docker-compose run --rm web brakeman -A (省略) == Overview == Controllers: 3 Models: 3 Templates: 13 Errors: 0 Security Warnings: 2 == Warning Types == Missing Encryption: 1 Unscoped Find: 1 == Warnings == 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 Confidence: Weak Category: Unscoped Find Check: UnscopedFind Message: Unscoped call to `Task#find` Code: Task.find(params[:id]) File: app/controllers/tasks_controller.rb Line: 62 |
config.force_ssl
が有効化されていないことと、スコープされてないfind(利用者が任意のデータにアクセスできてしまう可能性)に関する出力が確認できました。
2. brakeman -o: 実行結果をファイルに出力する
実行結果をjsonやhtml, csvなどの様々な形式でファイル出力することが可能です。docker-compose run --rm web brakeman -o output.html
を実行すると、以下のようなhtmlファイルが出力されます。
まとめ
今回はRuby on Railsの脆弱性検知gem「Brakeman」について紹介しました。Brakemanはアプリを動かさずに診断できることから、セキュリティ対策の第一歩としてもおすすめです。
静的解析としてソースコードから診断を行うBrakeman、動的解析として実際に動作しているアプリケーションに対してリクエストを行うことで脆弱性を検知するOWASP ZAPの両方を組み合わせることで、よりセキュリティを担保することが期待できます。
Brakemanの解析対象やオプションの詳細、Railsのセキュリティについては以下の参考リンクからご確認ください。
参考リンク
- GitHub – presidentbeef/brakeman: A static analysis security vulnerability scanner for Ruby on Rails applications (参照: 2021年11月24日)
- Rails セキュリティガイド – Railsガイド (参照: 2021年11月24日)
告知
明日はR.Aさんによる「UiPathでスプレッドシートの更新・書き込みを行う。」です。引き続き、GMOアドマーケティング Advent Calendar 2021 をお楽しみください!
■エンジニア採用ページ ~福利厚生や各種制度のご案内はこちら~
https://note.gmo-ap.jp/n/n02cbeb6edb0d
■noteページ ~ブログや採用、イベント情報を公開中!~
https://note.gmo-ap.jp/
2016卒のWebエンジニア。
採用やマネジメントもやってます。