オーオース2・0におけるCSRF対策で認可サーバーができること
- 4/2 追記
- ブログのタイトルを「知ってるけどきっとそうじゃない。」に変更しましたが、それだとただの嘘だ、ということに気づきましたので、元のタイトルに戻します
- 大変ご迷惑をおかけいたしました
- 本日から、ブログのタイトルを「知ってるけどきっとそうじゃない。」に改めました
- 今年度も、どうぞよろしくお願いいたします
By kidmissile - Identity Discs Acquired(2010) / CC BY-NC-ND 2.0
- 新タイトルになって最初の記事は、「オーオース2・0」におけるCSRF(クロスサイトリクエストフォージェリー)についてです
- CSRFといえば、URLをクリックしただけで「こんにちはこんにちは!!」させられてしまう脆弱性であることを、ご存知の方は多いと思います
- 最近は、フェイスブックアカウント等でログインできるウェブアプリケーション(応用ソフト)も増えてきましたが、そこで利用されている技術がオーオース2・0です
- その部分にCSRF脆弱性があると、いつの間にか、攻撃者のアカウントでログインさせられてしまう可能性があります
- つまり、それに気づかないまま、攻撃者のアカウントに銀行口座情報等を登録してしまうかもしれないという、怖そうで怖くない少し怖い脆弱性なのです
- さらに、既存のアカウントにオーオース2・0でログイン可能にする機能においてCSRFが成功すると、そのアカウントは乗っ取られてしまうでしょう
- 「アカウントをフェイスブックアカウントと連携させる」的な機能のことです
- クライアント側の対策方法は仕様で述べられています
- http://openid−foundation−japan.github.com/draft−ietf−oauth−v2−draft22.ja.html#CSRF
- stateパラメーターを使う説明ですが、よくわかんないですね。やめましょう
- http://openid−foundation−japan.github.com/draft−ietf−oauth−v2−draft22.ja.html#CSRF
- 仕様をちょっぴり変える
- 認可リクエストで、stateパラメーターを「推奨」から「必須」にする
- 認可レスポンスに、stateパラメーターを含めない
- アクセストークンリクエストで、stateパラメーターを必須とし、認可サーバーは認可リクエストで渡されたstateパラメーターとの一致を確認する
- こうすれば、クライアントはおのずとstateパラメーターを、セッション情報として保存するでしょう
- しかし、stateパラメーターは依然クライアントが決定するので、必須だからといって毎回、state=mendoiを送られてこないか心配です
- 仕様をもうちょっとだけ変える
- いわゆるオレオレ仕様ですが、オーオース2・0は永久に更新され続ける仕様なので、多少違ってもばれることはないでしょう
- もしかしたら、ドラフト100くらいで取り込まれるかもしれません