the security of openid authentication 2.0

53
WAS Forum Developers Day 2008 The Security of OpenID The Security of OpenID Authentication 2.0 Authentication 2.0 Toru Yamaguchi Toru Yamaguchi id:ZIGOROu id:ZIGOROu < < [email protected] [email protected] > >

Upload: toru-yamaguchi

Post on 22-Apr-2015

4.387 views

Category:

Technology


0 download

DESCRIPTION

 

TRANSCRIPT

Page 1: The Security of OpenID Authentication 2.0

WAS Forum Developers Day 2008

The Security of OpenID The Security of OpenID Authentication 2.0Authentication 2.0Toru YamaguchiToru Yamaguchi

id:ZIGOROuid:ZIGOROu <<[email protected]@cpan.org>>

Page 2: The Security of OpenID Authentication 2.0

About About -- 自己紹介自己紹介

名前名前山口山口 徹徹 (31)(31)

所属所属サイボウズ・ラボ株式会社サイボウズ・ラボ株式会社

ブログブログhttp://http://d.hatena.ne.jp/ZIGOROud.hatena.ne.jp/ZIGOROu//

その他その他http://http://search.cpan.org/̃zigorousearch.cpan.org/̃zigorou/ (CPAN)/ (CPAN)http://http://blogbattler.comblogbattler.com// ((個人活動、有志個人活動、有志))

Page 3: The Security of OpenID Authentication 2.0

AgendaAgenda -- 今日話すこと今日話すこと

OpenID Authentication Protocol OpenID Authentication Protocol OverviewOverviewSecurity of OpenIDSecurity of OpenID

Page 4: The Security of OpenID Authentication 2.0

OpenIDOpenID Authentication ProtocolAuthentication Protocol

TerminTerminologyologyInitiaInitiation & Discoverytion & Discovery

Authentication form for OpenIDAuthentication form for OpenIDThe three The three discorverydiscorvery

Communication TypeCommunication TypeDirectDirect CommunicationCommunicationIndirect CommunicationIndirect Communication

ProtocolProtocol MessagesMessagesassociateassociatecheckid_setupcheckid_setup, , checkid_immediatecheckid_immediatecheck_authenticationcheck_authentication

VerificationVerification assertionassertion

Page 5: The Security of OpenID Authentication 2.0

Terminology (1) Terminology (1) -- 用語用語 (1)(1)

IdentifierIdentifierURI URI またはまたは XRIXRI

Claimed IdentifierClaimed Identifierこれから認証されるこれから認証される Identifier Identifier

UserUser--AgentAgentBrowserBrowser

OpenIDOpenID Provider (OP)Provider (OP)認証サーバー認証サーバー

OPOP Endpoint URLEndpoint URL認証プロトコルメッセージの送信先認証プロトコルメッセージの送信先URLURL

Page 6: The Security of OpenID Authentication 2.0

TerminologyTerminology (2) (2) -- 用語用語 (2)(2)

RRelying Party (RP)elying Party (RP)実際に実際に OpenID OpenID 認証を利用するウェブサービス認証を利用するウェブサービス

OPOP IdentifierIdentifierOP OP を識別するを識別する Identifier (Identifier (つまりつまり URI or XRI)URI or XRI)

UserUser--Supplied IdentifierSupplied IdentifierClaimed Identifier Claimed Identifier またはまたは OP IdentifierOP Identifier実際にユーザから提供されうる実際にユーザから提供されうる Identifier Identifier の総称の総称

OP Local IdentifierOP Local IdentifierOPOP上でのユーザの上でのユーザのIdentifierIdentifierで、独自のドメインをで、独自のドメインをIdentifierIdentifierとすとする場合と特に区別して呼ぶ。またる場合と特に区別して呼ぶ。またdelegate (delegate (別の別のIdentifierIdentifierの認証の認証に委譲することに委譲すること) ) の際に最終的に依存するの際に最終的に依存するIdentifierIdentifierでもある。でもある。

Page 7: The Security of OpenID Authentication 2.0

Protocol Overview (1) Protocol Overview (1) -- 概要概要 (1(1))

Initiation & DiscoveryInitiation & DiscoveryRP RP はユーザに認証フォームを提供はユーザに認証フォームを提供ユーザは認証フォームにユーザは認証フォームに UserUser--Supplied Supplied Identifier Identifier を入力するを入力するRP RP はは discovery discovery を実行してを実行して UserUser--Supplied Supplied Identifier Identifier を認証する為のを認証する為の OPOP のの OP Endpoint OP Endpoint URLURL ((と必要な場合と必要な場合 OP Local Identifier) OP Local Identifier) を見を見つける。つける。

Page 8: The Security of OpenID Authentication 2.0

ProtocolProtocol Overview (2) Overview (2) -- 概要概要 (2)(2)

Protocol MessagesProtocol Messagesassociateassociate

認証メッセージの署名用に使う共有シークレットを認証メッセージの署名用に使う共有シークレットをRPRP--OPOP間で交換する間で交換する

