omniauth CVE-2015-9284 はどうすればよいのか

# 困ってること

> Patched version: No fix

`Gemfile.lock` において omniauth 1.9.0 を使っているとGitHubにこれを指摘されるし、お客さんにこれ使わないとできないの？って言われた時にいや大丈夫っすよ、、、と言えるようになりたい。

# 解決方法

GEMのアップデートでは解決できないし、最新版(1.9.0)のGEMでも解決できない。このアラートは出続ける。

GEM側での対応はない（仕様）ので実装でがんばる。具体的には `/auth/:provider` へGETアクセスできないようにし、CSRF対策GEMを導入してPOSTのみ受け付けるようにする。

ここより下は詳細と公式の和訳など

# CVE-2015-9284 (GitHubより引用

> Vulnerable versions: <= 1.9.0
> Patched version: No fix

# CVE-2015-9284 (CVEより引用

 [CVE - CVE-2015-9284](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-9284)

> Description
> The request phase of the OmniAuth Ruby gem is vulnerable to Cross-Site Request Forgery when used as part of the Ruby on Rails framework, allowing accounts to be connected without user intent, user interaction, or feedback to the user. This permits a secondary account to be able to sign into the web application as the primary account.

OmniAuthのリクエストフェーズは、RoRの一部として使うと、CSRFに対して脆弱で、ユーザーの意図、操作、確認なしでアカウントに接続できてしまいます。
これによってセカンダリアカウントがウェブアプリにプライマリアカウントとしてサインインできてしまいます。


# JVNDB-2015-008256

[OmniAuth Ruby gem におけるクロスサイトリクエストフォージェリの脆弱](https://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-008256.html)

> 対策
> ベンダより正式な対策が公開されています。ベンダ情報を参照して適切な対策を実施してください。

# What is クロスサイトリクエストフォージェリ

[クロスサイトリクエストフォージェリ - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%AA)


# 公式の見解

[Resolving CVE 2015 9284 · omniauth/omniauth Wiki](https://github.com/omniauth/omniauth/wiki/Resolving-CVE-2015-9284)

> Using GET requests

GETリクエストの使用について

> A key part of resolving this vulnerability is to avoid allowing GET requests for /auth/:provider.

この脆弱性を解決するキーパートは `/auth/:provider` のGETリクエストを許可しないことです。

> If using GET links to /auth/:provider is essential for your application (for example, if you are ever redirecting to /auth/:provider as part of an authentication process), then you will need to put together a more involved solution for your specific needs. This may mean redirecting to a standard log-in screen which includes link_to 'Log in', '/auth/:provider', method: :post or another POST/form-based approach (like button_to).

アプリで `/auth/:provider` のGETへのリンクが不可欠な場合(たとえば、認証プロセスで `/auth/:provider` にリダイレクトする場合)、より複雑な解決方法が必要。

これは普通のログインに以下を含む `link_to 'Log in;, '/auth/:provider', method: :post` か、他のPOST/form-based　

> Mitigating in Rails applications

Railsアプリにおける軽減

> 1. Add Rails' inbuilt CSRF protection to the POST requests by using the omniauth-rails_csrf_protection gem:
# Gemfile
gem 'omniauth-rails_csrf_protection', '~> 0.1'

Rails アプリに omniauth-rails_csrf_protection GEM を加える

> 2 . Update all links to /auth/:provider to use POST requests. 

`/auth/:provider` へのリンクをアップデートし、POSTを使うようにする。

> 3 . If you're using bundler-audit, you will need to explicitly ignore the CVE:
bundle audit check --ignore CVE-2015-9284

bundler-audit を使っているのならば、本CVEを無視するようにする。

※ bundler-audit はGEMのCVEチェックをしてくれるツール

[bundler-audit の警告を無視するための、シンプルな方法 - Qiita](https://qiita.com/tonluqclml/items/00a9f4bbf069b792f4ab)

> 4 . If you are continuing to use GET requests to access /auth/:provider then you will need to explicitly enable it, as omniauth-rails_csrf_protection modifies the default to be POST-only (but remember that using GET requests for /auth/:provider is not recommended and you should try to stick to POST requests if at all possible):

GETリクエストを使用して `/auth/:provider` にアクセスし続ける場合、omniauth-rails_csrf_protectionはデフォルトをPOSTのみに変更するため、明示的に有効にする必要があります。
（ただし GETリクエストの使用は推奨されません。可能な限り、POSTリクエストにすべき）。

> Mitigating in non-Rails applications

Railsじゃないアプリにおける軽減

> 1 . Add CSRF protection to OmniAuth POST requests with the rack-protection gem, using an approach similar to that which @abrom has put together: https://gist.github.com/abrom/effe58b27a4f4ac1b97fb85593d7c3be.

rack-protection GEMを用追加せよ

> 2 . Provided you do not need GET access to /auth/:provider, you should ensure only POST requests are allowed:

`/auth/:provider` へはPOSTリクエストのみを許可する

> 3 . Update all links to /auth/:provider to use POST requests. You will need to craft forms that POST to /auth/:provider, and have a hidden field with the value of the session's CSRF token. The rack-protection source code has a good example: https://github.com/sinatra/sinatra/blob/eee711bce740d38a9a91aa6028688c9a6d74b23b/rack-protection/lib/rack/protection/authenticity_token.rb#L63

すべての `/auth/:provider` リンクを、POSTにアップデートせよ。ポストする際にはセッションのCSRFトークンをhidden-fieldに加えてポストせよ。

> 4 . If you're using bundler-audit, you will need to explicitly ignore the CVE: