OAuth 2.0 Implicit Flow で認証の問題点、再び。

Author: Nov Matake
Date:

おひさしぶりです、@novです。

最近は、新しいFacebook iOS SDK使ってるアプリを見つけるとまずToken置換攻撃を試みていますが、結構高い確率でこの攻撃に対して脆弱なアプリがみつかります。困ったものです。。

そんななか、2週間ほど前に、Micosoft Researchの人がIETF OAuth WGのメーリングリストに同じ問題を提起していました。該当Threadでは少し話題が脱線している部分もありますが、もともと最初にこの問題を提起したJohn BradleyがOAuth 2.0 CoreにSecurity Considerationsを追加する流れのようです。

これが現状の改善につながれば良いのですが、そう簡単に行かないかもなとも思います。というのも、この問題、なかなかデベロッパーにとって理解されない傾向があります。

そこで今日は、これまでいくつかのアプリデベロッパーに対して脆弱性報告をしたときの反応をまとめてみたいと思います。

反応1: そもそも置換攻撃に使うためのaccess token奪われてる時点でアウトじゃね?

確かにFacebookのaccess tokenを悪用されると、困ります。勝手にFacebookに変なリンクを投稿されたり、プロフィール情報を抜かれたりすることもあるでしょう。が、そういったFacebookアカウントに対する攻撃と、Facebook以外のサービスでもアカウントが乗っ取られるということは別問題です。

あるFacebook連携を行っているサービスからFacebookのaccess tokenが漏洩した時に、Facebookの自分のタイムラインを荒らされることと、いままで自分がFacebookと連携したさまざまなサービスでアカウントが乗っ取られることは、別でしょう?

反応2: 攻撃用アプリをインストールしなきゃ被害にあわないでしょ?

攻撃用アプリはどうせAppleの審査を通らないから、被害者がそれをインストールする可能性はきわめて低い、という主張をする人もいました。

が、攻撃用アプリは、攻撃者自身がXcode経由で自分のiPhoneにインストールすればいいだけなので、AppStoreに並ぶ必要もないですし、Appleの審査を通る必要もなく、Jailbreakすらいりません。

さらに言うと、攻撃用アプリは、Objective-C初心者の僕が数時間で作れる程度のものです。

反応3: access token受け取った側がそれ検証するのは当然。Facebook側は問題ない。

確かにFacebook側はtokenの発行先検証のためのAPIも用意しているし、Facebook iOS SDKにバグがあるというわけでも無いです。が、FB iOS SDKを使って同じあやまちを犯しているアプリがあまりに多く、僕が調べた5つのiOSアプリ中、4つが同じ過ちを犯していました。この状況では、さすがにFacebook側もドキュメントにこの脆弱性に対する注意および解決策を明記したり、FB iOS SDKのサンプルコードを修正したりする必要があるのではないかと思います。

反応4: OAuth 2.0のImplicit Flowを認証に使うのがまず誤り。OpenID Connect使うべき。

正論ではあると思うのですが、API提供者側がOpenID Connectに対応できていない状況では、API利用者を混乱させるだけなような気もします。現状の仕組みで解決できる方法もあるので、まずはそちらを伝えることが先決ではないでしょうか。

反応5: パスワード忘れちゃったの?ここに登録したメールアドレス入力したら、パスワードリセットできるよ。

この反応にはさすがにびっくりしました。

とまぁ、混乱する理由も理解できるものからまったくとんちんかんなものまで、様々な反応がありましたが、

  • みなさんのアプリは外部APIを使って認証していますか?
  • そのAPIはOAuthベースですか?
  • アプリからaccess tokenを受け取った時、Web API側では毎回token発行先が自分のアプリかどうか確認していますか?

もし上記の質問に答えられない場合、自分のアプリが安全かどうか分からない場合は、お気軽にこのブログのコメント欄に質問していただければと思います。もちろんOAuth.jpのFacebook PageやTwitterアカウントに質問投げかけてくれても構いません。(Twitterの場合は、@oauthjp より @nov に質問してくれた方が気がつきやすいと思います)

ではでは!

Important: OAuth 1.0 Has Been Officially Deprecated as of April 20, 2012. It Will Continue to Work as Per Our Deprecation Policy, but We Encourage You to Migrate to OAuth 2.0 as Soon as Possible.

Author: Nov Matake
Date:
Important: OAuth 1.0 has been officially deprecated as of April 20, 2012. It will continue to work as per our deprecation policy, but we encourage you to migrate to OAuth 2.0 as soon as possible.

OAuth 1.0 for Web Applications – Google Accounts Authentication and Authorization — Google Developers

WebIntent X OpenID Connect (En)

Author: Nov Matake
Date:

When you access to an OpenID Relying Party (RP), you’ll see 5 or more OpenID Provider (OP) logos at its login page. At worst, you can see 10+ OP logos, even though more than half of them are totally unknown for you. It’s called “NASCAR Problem”.

OpenID community had been trying to solve the problem for a long time, but not much progress on it.

Now, it’s the era of HTML5, and browsers-side functionality is improving very much. I found HTML5’s WebIntents [W3C draft spec] as a browser-based “discovery” protocol, which can be a solution for OpenID’s NASCAR problem.

So that I made an OpenID Connect Provider & Relying Party which relying on the discovery part to WebIntents.

You can play my demo following the below steps.

  1. Access to Nov OP which has tag in its HTML tag. Your browser will automatically register this site as a service provider of “OpenID Connect Discovery”.
  2. Access to Nov RP.
  3. Click “Or Try WebIntents?” button, which initiate WebIntents-based OpenID Connect Discovery flow.

Then you’ll see a small popup which let you choose an OP. After you choose Nov OP, you will go back to Nov OP and see an alert popup which shows raw OpenID Connect discovery result. Once RP received the response, it does normal OpenID Connect login flow.

One of my friends, Ryo, made his sample OP “WebIntent-able”, so once you access to Ryo’s OP, you can see 2 OPs at the popup window of intent candidates.


ps.
For some reason, this demo works only on Safari. (probably because of webintents.org’s JS shim issue?)

WebIntent X OpenID Connect

Author: Nov Matake
Date:

WebIntentsを使ってOpenID ConnectのDiscoveryをやってみました。

試すには、以下のステップを踏んでください。

  1. https://connect-op.heroku.com/ にアクセス (ここにintentタグが仕込まれてます)
  2. https://connect-rp.heroku.com/ にアクセス
  3. “Or Try WebIntents?” というボタンをクリック

するとPopupが開いて、Step1で登録されたNov OPが選択肢に現れるので、それを選択するとNov RPに戻ってDiscovery結果がAlertで表示され、その後通常のOpenID Connectのログインフローに進みます。

ps. webintents.orgのJSの問題なのか、なぜかSafariでしか動きません。