checkid_setupcheckid_setup, , checkid_immediatecheckid_immediate実際に認証を行う為の認証リクエストを実行実際に認証を行う為の認証リクエストを実行

VerificationVerificationcheckidcheckid_* _* の結果が妥当であるかどうかを検の結果が妥当であるかどうかを検証する証する

Page 9: The Security of OpenID Authentication 2.0

Initiation Initiation -- 初期化初期化

認証のまず始めは認証のまず始めは RP RP がユーザに対して認がユーザに対して認証フォームを提供します。証フォームを提供します。

http://http://openiddirectory.comopeniddirectory.com// http://http://pibb.compibb.com//

Page 10: The Security of OpenID Authentication 2.0

DiscoveryDiscovery

UserUser--Supplied Identifier Supplied Identifier をを RPRPが受け取るが受け取るRP RP はは discovery discovery を実行しますを実行しますdiscovery discovery とは、そのとは、その Identifier Identifier を認証する為を認証する為のの OPOP Endpoint URLEndpoint URL を探すこと。を探すこと。delegate delegate の場合はの場合は OPOP--Local Identifier Local Identifier ももdiscovery discovery で探しますで探します

Page 11: The Security of OpenID Authentication 2.0

The three discoveries The three discoveries -- 三つのディスカバリ三つのディスカバリ

Identifier Identifier がが XRI XRI の場合はの場合は XRI XRI Resolution Resolution でで discoverydiscovery するする

結果は結果は XRDS XRDS と言う形式のと言う形式の XML XML 文書文書Identifier Identifier がが URI URI の場合の場合

最初は最初は YadisYadis Protocol (XRDSProtocol (XRDS--Simple)Simple) ででdiscovery discovery を試みるを試みる

成功したら成功したら XRDS XRDS 文書が返って来る文書が返って来るYadisYadis でダメならでダメなら HTML HTML 内の内の linklink 要素から取要素から取得する得する

Page 12: The Security of OpenID Authentication 2.0

XRDS formatXRDS format -- XRDS XRDS 形式形式<?<?xml versionxml version=="1.0""1.0" encodingencoding=="UTF"UTF--8"8"?>?><<xrdsxrds::XRDSXRDS

xmlnsxmlns::xrdsxrds==""xri://$xrdsxri://$xrds““xmlns:openidxmlns:openid="="http://http://openidopenid..netnet//xmlnsxmlns/1.0/1.0““xmlnsxmlns==""xri://$xrdxri://$xrd*($v*2.0)"*($v*2.0)">><XRD><XRD><Service <Service prioritypriority=="0""0">>

<Type><Type>http://specs.openid.net/auth/2.0/signonhttp://specs.openid.net/auth/2.0/signon</Type></Type><URI><URI>http://http://example.comexample.com/server/server</URI></URI><<LocalIDLocalID>>http://http://zigorou.example.comzigorou.example.com//</</LocalIDLocalID>>

</Service></Service><Service <Service prioritypriority=="1""1">>

<Type><Type>http://openid.net/signon/1.1http://openid.net/signon/1.1</Type></Type><URI><URI>http://http://example.comexample.com/server/server</URI></URI><<openidopenid::DelegateDelegate>>http://http://zigorou.example.comzigorou.example.com//</</openidopenid::DelegateDelegate>>

</Service></Service></XRD></XRD>

</</xrdsxrds::XRDSXRDS>>

Page 13: The Security of OpenID Authentication 2.0

YadisYadis discoverydiscovery

Yadis IDへGET or HEADYadis IDへ

GET or HEADX-XRDS-

Locationをmeta要素で持つ

X-XRDS-Locationをmeta

要素で持つ

X-XRDS-Locationをレスポンスヘッ

ダで持つ

X-XRDS-Locationをレスポンスヘッ

ダで持つ

X-XRDS-Locationヘッダを含むOr / And

Content-Typeがapplication/xrds+xml

X-XRDS-Locationヘッダを含むOr / And

Content-Typeがapplication/xrds+xml

文書のmimetypeがapplication/xrds+xml文書のmimetypeが

application/xrds+xml

YadisDocument(XRDS

document)

YadisDocument(XRDS

document)

Resource Descriptor URL

にGET

Resource Descriptor URL

にGET

XX--XRDSXRDS--LocationLocationヘッダがあるヘッダがある

XX--XRDSXRDS--LocationLocationヘッダがないヘッダがない

HEADHEADの場合での場合でmetameta要素にあり、他が該当しな要素にあり、他が該当しない場合は改めてい場合は改めてGETGETを行うを行う

Page 14: The Security of OpenID Authentication 2.0

HTML based discoveryHTML based discovery

headhead 要素内に所定のフォーマットで要素内に所定のフォーマットで OP OP Endpoint URL, OP Local Identifier Endpoint URL, OP Local Identifier を指定を指定しておくしておく

<head><link rel="openid2.provider openid.server"

href="http://openid.example.com/server" /><link rel="openid2.local_id openid.delegate"

