OpenID Connect Demo

IdCon #11   IDENTITY CONFERENCE



                        @ritou
やりません
Implicit Flowを考える会

IdCon #11   IDENTITY CONFERENCE



                        @ritou
OAuth 2.0には
Implicit Flowってのがありまして
Client Secretを
安全に保管できない場合に
 使うことになってます
使いどころ
• JavaScriptをインクルードしてClient ID
  だけ指定して呼び出せばOAuthの処
  理やっちゃう系

• iOS/Androidのアプリやデスクトップ
  PCなど、、リバースエンジニアリング
  可能なクライアント
今回問題となるのは、
いわゆる

OAuth認証
OAuth 2.0 + Profile API で SSO
   をImplicitでやる場合
10




     OAuth : Implicit Flow
            Server




Client   1. ログインしたい    End User
11




     OAuth : Implicit Flow
               Server



         2. Serverさん、
         ロッカーの
         合鍵ください

Client     1. ログインしたい   End User
12




     OAuth : Implicit Flow
               Server



         2. Serverさん、
         ロッカーの          3. 合鍵あげます
         合鍵ください

Client     1. ログインしたい     End User
13




         OAuth : Implicit Flow
                 Server
4. 合鍵を使って
プロフィール情報
 のロッカーに
    アクセス
          2. Serverさん、
          ロッカーの           3. 合鍵あげます
          合鍵ください

    Client    1. ログインしたい    End User
14




         OAuth : Implicit Flow
                 Server
4. 合鍵を使って

             ログイン
プロフィール情報
 のロッカーに
    アクセス
          2. Serverさん、

              成功
          ロッカーの           3. 合鍵あげます
          合鍵ください

    Client    1. ログインしたい    End User
これがそのまま行われる
 合鍵=Access Token
見せましょう
材料
• OAuth 2.0のImplicit Flowを利用するClient
  – Sample Client A




  できあがったものがこちらです。
  https://r-
    weblife.sakura.ne.jp/idcon11/SampleA.php
Access Tokenだけで
簡単にログインさせることが
     できました。
Access Tokenだけで
簡単にログインさせることが
     できました。
AccessTokenに紐づく人を
  認証された人として
     扱っています
もし、
サンプルサイトAの管理者が
  悪いことを考えたら
「うちでもらったAccess Token
 よそでも使えるのでは?」
24




     OAuth : Implicit Flow
            Server




Client   1. ログインしたい    End User
25




     OAuth : Implicit Flow
               Server



         2. Serverさん、
         ロッカーの
         合鍵ください

Client     1. ログインしたい   End User
26




     OAuth : Implicit Flow
               Server    Evil
                        Client
                                 3.こっそり
                                 別の合鍵
         2. Serverさん、            あげます
         ロッカーの
         合鍵ください

Client     1. ログインしたい      End User
27




         OAuth : Implicit Flow
                 Server    Evil
4. 合鍵を使って                 Client
プロフィール情報
                                   3.こっそり
 のロッカーに
                                   別の合鍵
    アクセス
          2. Serverさん、             あげます
          ロッカーの
          合鍵ください

    Client    1. ログインしたい     End User
28




         OAuth : Implicit Flow
                 Server    Evil
4. 合鍵を使って                 Client

             ログイン
プロフィール情報
                                   3.こっそり
 のロッカーに
                                   別の合鍵
    アクセス
          2. Serverさん、             あげます

             成功???
          ロッカーの
          合鍵ください

    Client    1. ログインしたい     End User
サイトAがもらったAccess
TokenでサイトBのレスポ
ンス中のAccessTokenを
置き換える
やりましょう
材料
• OAuth 2.0のImplicit Flowを利用するClient
  – Sample Client A
  – Sample Client B
• 悪い管理人
  –A

  できあがったものがこちらです。
  https://r-weblife.sakura.ne.jp/idcon11/SampleB.php
Access Tokenだけで
別人としてログインさせることが
      できました。
これはやばい?
Implicit Flowを
Disってるわけではない
フラグメントで受け取った
    AccessTokenを
信用するしかないしくみだし
Access Tokenは
リソースアクセスのためのもの
わかってて
Profile APIの結果で
ログインさせますか?
       って話
では、そういうClientに
ログインさせたい場合は
   どうすれば?
