mixiアプリ » 技術仕様(RESTful API方式) » PC » Adobe Flashを用いたアプリにおける第三者への成り済まし
Adobe Flashを用いたアプリにおける第三者への成り済まし
2009.12.04 発行
PC向けmixiアプリについて、特にAdobe Flashを使ったmixiアプリにおけるユーザの成りすましといった問題が報告されています。ここでは、そういった脆弱性を作りこまないために注意すべき点をご紹介いたします。
概要
Adobe Flashを用いるOpenSocialアプリが適切な方法でユーザー認証を実施していない場合、悪意の第三者が任意のユーザーに成り済まして不正に情報サービスを利用できてしまう。
Adobe Flashのswfファイルの読み込みや実行はWebブラウザ上で行われるため、HTMLに記述されたURLやパラメータを悪意の第三者が改竄することで、任意のユーザーに成り済まして不正に情報サービスを利用できてしまう。そのためユーザー固有の情報を取り扱うOpenSocialアプリでは、swf ファイルの読み込みや外部APIへのアクセス時に適切な方法でユーザー認証を実施する必用がある。
対象
この問題はAdobe Flashを使用してユーザー固有の情報を取り扱うPC版のOpenSocialアプリが、適切な方法でユーザ認証を実施せずに次のような処理を行う場合に対象になる。
- ユーザー固有のswfファイルをロードして情報サービスを提供する場合
- ユーザー固有のswfファイルを動的に生成して情報サービスを提供する場合
- ActionScriptを用い外部APIを操作して、ユーザー固有の情報を作成・更新・参照・削除する場合
OpenSocialコンテナから取得したユーザ識別子を、保護または適切な処理・手続きを施さずにユーザー認証の手段に使用している場合にこの問題が発生する。
上記に限らず、ユーザー認証に用いる情報が不適切、または適切に保護・検証されていない場合にも同様の問題が発生する。また、Adobe Flashに限らずJava Applet、Microsoft Silverlight、JSONP、IFRAMEその他を用いて外部と連携して動作するOpenSocialアプリは問題の対象となる。
影響
悪意の第三者により、次に上げるような不正な情報サービスの利用が行われる可能性がある。
- 任意のユーザーまたは不特定多数の個人情報・プライバシーを不正に参照される。
- 任意のユーザーに成り済まして、利用権限を持たないまま不正に情報サービスを利用される。
- 任意のユーザーに成り済まして、情報の作成・更新・参照・削除といった操作を不正に行われる。
対策
ActionScriptを用いて外部APIと通信する場合には、信頼できる方法で取得したアクセス識別子(以下トークン)を使用してユーザの認証と識別を行う。動的にswfファイルを生成する場合にも、信頼できる方法で取得したトークンを使用してユーザの認証と識別を行う。
通常の実装ではOpenSocialコンテナの署名付きリクエストを用いてトークンを取得し、swfファイルを読み込むHTMLタグのパラメータにトークンを埋め込みActionScriptへ引き渡す。ActionScriptから外部APIにアクセスする際には受け取ったトークンを用いてユーザーの認証・識別を行う。またユーザー毎に動的にswfファイルを生成する場合には同様の方法でトークンを取得してswfファイルのURLに付与することでユーザーの認証・識別を行う。
推奨される認証プロセス、およびトークンの実装については付録を参照のこと。
参考
- “署名付きリクエスト”, http://developer.mixi.co.jp/appli/spec/pc/require_servers#toc-2
- “署名付きリクエストの検証”, http://developer.mixi.co.jp/appli/spec/pc/require_servers#toc-4
- RFC 2104, “HMAC: Keyed-Hashing for Message Authentication”, http://www.ietf.org/rfc/rfc2104.txt
付録
推奨される認証プロセス
swfファイルを読み込む前にユーザーを認証・識別するための「トークン」を取得し、swfファイルを読み込むHTMLタグのパラメータまたは URLに埋め込む。トークンの要求に際してはコンテナが提供する署名付きリクエストを用い、外部APIは署名を検証した上でトークンを発行する。
- (JavaScript) コンテナが提供する署名付きリクエスト(gadget.io.makeRequest)を用いて外部APIにトークンを要求する。
- (外部API) 署名付きリクエストを検証し、opensocial_viewer_idでユーザーを識別する。
- (外部API) ユーザーを認証・識別するためのトークンを発行する。
- (JavaScript) トークンを埋め込んだobjectタグを生成して、swfファイルをWebブラウザに読み込ませる。
以降のswfファイルの取得や、外部APIの操作は取得したトークンを用いてユーザの認証・識別を行う。
推奨されるトークンの実装
トークンの実装においては次の用件を満たす必用がある。
- ユーザーごとに固有の値である
- ユーザーおよび第三者が類推できない値である
- 任意または特定のタイミングで無効化できる
- 詐称・改竄を検知できる
これらを実現するために次のいずれかの実装を推奨する。
- ユーザー識別子と有効期限に、メッセージ認証コードを付与した値をトークンに用いる。メッセージ認証コード、および有効期限を検証することでユーザーの認証と識別を行う。
- ランダムに生成した値をトークンに用いる。発行したトークンはユーザーと関連づけて保存・照会することで、ユーザーの認証と識別を行う。保存したトークンは一定の時間が経過した際に破棄することで無効化する。
メッセージ認証コードを付与した値をトークンに用いる場合は、安全なメッセージ認証コードアルゴリズムを用いる。具体的にはHMAC-SHA256 などのアルゴリズムが推奨されるが、アルゴリズムの選定はアプリケーションの用件に応じて開発者に任せられる。ただし、MD5やSHA-1などのダイジェスト関数を生で使用する方法は許容されない。ランダムな数値をトークンに用いる場合は、トークンが衝突しないよう留意する。
いずれの手段でも、トークンの生成(・保存)と検証は外部API側で実施される。また、総当たり攻撃などを想定した十分な空間の乱数、十分な強度を持った秘密鍵を用いて適切に運用すること。