「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>OAuth 2.0 Threat Model and Security Considerations]]

* 目次 [#ff55f5a3]
#contents

*概要 [#i38da113]
OAuth 2.0 Threat Model and Security ConsiderationsのFlowに着目した脅威モデル。

* Authorization code [#v5721a5d]
**共通項 [#ve864d0d]
***共通的な影響 [#v20d442b]
-codeを用いたアクセストークン・リクエストが可能になる。~
(access_token, refresh_tokenの開示)

-ただし、アクセストークン・リクエストには、client_secretも必要。

***クライアントの信頼性 [#ue4d516b]
Authorization codeでは、クライアントにcodeが渡る。~
このクライアントの信頼性は、クライアントのタイプによって異なる。

-Webアプリケーション~
グローバルに一意なネットワークエンドポイント
-ネイティブクライアント~
デバイスローカルリソース(カスタムスキーム)

***攻撃区分での分類 [#tb52f62c]
-クライアント登録機能
--[[悪意のあるClientを認可してしまう>#j8c50476]]
--[[セッション・ハイジャック>#gb0b1185]]
--[[漏洩した利用者のcode注入>#p8bd5a13]]

-DNSまたはARPスプーフィング
--[[codeフィッシング>#e11c5a29]]
--[[セッション・ハイジャック>#gb0b1185]]

-codeの置換・注入
--[[漏洩した利用者のcode置換>#p8bd5a13]]
--[[CSRFによる攻撃者のcode注入>#z08fc60f]]
--[[code置換によるOAuthログイン>#p007b55e]]

-アクセストークンまで取得
--codeの置換・注入
--[[悪意のあるClientを認可してしまう>#j8c50476]]
--[[認証に対するクリック・ジャッキング>#ifb8644d]]
--[[Resource Owner偽装>#w700a02c]]

-DOSによるサーバ機能のダウン
--[[DOSによるリソース枯渇>#z4d95e73]]
--[[生成codeによるDoS>#e95bc5f9]]

**[[オープンリダイレクタ>OAuth 2.0 Threat Model (Role)#mb0f0219]] [#l753af85]

***影響 [#z5a0d9c8]
***攻撃 [#q982ff37]
***対策 [#q2e01988]

**codeの盗聴 [#u5dfaabe]
***影響 [#uea5e361]
[[共通的な影響>#v20d442b]]

***攻撃 [#h7eab0fb]
盗聴

***対策 [#xcaf95ff]
-SSL/TLSの利用
-クライアント認証
-短い有効期限
-1回限りの使用制限

**codeの漏洩 [#u5dfaabe]

***影響 [#uea5e361]
[[共通的な影響>#v20d442b]]

***攻撃 [#h7eab0fb]
(記録から)漏洩

-HTTP referer~
Redirectエンドポイントからのリダイレクト。

-WWWサーバの要求ログ

-WWWブラウザの履歴情報

***対策 [#xcaf95ff]
-SSL/TLSの利用
-クライアント認証
-短い有効期限
-1回限りの使用制限

-ブラウザキャッシュを自動的にクリーンアップするために、~
redirect_uriのターゲットページをリロードする。

**DBからcodeを盗難 [#a69b0a36]
***影響 [#uc8c688c]
-[[共通的な影響>#v20d442b]]
-すべてのcodeの開示
-合わせて、client_idやredirect_uriの漏洩

***攻撃 [#s3c22cf9]
-データベースへのアクセス権を取得
-SQLインジェクション攻撃

***対策 [#v1fb9d8a]
-システムのセキュリティ対策を実施
-標準のSQLインジェクション対策を実施
-codeハッシュのみを格納

**codeのオンライン推測 [#nf3c8c21]
***影響 [#y471fae0]
[[共通的な影響>#v20d442b]]

***攻撃 [#hd7112de]
codeのオンライン推測

***対策 [#e7dc0993]
-codeに高いエントロピーを使用
-強力なクライアント認証
-有効期間を短くする。
-トークンに署名する。

-codeをredirect_uriに紐付け検証する。
--redirect_uriは、スターターとアクセストークン・リクエストで必要とする。
--codeのオンライン推測に加え(client_id、client_secret、)redirect_uriが必要。

**悪意のあるClientを認可してしまう [#j8c50476]
***影響 [#j164b0c0]
悪意のあるClientが、アクセストークンを取得できる。

※ [[共通的な影響>#v20d442b]]には合致しない(アクセストークンの取得が可能)。

***攻撃 [#ze01a730]
-クライアントが登録される。
-フロー中のユーザ同意のシミュレートする(など)。

***対策 [#t31ea4f0]
-クライアント認証
-redirect_uri検証

-認可画面の表示
--目的(scope)の提示
--client_idに対応する名称
--access_tokenの期間

--自動再認証の抑止
--スクリーン・スクレイピングの防止(CAPTCHAs)

**codeフィッシング [#e11c5a29]

***影響 [#n52986ab]
[[共通的な影響>#v20d442b]]

***攻撃 [#v3499c66]
-クライアントに対するDNSまたはARPスプーフィングが行われる。
-悪意のあるClientに誘導してcodeを入手する。

***対策 [#gdfc03c4]
-クライアント認証
-redirect_uriをSSL/TLS(サーバ証明)で保護

**セッション・ハイジャック [#gb0b1185]
[[前述>#e11c5a29]]の考慮事項の、~
クライアント登録機能で登録されたクライアント版。

***影響 [#h9d1b672]
[[共通的な影響>#v20d442b]]

***攻撃 [#f681ed6a]
-クライアントが登録される。
-悪意のあるClientに対するDNSまたはARPスプーフィングが行われる。
-悪意のあるClientに誘導してcodeを入手する。

***対策 [#jf102672]
redirect_uriをSSL/TLS(サーバ証明)で保護

※ 登録機能で登録されたクライアントなので、クライアント認証は対策として無効。

**漏洩した利用者のcode置換 [#p8bd5a13]

***影響 [#a67d0e68]
攻撃者は、被害者のアカウントで正規のClientのリソースにアクセス可能。

※ [[共通的な影響>#v20d442b]]には合致しない(アクセストークンの取得が可能)。

***攻撃 [#mab43d26]

-脆弱なAuthorization Serverの既存のクライアントのredirect_uriを編集・追加する。
-悪意のあるClientに誘導してcode(state)を取得する。
-codeを他の正規のクライアントに向けてcode(state)を置換する。

***対策 [#gd3bf925]
-クライアント認証
-他のフローを使用する。

**CSRFによる攻撃者のcode注入 [#z08fc60f]

***影響 [#e45f294b]
脆弱なClientによって被害者は攻撃者のアカウントでリソースにアクセス可能。

※ [[共通的な影響>#v20d442b]]には合致しない(アクセストークンの取得が可能)。

***攻撃 [#a76152b7]
-攻撃者は、脆弱なClientをターゲットとしたcodeを収集し、
-CSRFのリンクを踏ませるなどのCSRF攻撃を行う。

***対策 [#seeda7ff]
-"state"パラメタを使用し、CSRFを防止する。
-ユーザの教育(偽造サイトのCSRFのリンクの識別)

**認証に対するクリック・ジャッキング [#ifb8644d]
***影響 [#i4595058]
攻撃者は、ユーザーの認証資格情報を盗み、リソースにアクセス

※ [[共通的な影響>#v20d442b]]には合致しない(アクセストークンの取得が可能)。

***攻撃 [#r77cfba2]
-ユーザを偽造サイトに誘導する。
-ダミーボタンのセットの上に、透明なiFrameでターゲットサイトを読み込む。
-ボタンをクリックすると、実際には隠しページのAuthorizeボタンなどをクリック。

***対策 [#o63d98a7]
-ユーザの教育(偽造サイトのクリック・ジャッキングの識別)

-IFrameの回避
--新しいブラウザ~
X-FRAME-OPTIONSヘッダ
--古いブラウザ~
アンチフレーム、フレームバストのJavaScript(すべてのブラウザで効果的でない)

**Resource Owner偽装 [#w700a02c]
***影響 [#ffa764c0]
攻撃者は、ユーザーの認証資格情報を盗み、リソースにアクセス

※ [[共通的な影響>#v20d442b]]には合致しない(アクセストークンの取得が可能)。

***攻撃 [#u436bc0c]
-クライアントが登録される。
-既存ログイン・セッションを持っている。

-悪意のあるクライアントは、

--リソース所有者の同意なしに認可要求をプログラムで送信
---HTML User Agentを組み込み、
---Authorization Serverによって送信されたHTML Formを解釈し、
---HTML Formに対応するHTTP POST要求を自動的に送信する。

--外部ブラウザで既存のセッションを乱用
--特定のデバイスでブラウザ間のクッキーを乱用
--別のスコープを静かに要求する。

***対策 [#t537780c]
-これは、CSRF対策を使用して防止することはできない。

-自動再認証、認可画面非表示を使用しない(行わない)。

-パスワード認証とユーザー同意を1つのフォームにまとめ、
--CAPTCHAを使用するか、
--ワンタイム秘密をリソース所有者に使用する。

-任意の通知手段によって認可をResource Ownerに通知する。

**DOSによるリソース枯渇 [#z4d95e73]
***影響 [#r3929e40]
リソース枯渇によるサーバ機能のダウン

***攻撃 [#cd626c90]
DOSにより、codeプールなどのリソースを枯渇させる。

***対策 [#kcee7ebf]
-ユーザ毎に付与されるアクセストークンの数を制限
-codeに重要な量のエントロピーを含める(ストアを使用しないということ?)

**生成codeによるDoS [#e95bc5f9]
***影響 [#fff3f00c]
リソース枯渇によるサーバ機能のダウン

***攻撃 [#h93f7d2a]
生成codeを使用して、redirect_uriにボットネットで攻撃する。

***対策 [#ab2571d1]
-"state"パラメタを使用し負荷軽減を行う。
-無効なcode要求の数がしきい値を超える
--クライアントからの接続を制限/禁止する。
--ユーザ・アカウントからの接続を制限/禁止する(Client側で認証が必要)。

**code置換によるOAuthログイン [#p007b55e]
***影響 [#i064d25e]
外部ログイン・シナリオで、被害者の身元を使用してログインしてしまう。

※ 外部ログイン・シナリオでは、userinfoエンドポイントに対するリクエストによってログインが完了する。

***攻撃 [#qf191ada]
-犠牲者の有効なcode(state)を収集する
-正規のClientのログイン・プロセスを開始させ、てcode(state)置換を行う。

※ [[漏洩した利用者のcode置換>#p8bd5a13]]を外部ログイン・シナリオで利用する。

***対策 [#z8c7a636]
-codeをaccess_tokenに交換する際、
--事前のユーザ認証
--ユーザIDとcodeの対応付け

-[[OpenID]]/[[OpenID Connect]]や[[SAML]]を利用

*Implicit [#f86d5264]
access_tokenは、
-Fragment identifierでClientに直接返される。
-HTTP refererを介して漏洩しない。

**共通項 [#x08ab3df]

***共通的な影響 [#x57472a2]
access_tokenの漏洩により、~
Resource Ownerの、そのscopeのリソースにアクセス可能になる。

***攻撃区分での分類 [#kee64f7a]
-クライアント
--[[悪意のあるClientを認可してしまう>#iafa8527]]

-DNSまたはARPスプーフィング
--[[スクリプトの実装を置換する>#t8d8d189]]

-codeの置換・注入
--[[CSRFによる攻撃者のaccess_token注入>#z004447e]]
--[[access_token置換によるOAuthログイン>#a94eb141]]

**Endpointからのaccess_token漏洩 [#c77be886]
***影響 [#y00961bc]
[[共通的な影響>#x57472a2]]

***攻撃 [#m77ffac9]
盗聴

***対策 [#r90440c1]
SSL/TLSの利用

**ブラウザ履歴からのaccess_token漏洩 [#of10be77]
***影響 [#y26ff3d4]
[[共通的な影響>#x57472a2]]

***攻撃 [#ae57a875]
ブラウザ履歴の参照

***対策 [#mf2daa3e]
-有効期間を短くする。
-スコープを制限する。
-キャッシュを無効化する。

**悪意のあるClientを認可してしまう [#iafa8527]
Implicitではクライアント認証が不可な点を除き、[[Authorization code>#j8c50476]]と同じ。

***影響 [#z11b1483]
-

***攻撃 [#edb73bc0]
-

***対策 [#b7f83e94]
-redirect_uri検証
-scope
--認可画面の表示(通常の仕様では認可画面非表示)
--若しくは、当該フロー(認可画面非表示)でのscope制限

**スクリプトの実装を置換する [#t8d8d189]
***影響 [#x2ad3d75]
[[共通的な影響>#x57472a2]]

***攻撃 [#w6a08854]
-DNSまたはARPスプーフィング
-攻撃者のスクリプトをダウンロードする。
-access_tokenの盗難・漏洩

***対策 [#ocade264]
-スクリプトを取得するSDNを認証する。
-スクリプトの改竄の確認処理を実装する。

-Introduce one-time, per-use secrets (e.g., "client_secret") values that can only be used by scripts in a small time window once loaded from a server.~
The intention would be to reduce the effectiveness of copying client-side scripts for re-use in an attacker's modified code.

**CSRFによる攻撃者のaccess_token注入 [#z004447e]
攻撃方法・対策は、[[Authorization code>#z08fc60f]]と同じ。

***影響 [#e769022a]
***攻撃 [#tac7e64c]
***対策 [#i129916c]

**access_token置換によるOAuthログイン [#a94eb141]
攻撃方法・対策は、[[Authorization code>#p007b55e]]と同じ。

***影響 [#bc67e7c0]
***攻撃 [#b22f52b3]
***対策 [#r3ec6f36]

*Resource Owner Password Credentials [#z7c59f6c]
[[OAuth]] 2.0ではIdPの仕様について言及されていないので、~
ここでは唯一、サインイン・プロセスの問題を扱う(ただし非対話)。

**共通項 [#t3a417b9]
***共通的な影響 [#dffb5785]
-クライアントにユーザID/パスワードが渡る。
-トークン取り消しが機能しない。
-認可プロセスを制御できない。

***攻撃区分での分類 [#lcf01c6d]

-ユーザID/パスワードの漏洩
--[[ユーザID/パスワードの盗難>#db447962]]
--[[ユーザID/パスワードの盗聴>#g872ebc1]]
--[[ユーザID/パスワードのオンライン推測>#s789d1f8]]
--[[Client側でのパスワードの露見アクシデント>#v557e2e3]]

-非対話的問題を突いた攻撃。
--[[意図しない不要に大きなscope>#w71cb4d0]]
--[[refresh_tokenによる長期的認可の維持>#bafbe5ca]]

**ユーザID/パスワードの盗難 [#db447962]
***影響 [#h002f857]
[[共通的な影響>#dffb5785]]

***攻撃 [#ueae69f1]
悪意のあるクライアントによるユーザID/パスワード盗難

***対策 [#b6dc1303]
-限定的に利用する。
--基本認証から移行する過渡期
--UserAgentがAuthorization Serverに接続できない場合
--ClientとAuthorization Serverが同じ組織に利用されているケース

-ユーザに異なるサービスに同じ~
ユーザID/パスワードを使用しないように促す。

-refresh_tokenとユーザIDの紐付けと検証(?

**ユーザID/パスワードの盗聴 [#g872ebc1]
***影響 [#ubfda847]
[[共通的な影響>#dffb5785]]

***攻撃 [#hf181037]
エンドポイントに対するユーザID/パスワード盗聴

***対策 [#k5d9ffbf]
-SSL/TLSを利用する。
-平文認証を使用しない代替認証を使用する。

**Client側でのパスワードの露見アクシデント [#v557e2e3]

***影響 [#a85d7b1b]
[[共通的な影響>#dffb5785]]

***攻撃 [#ma826c54]
クライアントが十分な保護を提供していない場合、偶発的に起きる。

***対策 [#adb2505d]
-他のフローを使用する。
-ダイジェスト認証を使用
-ログのパスワードを難読化

**意図しない不要に大きなscope [#w71cb4d0]

***影響 [#v8648471]
悪意のあるClientが、不要に大きなscopeを持ったトークンを取得できる。

***攻撃 [#j88ae5de]
悪意のあるClientが、不要に大きなscopeを持ったトークンを要求する。

***対策 [#w094e5b5]
-他の(対話的)フローを使用する。

-scope
--当該(非対話的)フローでのscope制限
--クライアントの信頼性よって緩和
--任意の通知手段によって認可をResource Ownerに通知する。

**refresh_tokenによる長期的認可の維持 [#bafbe5ca]

***影響 [#f5f2399c]
***攻撃 [#xff0ef19]
***対策 [#ze601703]
-他の(対話的)フローを使用する。

-当該フローでrefresh_token
--発行しない。
--クライアントの信頼性よって緩和
--任意の通知手段によってリフレッシュをResource Ownerに通知する。

**ユーザID/パスワードのオンライン推測 [#s789d1f8]

***影響 [#k2df1fdd]
単一のユーザー名とパスワードの組み合わせの啓示

***攻撃 [#p3f485b4]
有効なユーザー名とパスワードの組み合わせを推測

***対策 [#se987155]
-サインイン
--安全なパスワードポリシー設定する。
--ロックアウト、タールピット(一時的ロック)を使用する。
--CAPTCHAを使用する。

-他のフローを使用する。
-クライアント認証を併用する。

*Client Credentials [#ibd7170f]
[[Resource Owner Password Credentials>#z7c59f6c]]で説明したものと同様だが、~
ユーザID/パスワードは使用しないため、非対話的問題を突いた攻撃の考慮事項に限定される。

*参考 [#lc5dc6c9]
ネットでピックアップされていたもの。

**全グラント種別共通 [#c3d7e21e]

***影響 [#lbec317f]
Clientを用いた攻撃が可能になる。
-Clientなりすまし(偽装)
-悪意のあるClientの登録

***攻撃 [#gc415695]
-Clientなりすまし(偽装)
--client_idを盗んで、特定のClientになり済ますことができる。
--これにより、攻撃用のClientを使用した攻撃が可能になる。

-悪意のあるClientの登録
--する場合、悪意のあるClientが登録できる。
--Clientを利用してcodeやtokenを盗むことができる。

***対策 [#cbb19bc5]
-Clientなりすまし(偽装)~
クライアント認証、redirect_uri 検証

-悪意のあるClientの登録~
クライアントの登録機能をサポートしない。

**Authorization Code, Implicitグラント種別共通 [#hffc5d58]
Open Redirect

-参考
--OAuth 2.0 の脆弱性 (!?) "Covert Redirect" とは - OAuth.jp~
http://oauth.jp/blog/2014/05/07/covert-redirect/

***影響 [#jf7b939c]
攻撃者のClientのRedirectエンドポイントに誘導できる。

***攻撃 [#zc5470d3]
redirect_uriパラメタを用いたOpen Redirectの脆弱性を攻撃

***対策 [#y4c27338]
Authorization Serverの甘めの redirect_uri 検証処理に起因するので、~
Authorization Serverは、client_id + redirect_uri の事前登録必須 + 完全一致にする。

**Authorization Codeグラント種別 [#f4d89342]
codeの置換・注入(CSFR)

***影響 [#sc626f21]
-置換~
他人のaccess_tokenを取得できる可能性がある。

-注入(CSFR)~
自分のaccess_tokenで他のユーザが操作を行える。

***攻撃 [#n89ac6b8]
codeを収集し、置換・注入(CSFR)の攻撃を行う。

-置換
--自分のClientを使用して、他人のcodeを収集する。
--他人のcodeを収集して、自分のフロー中に埋め込む(置換)。

-注入(CSFR)
--攻撃対象のClientを使用して、自分のcodeを収集する。
--自分のcodeを収集して、他人のフロー中に埋め込む(注入(CSFR))。

***対策 [#o155e4ee]
-置換~
クライアント認証、redirect_uri 検証に対策を施す。

-注入(CSFR)~
ClientにCSFR対策を施す。
>認可エンドポイントへ遷移する際にstateパラメタを付与する。~
そして、Redirectエンドポイントでstateパラメタをチェックする。

**Implicitグラント種別 [#c9029c4e]
Tokenの置き換え(不正利用)

***影響 [#o2a2f9ae]
「OAuth 2.0 の implicit grant flow を認証に使うと、~
車が通れる程どてかいセキュリティ・ホールが開く。」らしい。

-単なる OAuth 2.0 を認証に使うと、車が通れるほどの~
どでかいセキュリティー・ホールができる | @_Nat Zone~
https://www.sakimura.org/2012/02/1487/

***攻撃 [#v9ede1f6]
この、セキュリティ・ホールとは、

ザックリ言って、

-攻撃者の構築したClient(A)は、[[Access Token>#jb722a87]]を収集する。
-攻撃者は、 [[Access Token>#jb722a87]]置き換え攻撃により、Client(B)経由でリソース・アクセスできる。

と言うモノらしい。

***対策 [#k43f998a]
access_tokenの[[JWT]]化などによって、Resource Server側でもClient検証を行う。

----
Tags: [[:認証基盤]], [[:クレームベース認証]], [[:OAuth]]
Tags: [[:IT国際標準]], [[:認証基盤]], [[:クレームベース認証]], [[:OAuth]]


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS