SlideShare a Scribd company logo
今更聞けない OAuth2.0	
presented	
  by	
  @white_aspara25
自己紹介	
  	
•  @white_aspara25	
  
•  istyle.inc	
  エンジニア(自称)	
  
•  ここ1年は ハノイ@ベトナム で	
  Bridgeエンジニ
アとして働いてました
話す内容	
1.  OAuth	
  ってなに?	
  
2.  OAuth2.0	
  システム仕様	
  
3.  セキュリティ対策
話さない内容	
1.  OAuth1.0	
  の仕様	
  
2.  XAuth	
  の仕様	
  
3.  OpenID	
  Connect	
  
話す内容	
1.  OAuth	
  ってなに?	
  
2.  システム仕様	
  
3.  セキュリティ対策
OAuth ?
おーす
OAuth	
  って?	
※認証ではなく、認可です	
  
HTTP	
  上で 認可	
を行うためのプロトコル
OAuth	
  って?	
※認証ではなく、認可です	
  
HTTP	
  上で 認可	
を行うためのプロトコル
認証 or	
  認可 ?
認証?	
•  英:AuthenFcaFon	
  
「誰?」 を確認するのが目的	
「認証(にんしょう)とは、何かによって、対象の正当性を確認する行為を
指す」	
  
「相手認証とは、ある人が確かに本人であると納得させる事をいう」	
  
by	
  Wikipedia
認可?	
•  英:AuthorizaFon	
  
「リソースのアクセス権を指定する機能であり、(中略)特にアクセス制
御と関係性が深い」	
by	
  Wikipedia	
「何ができる?」 を確認するのが目的
OAuth	
  =	
  認可	
のプロトコルです。	
  
「誰か?」を確認する目的のものではありません。
OAuth	
  =	
  認可	
のプロトコルです。	
  
「誰か?」を確認する目的のものではありません。	
= OpenID	
  Connect	
  (今回は説明しません)
OAuth	
  って?	
※認証ではなく、認可です	
  
HTTP	
  上で 認可	
を行うためのプロトコル
OAuth	
  って?	
※認証ではなく、認可です	
  
HTTP	
  上で 何ができる?	
を確認するためのプロトコル
例	
投稿サイトA	
SNS	
投稿	
自動投稿	
スマホで撮影した愛猫の写真	
  
サイトAに投稿したら、自動でSNSにも投稿したい!	
として
一番簡単な方法	
投稿サイトA	
SNS	
ID/PW	
ログイン	
投稿
一番簡単な方法	
投稿サイトA	
SNS	
ID/PW	
ログイン	
投稿	
の	
  ID/PW	
  を保持している
But...
それ、アカンやつや	
•  サイトA	
  はユーザの許可がなくても	
  
SNS	
  の情報が見れてしまう	
•  SNS	
  のパスワードを変更	
  
=>	
  サイトAのパスワードも変更が必要	
  
•  ID/PW漏洩のリスク	
  
	
   	
   	
   	
   	
   	
   	
   	
   	
   	
  etc...	
  
問題大有りです。
OAuth
そこで
OAuth	
  を使った方法	
投稿サイトA	
SNS	
1.  ユーザはSNSにサイトAからの投稿を許可(=認可)	
  
サイトAからの投稿許可
OAuth	
  を使った方法	
投稿サイトA	
SNS	
1.  ユーザはSNSにサイトAからの投稿を許可(=認可)	
  
2.  ユーザの許可を受けてSNSはトークンを発行	
  
サイトAからの投稿許可	
トークンを発行
OAuth	
  を使った方法	
投稿サイトA	
SNS	
投稿	
1.  ユーザはSNSにサイトAからの投稿を許可(=認可)	
  
2.  ユーザの許可を受けてSNSはトークンを発行	
  
3.  投稿サイトAはトークンを使ってSNSに投稿	
  
サイトAからの投稿許可	
投稿	
トークンを発行
OAuth	
  を使った方法	
投稿サイトA	
SNS	
投稿	
1.  ユーザはSNSにサイトAからの投稿を許可(=認可)	
  
2.  ユーザの許可を受けてSNSはトークンを発行	
  
3.  投稿サイトAはトークンを使ってSNSに投稿	
  