href="http://zigorou.example.com/" /></head>

Page 15: The Security of OpenID Authentication 2.0

DDirectirect Communication Communication -- 直接通信直接通信

RPRP OOPP

1. OP1. OP Endpoint Endpoint URL URL へリクエストへリクエスト

2. 2. プロトコルのモードに応じた処理プロトコルのモードに応じた処理

3. 3. レスポンスレスポンス

Page 16: The Security of OpenID Authentication 2.0

IndirectIndirect Communication Communication -- 間接通信間接通信

ユーザユーザ RPRP OOPP

1. OP1. OP Endpoint Endpoint URL URL へのリダイレクト要求へのリダイレクト要求

2. OP Endpoint URL 2. OP Endpoint URL へリダイレクトへリダイレクト

3. 3. プロトコルのモードに応じた処理プロトコルのモードに応じた処理

4. RP 4. RP のの openid.return_toopenid.return_to へリダイレクト要求へリダイレクト要求

5. RP 5. RP のの openid.return_urlopenid.return_url へリダイレクトへリダイレクト

Page 17: The Security of OpenID Authentication 2.0

Message FormatMessage Format

application/xapplication/x--wwwwww--urlencodedurlencoded 形式形式つまりつまり key key -- value value 形式形式

OpenID Protocol OpenID Protocol のメッセージは全て接頭のメッセージは全て接頭辞に辞に ““openidopenid..”” をつけるをつける

openid.modeopenid.mode, , openid.nsopenid.ns, , openid.assoc_typeopenid.assoc_type, , openid.session_typeopenid.session_type

Page 18: The Security of OpenID Authentication 2.0

associate mode (1)associate mode (1)

RP, OP RP, OP との間で共有シークレットを交換する。プロトコとの間で共有シークレットを交換する。プロトコルメッセージの署名ルメッセージの署名(MAC(MACキーキー))に用いられるに用いられるCommunication type Communication type はは Direct CommunicationDirect Communicationassociation association がが OPOP--RP RP 間で確立している場合は、認証結間で確立している場合は、認証結果の妥当性検証に余計な通信を挟む必要が無い。果の妥当性検証に余計な通信を挟む必要が無い。((StatefulStatefulmode)mode)

association association が確立していなかったり、が確立していなかったり、RPRPががassoc_handleassoc_handleを保存を保存出来ない場合は、出来ない場合は、check_authenticationcheck_authentication モードで認証結果の検証モードで認証結果の検証を行うを行う (Stateless mode)(Stateless mode)

Page 19: The Security of OpenID Authentication 2.0

associate mode (2)associate mode (2)

署名アルゴリズム署名アルゴリズムHMACHMAC--SHA1 (OpenID 1.1 SHA1 (OpenID 1.1 の名残の名残))HMACHMAC--SHA256 (RECOMENDED)SHA256 (RECOMENDED)

セッション型セッション型NoNo--EncryptionEncryption

OP OP から返されるから返されるMACMACキーは平文キーは平文TLS/SSLTLS/SSL を使ってない通信路では絶対に使用しないを使ってない通信路では絶対に使用しない

DiffieDiffie--Hellman Hellman 鍵共有鍵共有DHDH--SHA1 SHA1 またはまたは DHDH--SHA256 SHA256 で共有シークレットを交換で共有シークレットを交換

Page 20: The Security of OpenID Authentication 2.0

checkid_setupcheckid_setup, , checkid_immediatecheckid_immediatemodemode

認証リクエストを行うモード認証リクエストを行うモードIndirect CommunicationIndirect Communication

openid.return_toopenid.return_to, , openid.realmopenid.realmreturn_toreturn_to はは 認証応答を受け取る認証応答を受け取る RP RP 上の上の URLURL で、で、realm realm はは return_toreturn_toで指定されたで指定された URL URL の検証の為に用いられるの検証の為に用いられる URL URL パターンを指定するパターンを指定する

checkid_setupcheckid_setup認証時に画面遷移を含む方式認証時に画面遷移を含む方式

checkid_immediatecheckid_immediateJavaScriptJavaScriptの非同期通信の非同期通信 ((iframeiframe) ) を用いて認証を用いて認証

そのそのRPRPに対して恒久的に認証結果を返すようにしているに対して恒久的に認証結果を返すようにしているそのそのOPOPに対するログインセッションが残っているに対するログインセッションが残っている

上記の条件が揃っていれば、認証結果が即座に返って来るが、そうでない上記の条件が揃っていれば、認証結果が即座に返って来るが、そうでない場合は場合は checkid_setupcheckid_setup に切り替えるに切り替える

Page 21: The Security of OpenID Authentication 2.0

Verification assertion Verification assertion -- アサーションの検証アサーションの検証

認証結果を認証結果をRPRPが受け入れる前の検証が受け入れる前の検証openid.return_toopenid.return_to と現在と現在RPRPにリクエストされにリクエストされたたURLURLを検証を検証RP RP がディスカバリした結果とアサーションのがディスカバリした結果とアサーションの結果との比較検証結果との比較検証nonce (nonce (openid.response_nonceopenid.response_nonce) ) の検証の検証アサーションの署名の検証アサーションの署名の検証

