OAuth 과정에서 발생할 수 있는 재미있는 인증토큰 탈취 취약점(Chained Bugs to Leak Oauth Token) Review

오늘 OAuth 관련 버그바운티 재미있는건을 봐서 포스팅으로 풀어봅니다. 간단히 요약하면 우버와 페북 OAuth 과정 중 문제가 있어서 사용자 인증정보를 공격자에게 탈취할 수 있는 부분이였고 리포팅한 @ngalog 는 $7,500나 받았다고 하죠.

알고보니 우버팀도 이 취약점을 재미있게 보아서 아주 awesome하다고 극찬이였습니다. 그럼 살펴보죠!

Chain Attack! Awesome! / https://i.giphy.com/130lrV79Va3q5W.gif

Published part of the report

https://hackerone.com/reports/202781 에 등록된 이 버그는 아래 플로우로 동작한다고 합니다.

- Prompt OAuth authorization on facebook.com
- Redirect to https://auth.uber.com/login?next_url=https://login.uber.com/logout from Facebook
- Redirect to https://login.uber.com/logout from auth.uber.com
- Redirect to attacker site from Referer header and return the token

직역하면, 페북에서 OAuth Authorization 중 redirect url을 logout의 주소로 바꿔서 공격자의 서버로 인증정보가 전달되게 하는 방식이라고 합니다. 여기서 logout 주소는 접근 시 Referer 헤더의 url로 redirect 해준다고 합니다.

자 여기까지가 공개된 내용입니다.. 정보도 적고 해서 톡으로 이야기하다가 직접 페이지를 찾아보기 시작했습니다.

Guessing the report(뇌 피 셜)

우선 우버 로그인 페이지를 들어가봅시다.

아! 페북 로그인을 지원하는 걸 보니 페이스북 쪽 OAuth 과정에서 발생한 문제인 것 같군요. 로그인하기를 눌러서 트래픽을 쭉 살펴보면 이런 요청이 하나 나옵니다.

https://www.facebook.com/v2.9/dialog/oauth?app_id=277064115737714&channel_url=https%3A%2F%2Fstaticxx.facebook.com%2Fconnect%2Fxd_arbiter.php%3Fversion%3D44%23cb%3Df5be1cf~~~&fallback_redirect_url=https://login.uber.com~~~

우버와 페이스북을 연동한 사용자가 로그인했을 때 oauth 요청으로 인증정보를 받아오는데 이 과정에서 redirect url이 지정됩니다. (redirect url이 지정되는건 당연한거고, Oauth쪽 플로우 한번 쭉 보시면 아하 하실겁니다.)

아무튼 이 redirect url 중 특정 값은 Oauth 성공 시 페북쪽 서버가 우버쪽 서버로 인증정보를 찔러줄 때 사용하는 주소일텐데요. 보통 Oauth idp 측(현재 기준 페북)에선 개발자센터 등을 통해서 허용된 URL로만 통신할 수 있게 지정해서 사용합니다.

우버의 경우 https://auth.uber.com/login?* 까지가 지정된 URL이라고 합니다. 이러다보니 사용자가 https://auth.uber.com/login?next_url= 을 통해서 redirect url을 넘겨주는 경우 인증정보가 다른 우버 서버로 넘어가게 되는데 공격자는 여기서 한번 더 머리를 쓴 것 같습니다.

아까 위에서 이야기드렸듯이 https://login.uber.com/logout 주소는 Referer 헤더를 참조해서 Redirect 하다보니 공격자 서버상에서 로그아웃 페이지가 호출되면 공격자 사이트로 Redirect 되게 됩니다. 물론 이 구조도 보편적으로 많이 쓰이는 구조다보니, 이거 자체만으로 문제라고 하기엔 어렵습니다. 아무튼 Oauth 요청은 서버 to 서버로 요청이 발생하는데 결국 공격자 사이트에서 페북 Oauth 주소를 호출했을 때 Oauth 처리 후 redirect url은 logout 페이지를 바라보게 되고, Referer를 참조해서 공격자 사이트로 인증정보를 전송하게 되는 것 같습니다.

그래서 아마 우버에서 이야기한 @ngalog was able to provide us with an awesome single-URL PoC which would: 부분은 공격자 서버에서 로그아웃 페이지를 바라본 페북 Oauth url을 호출하는 코드이지 않을까 싶네요.

(제 생각에는 이런 PoC이지 않을까 싶습니다)

<a href="https://www.facebook.com/v2.9/dialog/oauth/?~~blahblah~~&redirect_url=https://https://auth.uber.com/login?next_url=https://login.uber.com/logout">PoC</a>

아마 맞겠죠?

Conclusion

솔직히 보고 이런 생각을 하다니 신기헀습니다. 이게 분명 많이 나타나는 공격 형태는 아니다 보니 업무적으로나 버그바운티로나 쓸모가 있어 보입니다. Oauth 연동되는 서비스가 있다면 꼭 테스트 해봐야겠네요.