サイトAからの投稿許可	
投稿	
トークンを発行	
No	
  more	
  ID/Password	
SNS	
  の	
  ID/PW	
  をサイトAは知らなくても良い!
○○ができる を証明するもの	
トークン	
=	
○○	
 =	
××のサービス上で	
△△の代わりに	
投稿(メッセージ、写真、、)	
閲覧(個人情報、友達、、)	
注意点
○○ができる を証明するもの	
トークン	
=	
○○	
 =	
××のサービス上で	
△△の代わりに	
投稿(メッセージ、写真、、)	
閲覧(個人情報、友達、、)	
注意点	
ただのチケット	
  
=本人じゃなくても使える	
  
=本人証明にならない
○○ができる を証明するもの	
トークン	
=	
○○	
 =	
××のサービス上で	
△△の代わりに	
投稿(メッセージ、写真、、)	
閲覧(個人情報、友達、、)	
注意点	
用法用量を守って	
  
正しくお使いください
サイトA	
まとめると	
サイトB	
○○する	
発行	
 として	
この一連のフローを仕様に落としたのが	
OAuth  
サイトAを認可	
の代わりに	
「サイトB」上で	
○○	
  ができる証明書
話す内容	
1.  OAuth	
  ってなに?	
  
2.  OAuth2.0	
  システム仕様	
  
3.  セキュリティ対策
OAuth2.0	
•  AuthorizaFon	
  Code	
  Grant	
  
•  Implicit	
  Grant	
  
•  Resource	
  Owner	
  Password	
  CredenFals	
  Grant	
  
•  Client	
  CredenFals	
  Grant	
  
4種類のトークン   発行フロー
OAuth2.0	
•  AuthorizaFon	
  Code	
  Grant	
  
•  Implicit	
  Grant	
  
•  Resource	
  Owner	
  Password	
  CredenFals	
  Grant	
  
•  Client	
  CredenFals	
  Grant	
  
4種類のトークン   発行フロー	
今回は取り扱いません
AuthorizaFon	
  Code	
  Grant	
•  認可コードグラント、とも	
  
•  サーバ間通信のような、トークンを秘密保持できる場合
に使われる	
  
•  一般的な	
  web	
  アプリはコレ	
Implicit	
  Grant	
•  トークンを秘密保持できない場合に。	
  
•  スマホアプリや Javascript	
  はコレ。	
  
AuthorizaFon	
  Code	
  Grant
AuthorizaFon	
  Code	
  Grant	
  処理の流れ	
Webアプリ
AuthorizaFon	
  Code	
  Grant	
  処理の流れ	
1.	
  ユーザー認可リクエスト	
「  が   から   に投稿したいって	
言ってるんだけど」	
Webアプリ
AuthorizaFon	
  Code	
  Grant	
  処理の流れ	
「問題ないっす!   認めてやって!」	
「  に確認するからちょい待って」	
Webアプリ
AuthorizaFon	
  Code	
  Grant	
  処理の流れ	
認可コードの発行&送付	
「@  :  の確認取れたわ。	
発行するから  に取りにきて。	
  
トークンの引換券はこれな:      」	
認可コード	
認可コード
AuthorizaFon	
  Code	
  Grant	
  処理の流れ	
「つ	
  のトークン  おくれ。」	
認可コード	
「   ね。はいよ  」	
Webアプリ	
2.	
  アクセストークンリクエスト
AuthorizaFon	
  Code	
  Grant	
  処理の流れ	
「つ	
 として   を投稿しておくれ」	
「OK.	
  したよ 」	
Webアプリ
AuthorizaFon	
  Code	
  Grant	
ポイント
ポイント	
  は      と引き換えに   を発行	
認可コード	
Webアプリ	
  はリクエストしてきた   の認証チェック
ポイント	
  は  には渡らない	
側で管理 = 秘密保持可	
Webアプリ
Implicit	
  Grant
Implicit	
  Grant	
  処理の流れ	
ネイティブアプリ
Implicit	
  Grant	
  処理の流れ	
ネイティブアプリ	
1.	
  認可要求	
「  が   から   に投稿したいって	
言ってるんだけど」
Implicit	
  Grant	
  処理の流れ	
ネイティブアプリ	
「問題ないっす!   認めてやって!」	
「  に確認するからちょい待って」
Implicit	
  Grant	
  処理の流れ	