Page 22: The Security of OpenID Authentication 2.0

OpenID OpenID に対するセキュリティの話の前にに対するセキュリティの話の前に

以上でプロトコルの簡単な解説は終わり以上でプロトコルの簡単な解説は終わり今回はプロトコル解説ではなくセキュリティに関する話なので今回はプロトコル解説ではなくセキュリティに関する話なので☺☺必要な場合はプロトコルの説明もさらにします必要な場合はプロトコルの説明もさらにします

OpenID OpenID のセキュリティに対する考え方のセキュリティに対する考え方Protocol Protocol 上でセキュリティに対してどういう配慮がされているか上でセキュリティに対してどういう配慮がされているか現実的に考えうるセキュリティ上の脅威に対してどのような対策現実的に考えうるセキュリティ上の脅威に対してどのような対策を採るべきかを採るべきか

と言う二つの視点で考えて行きます。と言う二つの視点で考えて行きます。ちなみにほとんどのトピックは盗聴やら中間者攻撃です^^ちなみにほとんどのトピックは盗聴やら中間者攻撃です^^

Page 23: The Security of OpenID Authentication 2.0

盗聴と中間者攻撃盗聴と中間者攻撃盗聴に対する対策盗聴に対する対策

TLS/SSL TLS/SSL を使いましょう。使えない場合はを使いましょう。使えない場合は nonce nonce のチェックにのチェックによって防ぐことが出来ます。よって防ぐことが出来ます。

中間者攻撃とメッセージの署名中間者攻撃とメッセージの署名checkid_setupcheckid_setup, , checkid_immediatecheckid_immediate の際のメッセージのやり取の際のメッセージのやり取りには署名が用いられるりには署名が用いられる

つまりこの部分のやり取りの改ざんは用いるつまりこの部分のやり取りの改ざんは用いるHMACHMACの強度に依存の強度に依存一方で一方で discovery discovery やや associateassociate、、check_authenticationcheck_authentication には署名には署名が用いられないが用いられない

この部分はメッセージのやり取りに中間者攻撃の危険性があるこの部分はメッセージのやり取りに中間者攻撃の危険性があるやはりやはり TLS/SSL TLS/SSL を用いるのが対策の基本を用いるのが対策の基本

まずは何をおいてもまずは何をおいても TLS/SSL TLS/SSL を使う事が重要を使う事が重要

Page 24: The Security of OpenID Authentication 2.0

Discovery Discovery とと SecuritySecurity (1)(1)

Discovery Discovery とはとは ((復習復習))UserUser--Supplied Identifier Supplied Identifier を認証する為に、どの認証を認証する為に、どの認証サーバーを用いれば良いかを調べる行為サーバーを用いれば良いかを調べる行為

三つの方法があるが、いずれも外部と三つの方法があるが、いずれも外部とhttpshttps通信する通信する

DiscoveryDiscoveryを駆動するのはユーザを駆動するのはユーザつまりつまり RP RP にディスカバリを強制させる事が出来ると言にディスカバリを強制させる事が出来ると言うこと。うこと。

これを連発すればこれを連発すれば Denial of Service Attack Denial of Service Attack となるとなるIdentifier Identifier がが URI URI の場合は、任意のホストにある任意の場合は、任意のホストにある任意のポートに対してのポートに対して RP RP が接続試行する事になる。が接続試行する事になる。

ポートスキャンのような事が出来てしまいかねないポートスキャンのような事が出来てしまいかねない

Page 25: The Security of OpenID Authentication 2.0

Discovery Discovery とと Security (2)Security (2)

原則として攻撃者に対して有益な情報を与えない原則として攻撃者に対して有益な情報を与えないディスカバリが出来なかった理由を詳細に伝えない。ディスカバリが出来なかった理由を詳細に伝えない。エラーメッセージはただ出来なかっただけで良い。エラーメッセージはただ出来なかっただけで良い。

Identifier Identifier に対する一定のルールを設けるに対する一定のルールを設ける例えば例えば XRI XRI かか 80 or 443 80 or 443 以外は認めないなど以外は認めないなどプライベートアドレスに帰着する場合も弾くプライベートアドレスに帰着する場合も弾く

IP IP ベースの対策ベースの対策Denial of Service Attack Denial of Service Attack に対して有効な対策に対して有効な対策特定の閾値を設けてその特定の閾値を設けてそのIPIPからのアクセス自体を禁止からのアクセス自体を禁止するようにするするようにする

Page 26: The Security of OpenID Authentication 2.0

AssociationAssociation type, type, Association session typeAssociation session type

openid.modeopenid.mode=associate=associateの際に行う共有鍵の交換の際のの際に行う共有鍵の交換の際の話話

