netpoyo広報ブログ

ネット文化を探求する同人サークルnetpoyoの広報ブログです。

ソーシャルゲームの危険性 ~某プラットフォームの脆弱性に見る構造的問題~

まずはこちらのURLをよーく見てほしいです。

 

 

ソーシャルゲームのURL↓

http://sp.pf.example.com/12008305/?guid=ON&url=http%3A%2F%2F125.6.169.35%2Fxxxxxxxxxx%2Ftutorial%3Fa%3D287979669%26rnd%3D93975868

これはスマートフォン向けの某有名ソーシャルゲームサイトでゲームをプレイしている時のURLです。sp.pf.example.comソーシャルゲームサイト(プラットフォーム)を表し、それ以下はプラットフォームに渡すパラメータになります。

プロの方ならこのURLを見て脆弱性に気づいたがあるのではないかと思ったのではないかと思います——え? よく分からない? うーむ。確かに、この記事を読まれる方には非エンジニアの方も多いかもしれません。この記事は、筆者が偶然出会った脆弱性(すでに修正済み)について扱い、その危険性について解説するものです。その解説を通じて、どうしてこのような脆弱性が登場するようになったのか、その背景をなるべく誰にでもわかるように語っていきたいと思います。

【追記2012/4/18:このURL自体が脆弱性を示すように読めたため、訂正いたしました】

 

【著者:wilfrem】

■ このURLの問題点とは?

それでは、上のURLの問題点を、非エンジニアの人にも分かるように、解説を交えながら説明していきましょう。

注目するところは1点だけ。url=http%3A%2F%2F125.6.169.35%2F(以下略) というところです。ここにurlとかhttpとかいう文字が見えますね。そして、後ろの125.6.169.35はIPアドレスのようです。もっと言うと、%3Aは「:」, %2Fは「/」。つまり、これを元に戻すとurl=http://125.6.169.35/となり、urlの中にまたurlが入っている入れ子構造になっています。

では、どうしてurlの中にurlが入っているのでしょうか? それは、こちらの図を見ると分かります。

某サイトのシステム構成図(推測)

この図はurl、動作及び他の公開記事を元に推測したシステム構成図です。

問題のサイトでは、ユーザーがソーシャルゲームをプレイすると以下の流れでゲーム画面が作成されていると考えられます。

  1. ユーザーがプラットフォームにアクセスすると、まずはプロキシと呼ばれるサーバに接続します。
  2. プロキシはURLを元にサードパーティ(ゲーム提供者)のサーバにアクセスします
  3. アクセスを元にサードパーティがゲーム画面を作成し、プロキシに返します
  4. プロキシはプラットフォーム共通のメニューとゲーム画面を合成します
  5. プロキシはユーザーに完成したゲーム画面を提供します。
  6. サードパーティはプラットフォームAPIを通じて課金情報、決済等を行います。

つまり、先ほどのhttp://125.6.169.35/は、ゲームを提供している開発会社さんが管理するサーバで、プラットフォーム(sp.pf.example.com)がurlを見てそのサーバにアクセスしていると考えられます。それでは、このhttp://125.6.169.35/を、例えばhttp://netpoyo.jp/とかに変えたらどうなるでしょうか?

筆者が確認したところ、「netpoyo.jp」があたかもプラットフォームの1ゲームのように扱われ、そのままユーザーの画面に表示されてしまっていました(現在は修正されています)。

 

■ なぜ危険なのか?

今までの説明で、読者はこう思うかも知れません。「で、何が問題なの」、あるいは「ただ、他サイトのゲームが遊べるだけじゃん」と思われるかもしれません。たしかに、他のゲームで遊べるだけならば、ちょっとした2chのスレのネタにしか過ぎないでしょう。

しかし、「好きなサイトを1ゲームとして扱える」というバグは以下のように悪用される危険性がありました。

  1. 攻撃者は既存のゲームにそっくりな偽のゲームを用意します。
  2. 攻撃者はユーザーに対してトラップURLを踏ませます。短縮URL等を使うと効果が高いでしょう
  3. トラップURLはプラットフォームのプロキシにアクセスします。
  4. プロキシはトラップURLを元に攻撃サーバにアクセスします。
  5. 攻撃サーバは1で用意した偽のゲームを提供します
  6. プロキシはプラットフォーム共通のメニュー等と偽のゲームを合成し、ユーザーに送信します
  7. 偽ゲームはユーザーを騙してクレカ情報、パスワードなどを入力を要求します(フィッシング)
  8. 騙されたユーザーは大事な情報を入力してしまいます(半分は本物ですから、なかなか見抜けないでしょう)

