MS_OAuthThreatModelAuthCodeFlow - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki
- æ»ãïŒOAuth 2.0 Threat Model (Flow)ïŒ
- OAuth 2.0 Threat Model (Authorization code Flow)
- OAuth 2.0 Threat Model (Implicit Flow)
- OAuth 2.0 Threat Model (Resource Owner Password Credentials Flow)
OAuth 2.0 Threat Model and Security Considerationsã®
Flow ã«çç®ããè
åšã¢ãã«ã®ãã¡ãäž»ã«ãcode æŒæŽ©ã«ãã©ãŒã«ã¹ããå
容ã
ïŒèšé²ããïŒæŒæŽ©
-
HTTP referer
Redirect ãšã³ããã€ã³ãããã®ãªãã€ã¬ã¯ãã -
WWW ãµãŒãã®èŠæ±ãã°
-
WWW ãã©ãŠã¶ã®å±¥æŽæ å ±
-
äžèšããªãŒãã³ã»ãªãã€ã¬ã¯ã¿ã
-
SSL/TLS ã®å©çš
-
ã¯ã©ã€ã¢ã³ãèªèšŒ
-
ãã©ãŠã¶ã»ãã£ãã·ã¥ãèªåçã«ã¯ãªãŒã³ã¢ããããããã«ã
redirect_uriã®ã¿ãŒã²ããã»ããŒãžããªããŒãããã -
code
- çãæå¹æé
- 1 åéãã®äœ¿çšå¶é
code æŒæŽ©ã«ããã
-
code ãçšããã¢ã¯ã»ã¹ããŒã¯ã³ã»ãªã¯ãšã¹ããå¯èœã«ãªãã
ïŒaccess_token, refresh_token ã®éç€ºïŒ -
ãã ããã¢ã¯ã»ã¹ããŒã¯ã³ã»ãªã¯ãšã¹ãã«ã¯ã
client_secretãå¿ èŠã
è£è¶³ïŒä»ã¯
code_verifierãå¿ èŠïŒ: ãclient_secretãå¿ èŠããšãã
åæã¯ Confidential Client ã«ããæãç«ããããã€ãã£ã ã¢ããªã
SPA ã§ã¯æç«ããªã
ïŒç§å¯ãé ããªãããïŒã
ãããåããã®ã PKCEïŒRFC 7636ïŒã§ã
code ãéå§ããã¯ã©ã€ã¢ã³ãã ããç¥ãcode_verifierã
ããŒã¯ã³èŠæ±æã«èŠæ±ããã
Security BCPïŒRFC 9700ïŒ/ OAuth 2.1
ã§ã¯ ãã¹ãŠã®ã¯ã©ã€ã¢ã³ãã§ PKCE å¿ é ãšãªã£ãŠããã
æ¬ç¯ã®ãcode æŒæŽ©ãã®è åšã¯å€§å¹ ã«è»œæžãããŠããã
Authorization Code ã§ã¯ãClient ã« code ãæž¡ãã
ãã® Client ã®ä¿¡é Œæ§ã¯ãClient ã®ã¿ã€ãã«ãã£ãŠç°ãªãã
- Web ã¢ããªã±ãŒã·ã§ã³
ã°ããŒãã«ã«äžæãªãããã¯ãŒã¯ãšã³ããã€ã³ã - ãã€ãã£ãã¯ã©ã€ã¢ã³ã
ããã€ã¹ããŒã«ã«ãªãœãŒã¹ïŒã«ã¹ã¿ã ã¹ããŒã ïŒ
è£è¶³ïŒã«ã¹ã¿ã ã¹ããŒã ã®å¥ªãåãïŒ: ãããã€ã¹ããŒã«ã«ãªãœãŒã¹
ïŒã«ã¹ã¿ã ã¹ããŒã ïŒããäžæã§ãªãã®ãããã€ãã£ã ã¢ããªç¹æã®åŒ±ç¹ã§ããã
åãã«ã¹ã¿ã ã¹ããŒã ïŒmyapp://ïŒãåŸããå ¥ããå¥ã¢ããªã
暪åãã§ããŠããŸãïŒOS ãä¿èšŒããªãïŒã
ãã®ãã OAuth 2.0 for Native AppsïŒRFC 8252ïŒã¯ã
Claimed HTTPS ã¹ããŒã ïŒiOS ã® Universal Links /
Android ã® App LinksïŒããã«ãŒããã㯠ã¢ãã¬ã¹
ïŒhttp://127.0.0.1:{port}ïŒãæšå¥šããŠããã
äžèšã®ãå ±éçãªåœ±é¿ã
çèŽ
-
SSL/TLS ã®å©çš
-
ã¯ã©ã€ã¢ã³ãèªèšŒ
-
code
- çãæå¹æé
- 1 åéãã®äœ¿çšå¶é
äžèšã®ãå ±éçãªåœ±é¿ã
code ã®ãªã³ã©ã€ã³æšæž¬
-
ã¯ã©ã€ã¢ã³ãèªèšŒ
-
code
- çãæå¹æé
- 1 åéãã®äœ¿çšå¶é
- é«ããšã³ããããŒã䜿çš
- code ã
redirect_uriã«çŽä»ãæ€èšŒããã-
redirect_uriã¯ãã¹ã¿ãŒã¿ãŒãšã¢ã¯ã»ã¹ããŒã¯ã³ã»ãªã¯ãšã¹ãã§å¿ èŠãšããã - code ã®ãªã³ã©ã€ã³æšæž¬ã«å ãïŒ
client_idãclient_secretãïŒ
redirect_uriãå¿ èŠã
-
- ãã¹ãŠã® code ã®é瀺ïŒäžèšã®ãå ±éçãªåœ±é¿ãïŒ
- åãããŠã
client_idãredirect_uriã®æŒæŽ©
- ããŒã¿ããŒã¹ãžã®ã¢ã¯ã»ã¹æš©ãååŸ
- SQL ã€ã³ãžã§ã¯ã·ã§ã³æ»æ
- ã·ã¹ãã ã®ã»ãã¥ãªãã£å¯Ÿçã宿œ
- æšæºã® SQL ã€ã³ãžã§ã¯ã·ã§ã³å¯Ÿçã宿œ
- code ããã·ã¥ã®ã¿ãæ ŒçŽ
ãªãŒãã³ã»ãªãã€ã¬ã¯ã¿ããDNS ãŸã㯠ARP ã¹ããŒãã£ã³ã°ãçšããããã
- OAuth 2.0 ã®èåŒ±æ§ (!?) "Covert Redirect" ãšã¯ - OAuth.jp
http://oauth.jp/blog/2014/05/07/covert-redirect/
OAuth 2.0 Threat Model (Role)ã®
ããªãŒãã³ã»ãªãã€ã¬ã¯ã¿ããåç
§ã
äžèšã®ãå ±éçãªåœ±é¿ã
redirect_uri ã䜿çšããŠä»»æã® URL ã«èªå°
redirect_uri ã®ãã«ãã¹ç»é²ã»æ€èšŒ
äžèšã®ãå ±éçãªåœ±é¿ã
- ClientïŒãšèšããããã³ã³ã§ã¯ä»»æã®
redirect_uriïŒ
ã«å¯Ÿãã DNS ãŸã㯠ARP ã¹ããŒãã£ã³ã°ãè¡ãããã - æªæã®ãã Client ã«èªå°ã㊠code ãå ¥æããã
- ã¯ã©ã€ã¢ã³ãèªèšŒ
-
redirect_uriã SSL/TLS
ïŒãµãŒã蚌æïŒã§ä¿è·
äžèšãcode ãã£ãã·ã³ã°ãã®èæ
®äºé
ã«ã
ãClient ç»é²æ©èœã§ç»é²ãããæªæã®ãã Clientãã远å ããçã
äžèšã®ãå ±éçãªåœ±é¿ã
- æªæã®ãã Client ãç»é²ãããã
- æªæã®ãã Client ã«å¯Ÿãã DNS ãŸã㯠ARP ã¹ããŒãã£ã³ã°ãè¡ãããã
- æªæã®ãã Client ã«èªå°ã㊠code ãå ¥æããã
redirect_uri ã SSL/TLS
ïŒãµãŒã蚌æïŒã§ä¿è·
-
ç»é²æ©èœã§ç»é²ããã Client ãªã®ã§ãã¯ã©ã€ã¢ã³ãèªèšŒã¯å¯ŸçãšããŠç¡å¹ã
-
åŸã£ãŠãã¢ã¯ã»ã¹ããŒã¯ã³ã»ãªã¯ãšã¹ãããã¹ãããå¯èœæ§ãé«ãŸãã
-
ãã ããcode ãš clientïŒäŸãã°ã
redirect_uriãªã©ïŒãã
çŽä»ããä»çµã¿ãå°å ¥ããã°ã察çã¯å¯èœãšæãããã
è£è¶³ïŒãã®ãçŽä»ããä»çµã¿ãã PKCEïŒ: å ããŒãžã
ã察çã¯å¯èœãšæãããããšæšæž¬ããŠããä»çµã¿ã¯ã
code ãããããéå§ããã¯ã©ã€ã¢ã³ãèªèº«ãã«çžããšãããã®ã§ã
ãŸãã« PKCE ãå®çŸããããšã§ãã
ïŒredirect_uriã§ã¯ãªããã¯ã©ã€ã¢ã³ããæ¯åçæãã
code_verifierã®ããã·ã¥ã§çžãç¹ãããã匷ãïŒã
æ¬ããŒãžã®åæã 2013 幎ãPKCE ã® RFC 7636 ã 2015 幎ãªã®ã§ã
èè ã®èŠç«ãŠã¯åŸã®æšæºåãå åãããŠããããšã«ãªãã
äžèšãã»ãã·ã§ã³ã»ãã€ãžã£ãã¯ããåç §ã
æ»æè ã¯ãResource Owner ã®èªèšŒè³æ Œæ å ±ãçã¿ããªãœãŒã¹ã«ã¢ã¯ã»ã¹
-
æªæã®ãã Client ãç»é²ãããã
-
æ¢åãã°ã€ã³ã»ã»ãã·ã§ã³ãæã£ãŠããã
- å€éšãã©ãŠã¶ã§æ¢åã®ã»ãã·ã§ã³ãä¹±çš
- ç¹å®ã®ããã€ã¹ã§ãã©ãŠã¶éã®ã¯ãããŒãä¹±çš
-
æªæã®ãã Client ã¯ã
-
以äžã®æ¹æ³ã§èªå¯ç»é¢ã® POST ããã¯ãããã°ã©ã ã§éä¿¡
- WebView ãªã©ã®çµèŸŒãã©ãŠã¶ãçµã¿èŸŒã¿ã
- Authorization Server ã«ãã£ãŠéä¿¡ããã HTML Form ãè§£éãã
- HTML Form ã«å¯Ÿå¿ãã POST ããã¯ãèªåçã«éä¿¡ã
-
ããã«ãããå¥ã® scope ã®ã¢ã¯ã»ã¹ããŒã¯ã³ãåæãªãã§ååŸå¯èœã
-
-
ããã¯ãCSRF 察çã䜿çšããŠé²æ¢ããããšã¯ã§ããªãã
-
èªååèªèšŒãèªå¯ç»é¢é衚瀺ã䜿çšããªãïŒè¡ããªãïŒã
-
ãã¹ã¯ãŒãèªèšŒãšãŠãŒã¶åæã 1 ã€ã®ãã©ãŒã ã«ãŸãšãã
- CAPTCHA ã䜿çšãããã
- ã¯ã³ã¿ã€ã ç§å¯ã Resource Owner ã«äœ¿çšããã
-
ä»»æã®éç¥ææ®µã«ãã£ãŠèªå¯ã Resource Owner ã«éç¥ããã
æªæã®ãã Client ããã¢ã¯ã»ã¹ããŒã¯ã³ãååŸã§ããã
- æªæã®ãã Client ãç»é²ãããã
- æªæã®ãã Client ã¯ããããŒäžã®ãŠãŒã¶åæãã
ã¹ã¯ãªãŒã³ã»ã¹ã¯ã¬ã€ãã³ã°æè¡ãå©çšããŠã·ãã¥ã¬ãŒãããïŒãªã©ïŒã
-
redirect_uriæ€èšŒ -
ç»é¢ã®è¡šç€º
- èªååèªèšŒã®ææ¢
- èªå¯ç»é¢ã®è¡šç€º
- ç®çïŒscopeïŒã®æç€º
-
client_idã«å¯Ÿå¿ããåç§° - access_token ã®æé
- ã¹ã¯ãªãŒã³ã»ã¹ã¯ã¬ã€ãã³ã°ã®é²æ¢ïŒCAPTCHAïŒ
-
æ¢å Client ãå©çšããæ»æãªã®ã§ãClient ç»é²æ©èœãç¡ããŠãæ»æå¯èœã
-
code ã®çœ®æã»æ³šå ¥ããããå ¶ã 以äžã®ãããªç¹åŸŽãããã
- code ã®çœ®æïŒã被害è ã®ã¢ã«ãŠã³ããã§ãªãœãŒã¹ã«ã¢ã¯ã»ã¹
- code ã®æ³šå ¥ïŒãæ»æè ã®ã¢ã«ãŠã³ããã§ãªãœãŒã¹ã«ã¢ã¯ã»ã¹
â» äžèšã®ãå ±éçãªåœ±é¿ãã«ã¯åèŽããªãïŒã¢ã¯ã»ã¹ããŒã¯ã³ã®ååŸãå¯èœïŒã
æ»æè
ã¯ãã被害è
ã®ã¢ã«ãŠã³ããã§ãªãœãŒã¹ã«ã¢ã¯ã»ã¹å¯èœã
ïŒè¢«å®³è
ã®ã¢ã«ãŠã³ãã«çŽä»ãããªãœãŒã¹ã® CRUD ãå¯èœïŒ
-
被害è ã® codeïŒ
stateïŒãå ¥æããã- äžèšãåçŽãªæ»æãã§ã¯ã
stateãå ¥æã§ããªãã - è匱㪠Authorization Server ã®æ¢åã®ã¯ã©ã€ã¢ã³ãã®
redirect_uriã
ç·šéã»è¿œå ããã
ïŒã³ã³ã§ã¯ãredirect_uriãã©ã¡ã¿ã§ã¯ãªãã
ç»é²ãããŠããããŒã¿ãã®ãã®ã®ç·šéã»è¿œå ãèšã£ãŠããæš¡æ§ïŒ
- äžèšãåçŽãªæ»æãã§ã¯ã
-
codeïŒ
stateïŒãä»ã®æ£èŠã®ã¯ã©ã€ã¢ã³ãã«åããŠçœ®æããã
-
redirect_uriã®æ¹ãããªã©ããããªãããã«ããã -
ãã®ä»
- ã¯ã©ã€ã¢ã³ãèªèšŒ
- ä»ã®ãããŒã䜿çšããã
è匱㪠Client ã«ãã£ãŠè¢«å®³è
ã¯ãæ»æè
ã®ã¢ã«ãŠã³ããã§ãªãœãŒã¹ã«ã¢ã¯ã»ã¹å¯èœã
ïŒæ»æè
ã®ã¢ã«ãŠã³ãã«çŽä»ãããªãœãŒã¹ã®ã¹ãã¢ã«
被害è
ã®ããŒã¿ãç»é²ãããããšãåºæ¥ãïŒ
æ»æè ã¯ãè匱㪠Client ãã¿ãŒã²ãããšããŠã
- Client ã察象ãšãã code ãåéããã
- ãã® code ãå«ã Client ãžã® CSRF ãªã³ã¯ãèžãŸããã
-
stateãã©ã¡ã¿ã䜿çšããCSRFã鲿¢ããã - ãŠãŒã¶ã®æè²ïŒåœé ãµã€ãã® CSRF ã®ãªã³ã¯ã®èå¥ïŒ
å€éšãã°ã€ã³ã»ã·ããªãªã§ãæ»æè
ã¯ãã被害è
ã®ã¢ã«ãŠã³ããã§ãã°ã€ã³å¯èœ
ïŒå Žåã«ãã£ãŠã¯ãæªæã®ããã¢ããªã±ãŒã·ã§ã³ã«ãã°ã€ã³ãããããšãåºæ¥ãïŒ
â» å€éšãã°ã€ã³ã»ã·ããªãªã§ã¯ãuserinfo ãšã³ããã€ã³ãã«å¯Ÿãã
ãªã¯ãšã¹ãã«ãã£ãŠãã°ã€ã³ãå®äºããã
äžèšãæŒæŽ©ããå©çšè ã® code 眮æããå€éšãã°ã€ã³ã»ã·ããªãªã§å©çšããã
code ã access_token ã«äº€æããéã
- äºåã®ãŠãŒã¶èªèšŒ
- ãŠãŒã¶ ID ãš code ã®å¯Ÿå¿ä»ã
OpenID / OpenID Connectã
SAMLãå©çš
ïŒaudã«ãã Client å¶éãè¡ãããšãåºæ¥ãïŒ
è£è¶³ïŒ
stateã ãã§ã¯è¶³ããªãããçµè«ïŒ: æ¬ç¯ã«äžŠã¶ 3 ã€ã®æ»æ
ïŒçœ®æã»æ³šå ¥ã»OAuth ãã°ã€ã³ïŒã¯ããããã
stateãã©ã¡ã¿ã ãã§ã¯é²ããªããšããç¹ã§å ±éããŠãã
ïŒstateã¯ãèªåãå§ãããããŒãããã確ãããããªãïŒã
çŸåšã®æšæºçãªå¯Ÿçã¯æ¬¡ã® 2 ã€ã§ããã
- PKCEïŒRFC 7636ïŒ
code ãéå§ããã¯ã©ã€ã¢ã³ãèªèº«ã«çžããcode æ³šå ¥ãžã®çŽæ¥ã®çããissãã©ã¡ã¿ïŒRFC 9207ïŒ
èªå¯ã¬ã¹ãã³ã¹ã«çºè¡è ãæç€ºããè€æ° IdP æ§æã§ã®åãéããé²ããå€éšãã°ã€ã³ïŒOAuth ãã°ã€ã³ïŒã«ã€ããŠã¯ã
OpenID Connect ã® ID ããŒã¯ã³ã䜿ãã
aud/nonce/issãæ€èšŒããã®ãæ£è§£ã§ãã
ïŒOAuth ã«ããå€éšãã°ã€ã³ïŒèªèšŒïŒã®ç ç©¶ãåç §ïŒã
â» äžèšã®ãå ±éçãªåœ±é¿ãã«ã¯åèŽããªãïŒã¢ã¯ã»ã¹ããŒã¯ã³ã®ååŸãå¯èœïŒã
- äžèšãWebView ãªã©ã®çµèŸŒãã©ãŠã¶ïŒResource Owner åœè£ ïŒã
- äžèšãã¹ã¯ãªãŒã³ã»ã¹ã¯ã¬ã€ãã³ã°ã
- äžèšãæŒæŽ©ããå©çšè ã® code 眮æã
- äžèšãCSRF ã«ããæ»æè ã® code æ³šå ¥ã
- äžèšãcode 眮æã«ãã OAuth ãã°ã€ã³ã
æ»æè ã¯ãResource Owner ã®èªèšŒè³æ Œæ å ±ãçã¿ããªãœãŒã¹ã«ã¢ã¯ã»ã¹
-
äžèšãã¹ã¯ãªãŒã³ã»ã¹ã¯ã¬ã€ãã³ã°ãã«è¿ããã
- ãæªæã®ãã Clientãã®
- ãPOST ããã¯ãèªåçããã
- ãã¹ã¯ãªãŒã³ã»ã¹ã¯ã¬ã€ãã³ã°æè¡ãã§ã¯ãªã
- ãåœé ãµã€ããã®ãã¯ãªãã¯ã»ãžã£ããã³ã°ããšããã
- ãæªæã®ãã Clientãã®
-
以äžã§èªèšŒæžã¿ã¢ã¯ã»ã¹ããã
- Resource Owner ãåœé ãµã€ãã«èªå°ããã
- ãããŒãã¿ã³ã®ã»ããã®äžã«ãéæãª iFrame ã§ã¿ãŒã²ãããµã€ããèªã¿èŸŒãã
- ãã¿ã³ãã¯ãªãã¯ãããšãå®éã«ã¯é ãããŒãžã® Authorize ãã¿ã³ãªã©ãã¯ãªãã¯ã
-
ãŠãŒã¶ã®æè²ïŒåœé ãµã€ãã®ã¯ãªãã¯ã»ãžã£ããã³ã°ã®èå¥ïŒ
-
IFrame ã®åé¿
- æ°ãããã©ãŠã¶
X-FRAME-OPTIONSããã - å€ããã©ãŠã¶
ã¢ã³ããã¬ãŒã ããã¬ãŒã ãã¹ãã® JavaScript
ïŒãã¹ãŠã®ãã©ãŠã¶ã§å¹æçã§ãªãïŒ
- æ°ãããã©ãŠã¶
è£è¶³ïŒçŸåšã¯
frame-ancestorsïŒ:X-Frame-Optionsã¯ä»ã
äºæã®ããã«éãããããæšæºãšããŠã¯
Content-Security-Policy ã®
frame-ancestors 'none'ãåŸç¶ã§ããã
èªå¯ãšã³ããã€ã³ã㯠iframe åã蟌ã¿ãäžåèš±ããªãã®ãååã§ã
ããã¬ãŒã ãã¹ãã® JavaScriptãã¯çŸåšã§ã¯äžèŠ
ïŒãã€ãsandbox屿§ä»ã iframe ã§ã¯ç¡åïŒã
ãªãœãŒã¹æ¯æžã«ãããµãŒãæ©èœã®ããŠã³
DoS ã«ãããcode ããŒã«ãªã©ã®ãªãœãŒã¹ãæ¯æžãããã
- Resource Owner æ¯ã«ä»äžãããã¢ã¯ã»ã¹ããŒã¯ã³ã®æ°ãå¶é
- code ã«ååãªéã®ãšã³ããããŒãå«ããã
ç§»è¡ã¡ã¢ïŒæå³ã®åããªãç®æïŒ: å ããŒãžã®
ãcode ã«äºçްã§ã¯ãªãéã®ãšã³ããããŒãå«ããïŒïŒïŒãã¯ã
RFC 6819 ã® "non-trivial amount of entropy" ã®çŽèš³ãšæãããã
è¶£æšã¯ãæšæž¬ãããªãçšåºŠã«ååãªãšã³ããããŒãæãããããªã®ã§
ãã®æšã«æžãæ¹ããã
ãªãããã®é ã§ã¯code ãä¿åããã¹ããŒãã¬ã¹ã«æ€èšŒãã
ïŒçœ²åä»ã code ã«ããïŒããšããããŒã«æ¯æžã«å¯Ÿãã
ããçŽæ¥çãªåé¿çã«ãªãã
ãªãœãŒã¹æ¯æžã«ãããµãŒãæ©èœã®ããŠã³
çæ code ã䜿çšããŠãredirect_uri ã«ããããããã§æ»æããã
-
stateãã©ã¡ã¿ã䜿çšãè² è·è»œæžãè¡ãã - ç¡å¹ãª code èŠæ±ã®æ°ããããå€ãè¶
ãã
- ã¯ã©ã€ã¢ã³ãããã®æ¥ç¶ãå¶é / çŠæ¢ããã
- ãŠãŒã¶ã»ã¢ã«ãŠã³ãããã®æ¥ç¶ãå¶é / çŠæ¢ããïŒClient åŽã§èªèšŒãå¿ èŠïŒã
-
RFC 6819 - OAuth 2.0 Threat Model and Security Considerations
https://tools.ietf.org/html/rfc6819 -
æ¬ Wiki å
Tags: ITåœéæšæº, èªèšŒåºç€, ã¯ã¬ãŒã ããŒã¹èªèšŒ, OAuth