

In some of the feedback I have gotten on the openID Connect spec, the statement is made that Connect is too complicated. That OAuth 2.0 is all you need to do authentication. Many point to Identity Pro…
영어를 읽고 싶지 않다는 사람을 위해 간단히 설명하면 ...
OAuth 2.0의 implicit flow를 사용하여 "인증"을 시도하면 매우 큰 구멍이 열립니다.
컷&페이스트택이 가능하기 때문입니다.
OAuth 인증? 는 그림 1과 같은 흐름이 됩니다.
겉으로보기에는 문제가없는 것처럼 보입니다. 그러나 모든 사이트가 "좋은 사이트"라면.
Site_A가 사실 나쁜 사이트라고 가정 해 봅시다. 그러면 Site_A 는 이 사용자가 되어 바뀌는 access_token 을 완전히 입수해 버린 것입니다.
Site_A는 이후이 사용자가 스푸핑하여 모든 "OAuth 인증?"을하는 사이트에 로그인 할 수 있습니다.
비 기술자를위한 OAuth 인증 (?)과 OpenID의 차이 시작 에도 썼습니다만, 목적지가 쓰지 않은 합키 건네 버려, 그것을 가지고 있는 사람은 누구라도 나의 분신이라고 말하고 있는 것이니까 당연하네요.
구체적으로 쓰면,
Site_A는 브라우저(User Agent) UA를 사용하여 Site_B에 가서 로그인하려고 하면 위와 동일한 절차에서 Site_B는 "인증"을 시도합니다. 이것을 Site_B에 전달하지 않고 이전에 얻은 사용자 (= 피해자)의 액세스 토큰 access_token_A를 대신 전달합니다.Site_B가 이 토큰이 사실 Site_A를 위한 것임을 인식할 수 있는 방법은 없습니다. 그러므로, 자신을 위한 것으로 받아 버립니다. 그리고, Site_B는 GraphAPI에 access_token을 던져 피해자의 email이나 user_id를 얻으려고합니다.GraphAPI가이 Site_A에 대한 토큰을 보내는 것이 Site_B라는 것을 인식 할 수있는 방법도 없습니다.따라서 GraphAPI는 Site_A가 요청한 것처럼 피해자의 이메일과 user_id를 다시 보냅니다.결과적으로 Site_B는 공격자를 피해자로 로그인시킵니다 [5].이 흐름이 그림 2입니다.
이는 OAuth의 state 매개 변수를 사용하여 XSRF 대책을 수행하는 것을 방지하지 않습니다. 즉, OAuth 2.0 클라이언트는 해당 클라이언트(사이트)에 로그인한 모든 사용자가 스푸핑하고 다른 OAuth 지원 사이트에 로그인할 수 있습니다.
이것은 OAuth 문제가 아닙니다.
OAuth 는 Authorization Delegation Protocol = 인가를 델리게이션하기 위한 프로토콜이며, 사용자 인증을 위한 프로토콜이 아니기 때문입니다[5].
사실, Facebook도 이것을 알고 있고,signed_request 라는 API를 가지고 있습니다.이것은 대부분 OpenID Connect와 같습니다 [2]. client side flow (페이스 북의 기본값)을 인증 대신 잡아요? ! [7]
Google의 Identity Service 책임자 인 Eric Sachs의 John blog에 게시 된 게시물도이 중요성을 지적합니다.
OpenID Connect가 아닌 단순한 OAuth 을 인증에 사용하고 있는 IdP가 거대한 시큐리티 홀을 낳고 있다고 하는 것에 관한, 존 브래들리 씨에 의한 훌륭한 기사. 는 몇 줄의 코드를 케치했기 때문에 스스로의 보안을 망치고 있다는 것을 깨닫게 하기 위해서.
문제의 원인은 access_token의 audience가 resource endpoint인데, 인증에 사용하는 토큰의 audience는 client이어야 한다는 점에 있습니다. 도 마찬가지입니다.
제대로 치료해 주세요, 여러분.
큰 공수가 아니니까. 몇 줄을 아끼고 유저를 위험에 노출시키는[4][8]은, 꼭 그만두고 싶은 곳입니다.
[1] John Bradley. 미국 정부의 ICAM 속의 사람으로, IMI, OpenID, SAML 의 프로파일을 쓰고 있다 오픈 ID Foundation 이사.
[2] signed_request는 Facebook 자체 서명 방식을 취하고 있지만 OpenID Connect는 IETF JOSE WG로 표준화 된 JWS를 사용합니다. 사이트와의 호환성을 고려하여 외출하고 있습니다.
[3] 원문: Great post by John Bradley on the huge security hole many IDPs have created by using plain OAuth, instead of OpenIDConnect, for authentication. We need to keep hammering away on this point both so IDPs realize the security problems they are creating for their partners, and to get RPs to realize how easily they can compromise their own security just because of the lack of a few additional lines of code. Years ago when Google first launched its proprietary equivalent of OAuth, called AuthSub, we had a big section at the bottom warning people not to use it for authentication for exactly this reason. (source : https://plus.google.com/u/0/102425765611793764729/posts/UKcZQzuvosQ )
[4] 탈취되었다고 해도 아무 일도 일어나지 않는다면 좋지만, 유저의 개인정보를 모으거나 하면, 당연히 개인정보 유출 사건이 되는군요.
[5] 굵은 부분, 2/3 추가.
[6] (2/3 추기) 공격자인 Site_A가 자신의 access_token을 다른 사람에게 건네주는 것은, Site_A가 스스로 액세스한 결과를 건네주는 것과 얻을 수 있는 결과는 같습니다. Site_B가 사용하는 것은 별도로 위험이 증가하지 않습니다.
[7] (2/17 추기) 자전으로 코드를 쓰는 것이 아니라, Facebook 의 Javascript SDK 를 사용하는 경우, signed_request 를 사용하도록(듯이) 되어 있다. 을 사용해, 자전으로 코드를 쓰지 않는다고 하면, FB에 관해서는 피해는 그다지 아니다라고 하게 된다.
[8] (2/17 덧붙여) 원래, Javascript 등 클라이언트 디바이스상의 것에 건네주었다 access_token 을 서버 측에 건네줄 수는 없다. (https://developers.facebook.com/docs/authentication/) 등에서는, 서버에 보내도록(듯이) 그림이 쓰여 있다.


그림 1은 implicit flow의 통상의 flow인 것 같습니다만, implicit flow에서는 browser에 oauth client가 존재하는 것 같은 경우이므로, 만약 site-A가 서버 측을 나타내는 경우, site-A에 access_token를 건네주는 그림은 조금 code flow와 혼란해 버릴지도 모릅니다. app'의 쓰는 방법도 약간 알기 어려운 생각이 듭니다.물론 client(site-A의 스크립트)가 서버 측에 access_token을 두어 버리는 것은 막을 수 없습니다만.
그림 2에 의하면 토큰 치환 공격은 UA측에서 하고 있는 것 같습니다만, Site-A의 악의 있는 스크립트는 Site-B에의 HTTP redirect response를 포착 가능한 것입니까?브라우저의 시큐리티가 없는 것이 전제일까요?
흥미있는 주제이므로 질문하셨습니다.
Site라고 걸리면 혼란스러울지도 모르겠네요. 그림 1에서는, UA를 공격자가 가지고 있는 Jailbreak제의 iPhone, Site-B가 Zy○ga의 신작 iPhone 게임이라고 생각하면, 생각하기 쉬울지도 모릅니다.여기에서는 Site-A의 스크립트는 특별히 필요 없습니다.
감사합니다. implicit에서 지불한 access token이 예를 들어 지불처의 로그인 세션 정보(cookie라든지)와 연결되어 AuthZ/Rsc 서버가 그것을 바탕으로 체크할 수 있으면 아직 막을 것입니다만, 그렇게 잘 되지는 않겠지요.
지적대로, OP측에서는 액세스 토큰과 RP 식별자등을 묶어 관리하고 있다고 생각하고, 세션 정보등을 지정해 돌려주는 state 파라미터도 묶어, 확인할 수 있도록 하면 검증은 가능하네요. 그러나 액세스 토큰은 리소스 액세스를위한 것이며 현재의 OAuth 2.0 액세스 토큰 사양에서는 그렇지 않습니다. OpenID Connect에서 제안한 ID Token은 액세스 토큰과 별도로 인증 이벤트 정보를 얻기 위한 토큰으로 정의되며 OAuth 2.0 사양에 영향을 주지 않도록 고려합니다. 또, state 파라미터와 같은 의미의 nonce 파라미터를 포함하는 것으로 리플레이 어택도 막는다고 하는 사양이 되고 있습니다.
Site보다 RP라고 쓰는 것이 좋았습니다.
시퀀스도, 쓰면서, 나중에 고치려고 생각해 그대로….
공부가 되었습니다만. Oauth를 인증에 사용하고 있는 사이트는 그렇게 많이 있는 것일까요?
자신이 제대로 문제를 이해할 수 있을까 조금 불안하기 때문에, Oauth를 인증에 사용하고 있는 사이트를 예로서 가르쳐 주시면 도움이 됩니다.
산처럼 있어요.Facebook 로 로그인이라고 하고 있는 곳은, OAuth 로의 로그인입니다. 예를 들어, 이 코멘트 시스템의 disqus 도 그렇군요. SAML등도 이 동료군요.보통의 사이트는, 대부분의 경우, 인증을 확실히 할 수 없다(설마, 유저명 패스워드만으로 할까라고 생각하지 않지요?Google나 Facebook등은, 패스워드 인증으로 보이고, 실은 뒤에서는 바리바리에 리스크 베이스 인증을 달리게 하고 있기 때문입니다.)
반대로 듣겠습니다만, 제3자에게 맡기는 것의 무엇이 불안한 것일까요?
마침내 OAuth 2.0의 Security Consideration에 설명되었습니다.
소박한 질문입니다. "scope = signed_request"는 문서화되지 않은 것 같습니다.
https://developers.facebook.com/docs/authentication/permissions/
> A signed_request parameter is used by Facebook to pass data to an application
라고 하는 기술이라고 하면(자), 이 문맥으로 어떤 의미를 가지는지 몰랐습니다.
https://developers.facebook.com/docs/authentication/signed_request/
또, 「client-side flow를 인증에 사용하지 말아라」라고 하는 기사의 취지에 준해, 하나 질문하겠습니다.
Facebook iOS SDK의 SSO(Single Sign-On) 기능은, 네이티브 Facebook 앱과의 앱간 통신에 의해(어플리로 로그인 끝나면 버튼 일발로 인가가 완료한다) 부드러운 인가를 실시하는 매우 편리한 기능이군요.잘 인증에 사용되고 있습니다.
https://developers.facebook.com/docs/mobile/ios/build/#implementsso
그러나 이 SSO 기능은 client-side flow 밖에 구현하고 있는 것 같습니다.
벌써 문제로 하고 있는 사람들이 있었군요. 빨리 해결되면 기쁩니다.
→OAuth 2.0 Implicit Flow에서 인증 문제, 다시. http://oauth.jp/oauth-20-implicit-flow-78852
네. 1월 하순부터 Facebook을 포함한 각처에 연락하고 있습니다.
그러나 제반 사정으로 좀처럼 낫지 않습니다.
죄송합니다.