ネイティブアプリ	
トークンの発行&送付	
「@  :  の確認取れたわ。	
はい、これ使って   。」
Implicit	
  Grant	
  処理の流れ	
ネイティブアプリ	
「つ	
 として   を投稿しておくれ」	
「OK.	
  したよ 」
Implicit	
  Grant	
ポイント
Implicit	
  Grant	
  処理の流れ	
ネイティブアプリ	
は  の確認が取れたらすぐ  を発行	
の認証をしない分、簡単
Implicit	
  Grant	
  処理の流れ	
ネイティブアプリ	
そのため、redirect	
  URI	
  の事前登録は必須	
= 異なる	
  redirect	
  URI	
  はエラーに	
  
Implicit	
  Grant	
  処理の流れ	
ネイティブアプリ	
  は  に渡るため、漏れる可能性がある	
= 秘密保持不可
話す内容	
1.  OAuth	
  ってなに?	
  
2.  OAuth2.0	
  システム仕様	
  
3.  セキュリティ対策
Case1.	
  CSRF
CSRF	
1)  攻撃者は通常の手順でSPの認可まで行う	
  
2)  認可後のリダイレクト先の	
  URI	
  を取得し、被害者に
アクセスさせる	
  
手法	
リスク	
・ 第3者の  アカウントと連携	
  
 =第3者がログイン可能	
  
 =  アカウントの乗っ取り	
  
・ 第3者のアカウントとしてログインさせられる	
  
ー 個人情報やクレカ情報を登録したら、第3者に知られてしまう	
  
CSRF	
Webアプリ	
攻撃者	
攻撃者は正規の方法で認可コードの発行まで行い	
  
のリダイレクト先のURIを取得
CSRF	
Webアプリ	
攻撃者	
攻撃者は、入手した	
  URI	
  に他の人がアクセスするよう仕向ける	
  
(他者のブラウザで実行さえできれば良いので、ブログに貼るなど)	
被害者
CSRF	
Webアプリ	
攻撃者	
被害者の   アカウント から 攻撃者の   アカウント に対する	
  
トークン   発行依頼	
  被害者
CSRF	
Webアプリ	
攻撃者	
  は 攻撃者の   アカウント に対するトークン  を発行	
  
⇒	
  	
  被害者の   アカウント と 攻撃者の   アカウント が紐付く	
  
被害者
CSRF	
Webアプリ	
攻撃者	
攻撃者は自分の   アカウントでログイン	
  
被害者の   上の情報を取得	
  
被害者
対策(Consumer)	
「ユーザー認可リクエスト」	
  
「アクセストークンリクエスト」	
  
この2つが同じセッションかをチェック	
  
state	
  パラメータを使う	
  
CSRF	
  対策	
Webアプリ	
攻撃者	
state	
  	
  値を含めて「ユーザ認可リクエスト」を投げる	
被害者	
state	
  は攻撃者のセッションに基づいて	
  	
  state	
  	
  値を発行	
  
CSRF	
  対策	
Webアプリ	
攻撃者	
  は被害者のセッションに基づく	
  	
  state	
  	
  値を発行	
  
被害者	
state	
state	
認可リクエスト時の	
  	
  state	
  	
  値が引き回される	
state
CSRF	
  対策	
Webアプリ	
攻撃者	
最初に発行した	
  	
  state	
  	
  と被害者の	
  	
  state	
  	
  値と比較	
  
⇒	
  検証に失敗!	
被害者	
state	
state	
 state
Case2.	
  redirect	
  URI	
  の改ざん
redirect	
  URI	
  の改ざん	
「ユーザー認可リクエスト」と「アクセストークンリクエスト」で	
  
異なる	
  redirect	
  URI	
  を指定	
  
	
  
	
  
攻撃者にアクセストークンを抜き取られ、被害者の個人情報に
アクセスされる、など	
  
手法	
リスク
redirect	
  URI	
  の改ざん	
「ユーザー認可リクエスト」と「アクセストークンリクエスト」で	
  
異なる	
  redirect	
  URI	
  を指定	
  
	
  
	
  
SP	
  に	
  redirect	
  URI	
  の事前登録をしない場合に発生