筆者はこれは十分危険だったと考えています。実際、フィッシング時にtwitterのOAuth認証も要求すれば効果的にtwitterで拡散する偽ゲームが作れたと考えられます。本物のゲームをコピーして偽ゲームを作れば、偽ゲームとは誰も気付けないでしょう。

さて、上記攻撃手順は筆者が実際に確認した、実行可能な危険性です。ここからは、確認した事実を元に推測した危険性についてお話しします。

実は、検証時に偽ゲームに注入したJavascriptが動作するとの情報を他の発見者から入手しています。この種の脆弱性は、注入したJavascriptが動作してしまった場合、一般的にアカウント乗っ取りが可能なセッション情報を盗み出せることが多いです。ただし、筆者はセッション・ハイジャックは「法的にマズイ可能性アリ」「上記攻撃成立で十分危険である」と判断して検証していません。なので実際に盗み出せたかどうかは分かりませんが、盗み出せた可能性は高かったのではないかと考えています。もし、そうならばアカウント乗っ取りのゲームを操作される危険性が十分にあったと推測されます。

(筆者注: 専門家に確認したところ、Cookieからセッションキーを抜き出す事自体は問題なかったそうです。詳しくは情報と法の専門家にお問い合わせください)

(追記2012/04/18: セッションが2つあり、抜き出せるセッション情報はあくまでもゲームに使うものであり、プラットフォームのアカウント乗っ取りはできないとの指摘をTwitterで受けました。それを受けて、上記パラグラフに打ち消し線を引きました)

また、当然ながらプラットフォームとサードパーティのサーバとは個人情報、課金情報を含む様々な情報をやり取りしているはずです。設計にもよりますが、例えばプロキシからのアクセス情報を鍵として情報をやり取りしていた。とします。この場合、もし仮に攻撃URLを踏んでしまった場合、偽ゲーム提供サーバに鍵が知られてしまい、個人情報、ポイント等の不正使用、ゲームの不正行為などができたのではないかと推測されます。

(追記2012/04/18: 出来たかどうか確実とはいえないので、念のため打ち消し線を引きました)

以上の推測も含め、先ほどの攻撃の図を書き足すと、以下のようになります。

脆弱性を用いた攻撃の図(推測込み)追記2012/04/18: 追記にあわせて、図を差し替えました)

 

まとめると次のようになります。

  • 悪意のある偽ゲームを使った攻撃が可能だった(フィッシング等)
  • セッション情報を盗み出してアカウント乗っ取りゲームが操作される可能性が高かった
  • プラットフォームのAPIを使って各種不正行為が出来たかもしれない。
  • 短縮URLをトラップとして使え、ユーザーがトラップだと気づく可能性は低い。

この問題を解決するためには、以下の方法が考えられます。

  1. サードパーティのURLではなく、例えばアプリ名を用いる方法(例: game=example)。実際にアクセスするURLはプロキシ側で持つ(exampleは127.0.0.1にアクセス等)
  2. プロキシが許可するドメイン・IPをホワイトリスト方式で制限する

どうやら現在は、2の方法で修正されているようです。

 

 

良かった! これで安心してそのサイトで20万課金できますね! と言いたいところですが、実はそういうわけには行きません。あと課金しすぎです。

今までの話は、「サードパーティが提供するゲーム」が「白」であるという前提の話でした。しかし、今まで話した危険性は、そっくりそのまま「審査をかいくぐったサードパーティが提供する悪意のあるゲーム」にも当てはまります。

当然ながら、どこのプラットフォームも審査は行なっているでしょう。でも、審査の厳しいAppleiPhoneでも悪意のあるアプリケーションが程度の差はあれ通ってしまっています。同じ事がこれから他のプラットフォーム、モバゲー、グリーやハンゲーなどに絶対に起こらないといえるでしょうか?