そこで
OpenID Connect
どう違うのか?
OpenID Connectでは、
認証結果の受け渡しに
   ID Tokenを使う
ID Token=紹介状
43




OpenID Connect : Implicit Flow
            Server




 Client   1. ログインしたい   End User
44




OpenID Connect : Implicit Flow
                Server



          2. Serverさん、
          証明書と合鍵
          ください

 Client     1. ログインしたい   End User
45




OpenID Connect : Implicit Flow
                Server



          2. Serverさん、   3. 合鍵と証明書
          証明書と合鍵             あげます
          ください

 Client     1. ログインしたい     End User
46




 OpenID Connect : Implicit Flow
                 Server



           2. Serverさん、   3. 合鍵と証明書
           証明書と合鍵             あげます
           ください

  Client     1. ログインしたい     End User
4. 証明書使って
 ログイン処理
47




   OpenID Connect : Implicit Flow
                 Server
5. 合鍵を使って
プロフィール情報
 のロッカーに
    アクセス                  3. 合鍵と証明書
          2. Serverさん、
          証明書と合鍵              あげます
          ください

    Client    1. ログインしたい    End User
 4. 証明書使って
  ログイン処理
48




         OAuth : Implicit Flow
                 Server
5. 合鍵を使って

          これで
プロフィール情報
 のロッカーに
    アクセス                  3. 合鍵と証明書
          2. Serverさん、

         いける?
          証明書と合鍵              あげます
          ください

    Client    1. ログインしたい    End User
 4. 証明書使って
  ログイン処理
ID Tokenの例
• eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3
  MiOiJodHRwOlwvXC
  9zZXJ2ZXIuZXhhbXBsZS5jb20iLCJ1c2VyX2lkIjoi
  MjQ4Mjg5NzYxMDAxIiwiYXVkIjoiaH
  R0cDpcL1wvY2xpZW50LmV4YW1wbGUuY29tI
  iwiZXhwIjoxMzExMjgxOTcwfQ.eDesUD0vzDH
  3T1G3liaTNOrfaeWYjuRCEPNXVtaazNQ
ID Tokenの例
• eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3

        意味不明
  MiOiJodHRwOlwvXC
  9zZXJ2ZXIuZXhhbXBsZS5jb20iLCJ1c2VyX2lkIjoi
  MjQ4Mjg5NzYxMDAxIiwiYXVkIjoiaH
  R0cDpcL1wvY2xpZW50LmV4YW1wbGUuY29tI
  iwiZXhwIjoxMzExMjgxOTcwfQ.eDesUD0vzDH
  3T1G3liaTNOrfaeWYjuRCEPNXVtaazNQ
ID Tokenの中身
• iss : Server Identifier
• user_id :
• aud : Client Identifier
• exp : (有効期限)
• acr : 認証レベルなど
• nonce : (リプレイアタック防ぐための文字列)
これらをJSON形式にして署名つけたもの
ID Tokenを使うメリット
• Server,Client,ユーザーID,nonceを含むため、
  Clientは自ら送ったリクエストに対するレスポ
  ンスだということを確認できる
OpenID Connectによって
Access Token置き換え攻撃
に気づけるのかやってみた
材料
• OAuth 2.0のImplicit Flowを利用するClient
  – Sample Client A
• OpenID ConnectのImplicit Flowを利用するClient
  – Sample Client C
• 悪い管理人
  –A

  できあがったものがこちらです。
  https://r-weblife.sakura.ne.jp/idcon11/SampleC.php
ID Tokenを使うことで
Access Token置き換え攻撃
       にも気づける
OpenID Connect
 やりましょう
いや、みなさん、
他にも言いたいこと
  あると思う
ID Tokenを
置き換えられないの?
ID Tokenを
置き換えられないの?
        ↓
中のClientIDやらを見て
検証すれば気づくはず
Access Tokenとの組み合わせも
     確認できないよね?
Access Tokenとの組み合わせも
     確認できないよね?
              ↓
          ID Tokenに
 Access Tokenのhashつっこむ
         のを検討中
続きはまたあとで!
 Twitter/Facebook/Google+
  などで質問受け付けます
(@_nat,@nov,@ritouあたり)

Idcon11 implicit demo