署名アルゴリズムの種別である署名アルゴリズムの種別である 二つの二つのAssociation type Association type と、と、macmacキーをどのように受け渡すかと言う方式である三つのキーをどのように受け渡すかと言う方式である三つの Association Association session type session type がある。がある。

AssociationAssociation TypeType AssociationAssociation Session TypeSession Type

HMAC-SHA1HMAC-SHA1

HMAC-SHA256HMAC-SHA256

no-encryptionno-encryption

DH-SHA1DH-SHA1

DH-SHA256DH-SHA256

Page 27: The Security of OpenID Authentication 2.0

DiffieDiffie--Hellman Hellman と中間者攻撃と中間者攻撃 (1)(1)

DiffieDiffie--HellmanHellman の長所の長所通信路が安全で無い場合でも安全に共有鍵を交通信路が安全で無い場合でも安全に共有鍵を交換出来る換出来る

DiffieDiffie--Hellman Hellman の短所の短所中間者攻撃に弱い中間者攻撃に弱い

どういう事かどういう事か通信路の安全性には問題は無いがやり取りする通信路の安全性には問題は無いがやり取りする二者が互いに期待しうる相手かどうかが問題。二者が互いに期待しうる相手かどうかが問題。

Page 28: The Security of OpenID Authentication 2.0

DiffieDiffie--Hellman Hellman と中間者攻撃と中間者攻撃 (2)(2)

図式化するとこういう事が考えられる図式化するとこういう事が考えられる

中間者中間者RPRP OOPP

1. OP1. OP だと思い込んで中間だと思い込んで中間者に者に associate associate

2. RP 2. RP のふりをしてのふりをして OP OP ににassociateassociate

33. . 共有鍵共有鍵 ((中間者中間者--OPOP間間) ) のの交換交換

4. 4. 共有鍵共有鍵 (RP(RP--中間者間中間者間) ) のの交換交換

最近話題になった最近話題になった ARP Spoofing ARP Spoofing やや DNS Spoofing DNS Spoofing が行われていた場合にこが行われていた場合にこうした危険性があるうした危険性がある

Page 29: The Security of OpenID Authentication 2.0

Association Best PracticeAssociation Best Practice

OP Endpoint URL OP Endpoint URL がが httpshttps にに((もも))対応の場合対応の場合かならずかならず https https を用いる。当然だが野良証明書は信じない。を用いる。当然だが野良証明書は信じない。AssociatioAssociation session type n session type にに DH DH を用いる意味は無くなるのでを用いる意味は無くなるのでnono--encryption encryption で。で。

残念ながら残念ながら http http の場合の場合DHDH--SHA256 SHA256 を採用するを採用するさらに通信相手が期待する相手かどうかチェックすべしさらに通信相手が期待する相手かどうかチェックすべし

プライベートアドレスを弾くとか、出来る限りのチェックをするプライベートアドレスを弾くとか、出来る限りのチェックをするdiscovery discovery の段階で見つけたの段階で見つけた OP Endpoint URL OP Endpoint URL を見て、を見て、httpshttps費費対応の場合には、そうした対応の場合には、そうした OP OP は信用しないと言う対策もありは信用しないと言う対策もあり

共通して言えること共通して言えることAssociationAssociation type type はは HMACHMAC--SHA256 SHA256 で。で。

Page 30: The Security of OpenID Authentication 2.0

Relying Party Relying Party の詐称の詐称 (1)(1)

端的に言えばフィッシングです端的に言えばフィッシングですhttp://http://idtheft.fun.deidtheft.fun.de//実際にデモを作った人が居ます実際にデモを作った人が居ます

myopenidmyopenid ではなくではなく idtheft.fun.deidtheft.fun.de に!に!

Page 31: The Security of OpenID Authentication 2.0

Relying Party Relying Party の詐称の詐称 (2)(2)

対策の方針対策の方針ブラックリストは未知のフィッシングサイトにブラックリストは未知のフィッシングサイトに対応出来ない為、愚策である。対応出来ない為、愚策である。今回の場合、何がおかしいかと言えば、今回の場合、何がおかしいかと言えば、

本来、本来、UserUser--Supplied Supplied IdentifierIdentifier を入れた場合、を入れた場合、RPRP はは discovery discovery してして OP Endpoint URL OP Endpoint URL にユーザにユーザを誘導するのが正しいを誘導するのが正しいにも関わらず、偽にも関わらず、偽OPOPの画面が出ているの画面が出ている

Page 32: The Security of OpenID Authentication 2.0

Relying Party Relying Party の詐称の詐称 (3)(3)

ブラウザがブラウザが OpenID OpenID 認証セッションに関与すれ認証セッションに関与すればいいばいい