※Implicit	
  Grant	
  はSP	
  への	
  redirect	
  URI	
  の事前登録が必須なので、AuthorizaFon	
  
Code	
  Grant	
  に限られる	
手法	
条件
redirect	
  URI	
  の改ざん	
Webアプリ	
攻撃者	
攻撃者は予め、正規の   を使って 「ユーザ認可リクエスト」 を発行	
  
(    が設定している 「ユーザ認可リクエスト」 の	
  URI	
  を取得)
redirect	
  URI	
  の改ざん	
Webアプリ	
攻撃者	
  Consumer	
被害者	
被害者を先ほど入手した	
  URI	
  にアクセスさせる	
  
	
  ただし、redirect	
  URI	
  は攻撃者のConsumer	
  のものに差し替える	
  
redirect	
  URI	
  の改ざん	
Webアプリ	
攻撃者	
  Consumer	
redirect	
  URI	
  の事前登録がないので	
  
チェックをスルー	
被害者
redirect	
  URI	
  の改ざん	
Webアプリ	
攻撃者	
  Consumer	
redirect	
  URI	
  に指定されたように	
  
攻撃者の	
  Consumer	
  に到達	
被害者
redirect	
  URI	
  の改ざん	
Webアプリ	
攻撃者	
  Consumer	
攻撃者は、最初に入手した	
  
正しい	
  redirect	
  URI	
  に差し替えてリクエスト	
被害者
redirect	
  URI	
  の改ざん	
Webアプリ	
攻撃者	
  Consumer	
被害者	
  の本来のリクエストと同じなのでチェックを通過	
  
  は攻撃者の	
  Consumer	
  を   と誤認し、トークンを発行
redirect	
  URI	
  の改ざん	
Webアプリ	
攻撃者	
  Consumer	
被害者	
攻撃者がトークンを取得	
  
SP	
  上の被害者の情報にアクセスが可能
対策(SP)	
1)  redirect	
  URI	
  の事前登録をしておき、登録の
あるURIと同じかチェック	
  
2)  「ユーザー認可リクエスト」と	
  
  「アクセストークンリクエスト」で	
  	
  
  redirect	
  URI	
  が一緒かチェック	
  
redirect	
  URI	
  の改ざん 対策	
Webアプリ	
攻撃者	
  Consumer	
予め登録のある	
  redirect	
  URI	
  ではない	
  
⇒	
  検証失敗!	
被害者
redirect	
  URI	
  の改ざん 対策	
Webアプリ	
攻撃者	
  Consumer	
被害者	
「ユーザ認可リクエスト」の時と異なる	
  redirect	
  URI	
  が	
  
「アクセストークンリクエスト」で設定されている	
  
⇒	
  検証失敗!
他にも・・・
攻撃例	
•  Consumer	
  のなりすまし	
  
•  オープンリダイレクタ	
  
•  Implicit	
  Grant	
  におけるトークン置き換え	
  
などなど・・・(説明は逐次追記します)	
  
まとめ
まとめ	
•  OAuth	
  とは認可のプロトコル	
  
•  トークンはあくまで「何ができるか」を証明する
もの。「誰か」を証明するものではない	
  
•  トークンは第三者でも使用可能。漏れないよ
うに充分に配慮する	
  
•  セキュリティ上の配慮する点が多数。
Consumer	
  としても	
  SP	
  としても対策を怠らない
こと	
  
参考	
•  hZp://openid-­‐foundaFon-­‐japan.github.io/
rfc6749.ja.html	
  
•  hZp://www.slideshare.net/charlier-­‐shoe/
oauth-­‐20-­‐29540466	
  
•  hZp://www.atmarkit.co.jp/ait/arFcles/1209/10/
news105.html	
  
•  hZp://www.slideshare.net/ritou/idcon17-­‐oauth2-­‐
csrfprotecFonritou	
  
•  hZps://speakerdeck.com/ritou/openid-­‐
connectwoyong-­‐iteidlian-­‐xi-­‐woshi-­‐zhuang-­‐surutokiniqi-­‐
wofu-­‐kerukoto-­‐number-­‐yapcasia	
  
•  hZp://developer.yahoo.co.jp/yconnect/client_app/	
  

More Related Content

今更聞けないOAuth2.0