「実績のある大手メーカさんのゲームだから大丈夫だよ~」と思われる方は、開発は必ずしも大手メーカーではないこと、そして悪意のある人間は一人いれば十分であること、零細大手問わず悪意のある人間は少しは存在する可能性があること、もっと言えば、サードパーティに悪意は無くとも別の悪意のある人物に脆弱性を突かれて乗っ取られる可能性をお忘れなく。

さて、以上が筆者に出来る今回の脆弱性の説明です。では、私たちはこういった脆弱性を避けるためにどうすればよいのでしょうか。「アヤシイ短縮URLは避ける」「変なソシャゲは避ける」ように心がければよいのでしょうか? (筆者は引っかかりそうですが)。それを考えるために、そもそもなぜ今までのゲームでは見当たらなかった脆弱性がここにきて出てきたのかを考え、さらにその原因を探っていきたいと思います。

 

■ ゲームと脆弱性

そもそも脆弱性とはどういうものなのでしょうか?——実は脆弱性とは「悪用できるバグ」のことでしかありません。そう。タダのバグの一種でしかないのです。金銭的、社会的影響等を引き起こしてしまう”悪性”のバグが「脆弱性」と言われているだけなのです。

先ほど挙げた脆弱性も、マリオが通常は壁をすり抜けられないのと同様に、本来ならサードパーティ以外のサーバに接続してはいけないのに、うっかりと抜け穴を作ってしまっているバグなのです。当然ながら、既存のゲームにも「脆弱性」は存在しています。例えば最近少し話題になったものとして、同人ゲームの東方緋想天の脆弱性(JVN#50227837)というものがあります。これは他人のPCの東方緋想天を異常終了させることができるという「脆弱性」でした。

しかし、ソーシャルゲームでは、「バグを引き起こした時の影響範囲」が既存のゲームとは大きく変わってしまっています。

例えば、カセットをゲーム機に入れる従来型のゲーム機ゲームでは、酷いバグを起こした所で「ゲームがまともにプレイできない」程度で済みます。でも、最近のゲームは多くの人がネットにつないでやり取りをしています。そして、大抵のソーシャルゲームはゲーム本体を含めて何でもかんでも常時ネットを使用し、更に知り合いとの交流や個人情報や課金・決済情報までもネット上でやり取りしています。そして、悪意のある者がそのバグを利用するのも容易くなっています。つまり、従来型のゲームと比べて危険性が構造上どうしても上昇しているのです。

 

■ 終わりに

繰り返しますが、脆弱性は「悪性のバグ」です。バグを潰すには、パターン化し、開発者が意識を高めて注意することしか基本的にはないのが現状でしょう。もちろん、人間はミスをする動物です。筆者もその例外ではありません。ソフトウェアにバグを入れることは、どうしてもあります。しかし、それでもなお、現状これ以上に効果的な脆弱性の対策はないように思います。そして、悪意のあるゲーム提供に関しては、発見したら正しい手続きで社会的制裁を加えていくしか残念ながら手が無いように思います

……でも、それではこの記事が締まりませんのでw 脆弱性について二つほど対策案を上げたいと思います。

  • 必要ない情報は扱わない・入力しない方が良い。特に課金情報などより危険な情報ならなおさらである。
  • たとえ事故が起きたとしても大丈夫な形になっているか。比較的安全な手段が利用できないかどうか検討してみよう(クレカよりもPayPalWebMoney等など)

危険性はなるべく少なく、なるべくフェイルセーフに設計、行動しましょう。ちなみに、危険なバグは当然ながらパターン化され、対策は取られ、書籍化等もされているので、調べるようにしましょう。

 

■ お断り

  • この記事はすでに修正済みの脆弱性について取り扱っています。なので現在は記事の通りに攻撃をおこなうことはできません
  • 筆者は某プラットフォーム運営会社の人間では無いので、当然ながら内部構造には推測が多分に含まれています。なので、真実と違う点が多く含まれているとおもいます。
  • この脆弱性はIPAには報告しています。なお、筆者はたまたまURLを見た時にきな臭さを感じ、この脆弱性を知りましたが、他に報告されている方がいたため、筆者は報告者ではありません。