OpenID OpenID の認証セッションかどうかを判定するにはの認証セッションかどうかを判定するにはRP RP の入力フォームがの入力フォームが openid_urlopenid_url またはまたはopenid_identifieropenid_identifier と言うと言う name name 属性を持っている場合属性を持っている場合に判断するに判断するIdentifier Identifier を入力してを入力してPOSTPOSTする段階でブラウザがする段階でブラウザがdiscovery discovery する。する。((それまで偽それまで偽RPRPにはにはIdentifierIdentifierを送信を送信しないしない))OP Endpoint URL OP Endpoint URL に対してに対して checkidcheckid_* _* リクエストがリクエストが成されない限り、その成されない限り、その OpenID OpenID 認証セッションにて認証セッションにてユーザーが認証情報を通知しないようにすれば良い。ユーザーが認証情報を通知しないようにすれば良い。

Page 33: The Security of OpenID Authentication 2.0

return_toreturn_to とと realm (1)realm (1)

return_toreturn_to,, realm realm とはとはRP RP が実際に認証リクエストをが実際に認証リクエストをOPOPに送るに送る ((checkidcheckid_*_*mode ) mode ) 時に、時に、

openid.return_toopenid.return_to で認証アサーション応答を受け取るで認証アサーション応答を受け取るURLURLをを指定する指定するopenid.realmopenid.realm でで return_toreturn_to の含まれるの含まれるURLURLパターンを指定パターンを指定するする

何のためにあるのか何のためにあるのかリダイレクトはユーザにとって、どこに飛ばされるかが一見分リダイレクトはユーザにとって、どこに飛ばされるかが一見分からないからないもし悪意のあるもし悪意のある RP RP がおかしながおかしな return_toreturn_to を指定した場合は?を指定した場合は?

Page 34: The Security of OpenID Authentication 2.0

return_toreturn_to とと realm (2)realm (2)

OpenID Realm SpoofingOpenID Realm Spoofingリダイレクタを持つ白なリダイレクタを持つ白な RP RP が踏み台にされるが踏み台にされるそのその RP RP のリダイレクタをのリダイレクタを return_toreturn_to に指定に指定するするリダイレクタのリダイレクト先を悪意のあるリダイレクタのリダイレクト先を悪意のあるRP RP のの callback callback urlurl とするとするそもそもそもそもOPOPからのリダイレクト直前はユーザからのリダイレクト直前はユーザにどのように見えるかにどのように見えるか

Page 35: The Security of OpenID Authentication 2.0

return_toreturn_to とと realm (3)realm (3)

国内某国内某 OP OP の例の例

これからどこにリダイレクトされるかまるで分からないこれからどこにリダイレクトされるかまるで分からない

早急に改善して下さい!!!早急に改善して下さい!!!早急に改善して下さい!!!

Page 36: The Security of OpenID Authentication 2.0

return_toreturn_to とと realm (4)realm (4)

国内某国内某 OPOP の例の例 -- その2その2return_toreturn_to にに googlegoogle のリダイレクタを指定し、のリダイレクタを指定し、realm realm にに googlegoogle を指定した場合を指定した場合実際の実際の RP RP は別のドメインは別のドメイン

ドメイン部分しか表示されていないドメイン部分しか表示されていない

Page 37: The Security of OpenID Authentication 2.0

return_toreturn_to とと realm (5)realm (5)

Realm Spoofing Realm Spoofing の図式の図式RPRP

OOPPユーザユーザ

リダイレクタリダイレクタ

1. RP1. RPへのへのURLURLを指定したリダイレクタへのリダイレクト要求を指定したリダイレクタへのリダイレクト要求

2. 2. リダイレクタへリダイレクトリダイレクタへリダイレクト

3. 3. 認証レスポンスも含めて認証レスポンスも含めて RP RP へリダイレクト要求へリダイレクト要求

4. RP 4. RP へリダイレクトへリダイレクト

Page 38: The Security of OpenID Authentication 2.0

return_toreturn_to とと realm (6)realm (6)

何が問題なのか何が問題なのか悪い例にあるとおり、これからリダイレクト先を明示しない悪い例にあるとおり、これからリダイレクト先を明示しない OP OP があったりがあったり

ユーザはこれからどこに飛ばされるかまったく分からないユーザはこれからどこに飛ばされるかまったく分からないあるいはあるいは return_toreturn_to で示されるで示される URL URL のの authority authority 部しか表示し部しか表示しないない OP OP もあるもある

一見、一見、GoogleGoogle に対して認証結果を返すかのように錯覚に対して認証結果を返すかのように錯覚下手すると下手すると Google Google がそのユーザにとって既知のがそのユーザにとって既知の RP RP だとしたら実装だとしたら実装如何では、如何では、Google Google に対するポリシーが適用されかねないに対するポリシーが適用されかねない

最悪のケース最悪のケース白な白な RP RP に対する認証ポリシーでに対する認証ポリシーでassertionassertionされてしまい、属性交されてしまい、属性交換時のデータ等が悪意のある換時のデータ等が悪意のある RP RP に盗まれるに盗まれる

Page 39: The Security of OpenID Authentication 2.0

return_toreturn_to とと realm (7)realm (7)

良い例良い例 SignOn.comSignOn.com

きちんときちんと return_toreturn_to が表示されている!が表示されている!

Page 40: The Security of OpenID Authentication 2.0

return_toreturn_to とと realm (8)realm (8)

どのように対策すべきかどのように対策すべきかOP OP は、当然だがは、当然だが return_toreturn_to のの URL URL がが realm realm で指定で指定されたパターンに合致しない場合は弾くされたパターンに合致しない場合は弾くまたまた return_toreturn_to が異なるドメインを指定していた場合が異なるドメインを指定していた場合も弾くも弾くrealm realm の指定範囲が広すぎるの指定範囲が広すぎる (*.com(*.com とかとか)) の場合もの場合も弾く弾くRP Discovery RP Discovery と言うのもあるがこれへの対策の決定打と言うのもあるがこれへの対策の決定打とはならなさそうとはならなさそう

ちなみにちなみに RP Discovery RP Discovery とはとは YadisYadis をを RPRP に対して行う事。に対して行う事。結果は結果は RP RP のの callback callback URL URL がが XRDS XRDS で返って来る。で返って来る。

Page 41: The Security of OpenID Authentication 2.0

nonce nonce の確認の確認 (1)(1)

openid.response_nonceopenid.response_nonce 値値認証アサーションが成功した場合に認証アサーションが成功した場合にOPOPから返から返されるレスポンスに含まれるされるレスポンスに含まれるOP OP はこの値が認証アサーションごとにユニーはこの値が認証アサーションごとにユニークである事を保障するクである事を保障する

Page 42: The Security of OpenID Authentication 2.0

nonce nonce の確認の確認 (2)(2)

RPRPがすべきことがすべきことこのこの nonce nonce 値に対して同じ値に対して同じ OP Endpoint URLOP Endpoint URL からのからの認証アサーションを既に受け付けていないかを確認す認証アサーションを既に受け付けていないかを確認すべきであるべきである

つまりつまり OP Endpoint URL OP Endpoint URL と対にしてと対にして nonce nonce 値を保持する必値を保持する必要がある要があるこれは認証アサーションの再利用攻撃であるこれは認証アサーションの再利用攻撃である Replay Replay 攻撃の防攻撃の防止策止策

nonce nonce では防げないことでは防げないことユーザの通信路に中間者が居る場合、ユーザよりも早く認証ユーザの通信路に中間者が居る場合、ユーザよりも早く認証アサーションを利用してしまう可能性があるアサーションを利用してしまう可能性があるTLS/SSLTLS/SSL を使えば良いを使えば良い

Page 43: The Security of OpenID Authentication 2.0

nonce nonce の確認の確認 (3)(3)

OP OP がすべきことがすべきことstateless stateless モードモード (association(associationハンドルが無いハンドルが無い) ) 時に署名検証の為に行う時に署名検証の為に行うcheck_authenticationcheck_authentication の際のレスポンスを、の際のレスポンスを、それぞれのそれぞれの nonce nonce に対してに対して22回以上発行しない。回以上発行しない。

つまり発行したつまり発行した nonce nonce を覚えておく必要があるを覚えておく必要があるこれもこれも Replay Replay 攻撃対策攻撃対策

Page 44: The Security of OpenID Authentication 2.0

Identifier Recycle Identifier Recycle -- 再利用問題再利用問題 (1)(1)

例えば次のようなケースを考える例えば次のようなケースを考えるユーザが用いているユーザが用いている Claimed Identifier Claimed Identifier のドメインがのドメインが他者の手に渡る他者の手に渡るOPOP が用いているドメインが他者の手に渡るが用いているドメインが他者の手に渡るOPOP上で既に退会したユーザの上で既に退会したユーザの Identifier Identifier を他の人に再を他の人に再発行する発行する

どうなるかどうなるかいずれにせよ他人によっていずれにせよ他人によって Identifier Identifier を騙る事が出来を騙る事が出来てしまうてしまうこれがこれが Identifier Recycle Identifier Recycle 問題問題

Page 45: The Security of OpenID Authentication 2.0

Identifier Recycle Identifier Recycle -- 再利用問題再利用問題 (2)(2)

URL URL の場合の場合OP OP はそもそも失効したはそもそも失効した Identifier Identifier を再発行すを再発行すべきでは無いべきでは無い仮に再発行する場合は重複しない値を仮に再発行する場合は重複しない値を URI URI fragment fragment としてとして Claimed Identifier Claimed Identifier に含め、に含め、それを認証アサーションの結果に入れるそれを認証アサーションの結果に入れる

つまりつまり RP RP はユーザの一意性を判断する為にはユーザの一意性を判断する為にClaimed Identifier Claimed Identifier とと fragment fragment の対を保持する必の対を保持する必要性がある要性がある

Page 46: The Security of OpenID Authentication 2.0

Identifier Recycle Identifier Recycle -- 再利用問題再利用問題 (3)(3)

XRIXRI の場合の場合そもそもそんな事は起こらないそもそもそんな事は起こらない

ii--namename例えば例えば ==zigorouzigorou のような物のような物これは失効したら他者が取得する可能性があるこれは失効したら他者が取得する可能性がある

ii--numbernumber永久に変わらない値で永久に変わらない値で =!545A.6972.43FA.38AD =!545A.6972.43FA.38AD ののような値ような値XRI Resolution XRI Resolution の結果であるの結果である XRDS XRDS 文書の文書のCannonicalIDCannonicalID 要素に書いてある要素に書いてあるRP RP はこの値を信じれば良いはこの値を信じれば良い

Page 47: The Security of OpenID Authentication 2.0

Reputation (1) Reputation (1) -- 評判評判 (1)(1)

Reputation Reputation とは何かとは何か対象がどの程度信頼できるかを測る指標対象がどの程度信頼できるかを測る指標OpenID OpenID には現時点で、には現時点で、OPOP やや RPRP、ユーザに対しての、ユーザに対してのReputation Reputation システムが存在しないシステムが存在しない

ReputationReputation の無い世界で何が起こる?の無い世界で何が起こる?野良野良 OP OP を信じて良いかどうか分からないを信じて良いかどうか分からない

OpenID OpenID はは User Centric User Centric な分散認証システムな分散認証システムつまり、どういうつまり、どういう OP OP と認証するか分からないと認証するか分からない

困った困った、、、、、、どうする?どうする?現時点での解は特定の現時点での解は特定の OP OP しか採用しないホワイトリストをしか採用しないホワイトリストを作るしかない作るしかない

Page 48: The Security of OpenID Authentication 2.0

Reputation (2) Reputation (2) -- 評判評判 (2)(2)

で、ホワイトリストはどう作るで、ホワイトリストはどう作る残念ながら基準はありません><残念ながら基準はありません><

ここから個人的な見解になりますここから個人的な見解になりますと言う訳で参考程度と言う感じで聴いて下さいと言う訳で参考程度と言う感じで聴いて下さい

Page 49: The Security of OpenID Authentication 2.0

Reputation (3) Reputation (3) -- 評判評判 (3)(3)

例えばどこかのブラックリストに載ってな例えばどこかのブラックリストに載ってないかを確かめるいかを確かめる

http://http://malwaredomains.commalwaredomains.com/ / とかとかGoogle Safe Browsing API ? (Google Safe Browsing API ? (この用途で利用この用途で利用出来る出来るAPIAPIかどうかは未確認かどうかは未確認))疑わしきは罰する方針疑わしきは罰する方針

Page 50: The Security of OpenID Authentication 2.0

Reputation (4) Reputation (4) -- 評判評判 (4)(4)

外部から分かる情報から評価外部から分かる情報から評価例えばドメインを長く所有し、例えばドメインを長く所有し、OPOP として長い間、運用として長い間、運用実績がある事を評価する実績がある事を評価するあるいは特定の機能の実装状況を見るあるいは特定の機能の実装状況を見る

それは先のリダイレクト時にどう表示されるとかそれは先のリダイレクト時にどう表示されるとかパスワードリマインダがしっかり実装されてるだとかパスワードリマインダがしっかり実装されてるだとか

OpenID OpenID 固有の問題も評価対象に固有の問題も評価対象にOP Endpoint URL OP Endpoint URL にに TLS/SSL TLS/SSL を使ってるかどうかを使ってるかどうかdiscovery discovery の形式は何かの形式は何か ( HTML ( HTML ベースよりベースより YadisYadis やや XRI XRI Resolution Resolution の方が良いとかの方が良いとか ))

Page 51: The Security of OpenID Authentication 2.0

Reputation (5) Reputation (5) -- 評判評判 (5)(5)

いずれにせよ機械的に評価出来れば最も良いずれにせよ機械的に評価出来れば最も良いいさらに言えばそれをさらに言えばそれを RP RP がいつでも利用出がいつでも利用出来るように出来ればいい来るように出来ればいい

ドラフトは出てるドラフトは出てるTrusted Data ExchangeTrusted Data Exchangehttp://http://wiki.openid.net/Trusted_Data_Exchangewiki.openid.net/Trusted_Data_Exchange

Page 52: The Security of OpenID Authentication 2.0

まとめまとめ

OpenID OpenID のセキュリティで大事な事のセキュリティで大事な事通信経路に出来る限り通信経路に出来る限り TLS/SSL TLS/SSL を用いるを用いるリダイレクトを挟むシーンはユーザにきちんと明示すリダイレクトを挟むシーンはユーザにきちんと明示するる

さらにプロトコルのフロー上おかしなリダイレクトは弾くべさらにプロトコルのフロー上おかしなリダイレクトは弾くべきき

nonce nonce の保持、確認を徹底するの保持、確認を徹底するURI fragment, iURI fragment, i--number number の保持、確認を徹底するの保持、確認を徹底する

以上の事をきちんと守れば、以上の事をきちんと守れば、RPRPでもでもOPOPでも安全でも安全性が高いと評価されていくでしょう性が高いと評価されていくでしょう

Page 53: The Security of OpenID Authentication 2.0

ThanksThanks youyou

ご清聴ありがとうございましたご清聴ありがとうございました