『SocialGoat』から考えるオンラインゲームセキュリティ|セキュリティごった煮ブログ

ネットエージェント
セキュリティごった煮ブログ
              

 コース:こってり

『SocialGoat』から考えるオンラインゲームセキュリティ

bubobubo

どーも、bubobuboです。

かい○ゃから何か書けと言われたので、脆弱性診断の一ジャンルとも言える「ゲームセキュリティ診断」をテーマに片手間で作文を行いました。

■脆弱性診断とは?

情報セキュリティ企業が行う業務の一つに「脆弱性診断」があります。規格・仕様を決める段階から診断が始まる場合もありますが、一般的にはリリース直前だったり、既にリリース済みのサービスが対象となります。

診断に先立って、サーバー構成やソースコードといった機密情報の提供を受けられる場合は、大幅に効率がアップするので、そちらを読んで方針を立てます。一方で、様々な理由でソースコードをいただけない状況もあります。その場合、診断の結果「どこそこにこういう脆弱性がありました」とまでは言えますが、ソースがない以上「どこそこの何行目を修正すれば直ります」といった具体的な指摘はできません。

さらに、脆弱性が存在する処理を書いたプログラマーは、必ずしも情報セキュリティの知識を有しているとは限りません。ソースの断片すら見せられないと言われてしまったら、ここから伝言ゲームが始まります。修正依頼を出したが修正が不十分、再度修正したがやはり不十分、といった不毛なやり取りが続くこともあり得ます。IPAが行っている「脆弱性関連情報の届出受付」では、このようなやり取りが常時発生していると聞きますが、これは、ブラックボックステストが持つリスクと言えるでしょう。

脆弱性診断を行うには、当然ながら攻撃対象となるサービスが必要です。さらに、攻撃対象となるサービスの提供側との契約書レベルでの合意も必要です。合意なしに本番環境に向かって診断(という名の攻撃)を行って、偶然にも攻撃がクリティカルに刺さって、サーバー停止! データベース破壊! 営業停止! ともなると、損害賠償と臭い飯のフルコースを頂戴する羽目になります。

手続き的な問題を含めて不幸が起こってはいけないので、業務で脆弱性診断を行う場合は、本番環境と同等のテスト環境を立ててもらって、その環境に向かって攻撃(という名の診断)を行います。テスト環境は重要です。

■個人が脆弱性診断を体験するには

一方で、一個人が実際のサービスさながらの機能と脆弱性を抱えた、限りなくリアルな脆弱性診断を行う機会は限られています。オープンソースで提供されているサービスであれば、自分でサーバーを立てて試してみることができます。自宅に転がっているPCをサーバーにするぶんには全く問題ありません。クラウドサーバを使うのは止めたほうがいいです(ほとんどの場合、規約で禁止されている)。

CTFも悪くはないのですが、難易度を調整するために意図的に穴が開けられていたりするし、何より想定解が存在します。本物のサービスには正解が存在しない場合もありうるので、リアルか? と言われるとsandboxという感が強いです。

近年では、国内でも複数の大手サービスが脆弱性報奨金制度を開始しているので、それで試すのもありでしょう。しかし、だれでも分かるレベルの脆弱性はすでに報告されているはずなので、あなたが訪れたサービスはすでに報奨金稼ぎによって荒らされた...もとい整地された環境であり、初心者が気軽に試せる場所かというと微妙だと思います。

脆弱性を作りこんでしまう原因の学習を目的として、サーバープログラムを開発する際に作りがちなバグ・脆弱性を盛り込んだ、いわゆる「やられサーバー」は複数あります。例えば、様々なバグや脆弱性を集めたeasybuggyや、IPA(情報処理推進機構)が提供するAppGoat、OWASPが提供するOWASP BWAやOWASP Juice Shopなどがあります。これらには頻出するバグや脆弱性が盛り込まれているので、ウェブアプリ制作者には有用でしょう。

メモリリーク、デッドロック、リダイレクトループ、JVMクラッシュ...
バグだらけのWebアプリケーションを使ってバグを理解する - Qiita
http://qiita.com/tamura__246/items/7275c7406706fb0057e8

脆弱性体験学習ツール AppGoat:IPA 独立行政法人 情報処理推進機構
https://www.ipa.go.jp/security/vuln/appgoat/

OWASP Broken Web Applications Project - OWASP
https://www.owasp.org/index.php/OWASP_Broken_Web_Applications_Project

OWASP Juice Shop Project - OWASP
https://www.owasp.org/index.php/OWASP_Juice_Shop_Project

■ソーシャルゲームのセキュリティ以前

ここで、ソーシャルゲーム版の「やられサーバー」はないだろうか? と考えたのですが、そんなものは当然ありません。

しかし、オンラインゲームや、そこから派生したソーシャルゲームも、クライアントサーバーモデルであることに変わりはないので(P2P型もありますが)、脆弱性を生むたくさんの要素があります。XSS、SQLインジェクション、OSコマンドインジェクション、セッションフィクセーションなど、(中にはガラケー用サイトでしか見られないような)10年前に無くなっていると言ってもいいレベルの、初歩的ながら重大なレベルの脆弱性も存在します。

オンラインゲーム固有の問題に「チート(cheat)」があります。

原義に沿うと「ズルをする」という意味ですが、ここでは「ゲームデザインや仕様に反して、ゲームを有利に進める行為」と定義します。

自己満足レベルのチートなら大きな問題になりませんが、他のユーザーを妨害できたり、ゲーム内経済に影響を与えるものが炸裂してしまうと、「正直者が馬鹿を見る」無法地帯となり、それが容認されると一気にクソゲー化して、ユーザーが離脱してしまいます。

なぜチートが起こるのかというと、根本の理由としては、チートにつながるバグ・脆弱性が放置されているからです。しかし、主にサーバーサイドを適切に修正すればほぼ直ります。一方で、分かっているけど直さないという謎の力学で放置されているものもあるし、設計レベルでの欠陥なので分かっているけど直せないというものもあります。

「チートを100%防ぐことは不可能だから、運用で頑張る」というのも方針としては間違ってはいません。ただ、チートの厄介な点の一つに、攻撃のエビデンスがログに残りにくいというものがあります。ログに残らないということは、いざ事件となった際に真犯人が分からないこともあるわけです。偽造されたアイテムをそうとは知らずに受け取ってしまった「善意の第三者」が存在していたら、ログの取得が不適切だと、真犯人と善意の第三者の区別がつかなくなるどころか、冤罪を生む可能性があります。その場合、最終手段としてロールバックが挙がります。

さらに、自分で脆弱性を見つけられる(スクリプトキディではない)本物のチーターは、バレにくいようにやります。バレてしまい対策されると、新しい手口を探さなければならなくなるからです。ネット上では、チート情報の売買が行われているようですが、チートからRMT(ゲーム内資源を現金で取引すること)で一儲けできそうなものなら安易に売り出したりせず、独り占めして細く長く稼いで、出がらしになった所でノウハウを売って最後のマネタイズを行うはずです。そう考えると「パチンコ攻略法」のような情報商材と同レベルだと思います。
オークション検索例
ヤフオクで「すべてのカテゴリ > おもちゃ、ゲーム > ゲーム > テレビゲーム > 携帯型 > その他」でたどって検索ワード「(アカウント 引退 廃課金)」で検索すると、おびただしい数のアカウントの売買が行われています。引退を決意した廃課金者が、金と時間をひたすら溶かして獲得したゲーム内資産をアカウントごと売却しようとしているようです。中にはチートでねつ造したレアアイテムを所持しているアカウントもあるかもしれません。いずれにせよ、このようなアカウントの転売はほとんどのゲームでは規約違反です。誰かが落札して起動した瞬間「アカウント凍結」を喰らうと、落札者にとっては金だけ巻き上げられた格好になりますが、運営には文句は言えません。そうなると出品者と落札者で泥仕合に突入するわけであります。こうしたトラブルを見越してか、エスクローサービスを謳うRMT業者も多数存在する訳ですが、横道にそれるので本エントリでは言及しません。

余談ですが、ヤフオクは早くこうしたアカウント売買を目的とした出品を隔離するために「情報商材」カテゴリを新設して欲しいと思います。「その他」カテゴリに押し込められるマイナーなゲーム機を探すときに、これらが検索妨害になるのです(「-アカウント」で良さそうですが、検索語句がないのでエラーになります)。

話を戻します。
チート行為は、バレにくいラインで突かれるととても厄介ですが、あからさま過ぎるとすぐバレます。例えばチートで「石」を符号なし32ビット値のMAXにあたる4,294,967,295個(約42億個。ゲームによるが会社ごと買える額に換算される)に増やしてガチャを回し放題にしたら、異常な数値なので運営の目に留まるはずです。さらに、理論上の最高得点を大幅に超えるスコアをもってスコアランキングの1位に鎮座したりしたら、他のプレイヤーにも見える数字ですから目玉の数が違います。こんな分かりやすいものはすぐにバレます。バレると思いたい...。逆にこのような異常値が「定期メンテナンス」後も放置され、該当するアカウントも消されないようなゲームであれば、そのゲームの運営は本当に仕事をしていないと考えて良いでしょう。

あるMMORPGでは、装備品がレア尽くめなプレイヤーがいることが話題となり、他のプレイヤーから不審に思われて一斉通報、運営による調査の末に組織的なチートが発覚して逮捕といった事例もありました。サイバー犯罪やチートにおける最大の敵は、つまるところ自己顕示欲であります。

ソーシャルゲームに欠かせない要素にアイテム課金があります。今やほとんどのゲームはApp StoreやGoogle Play経由で提供されていますが、プラットフォームが用意する課金用のAPIを使って、アプリ内課金の処理を実装することになります。

しかし、課金処理を「正しく」実装するのは案外難しい。

課金処理や暗号処理のように、実装にあたり「正確な知識」が必要なトピックスが該当するのですが、ググってもいい加減な情報がずっと多く、ナレッジコミュニティの存在がノイズの度合いをより深めています。しかし、不正確でも情報があるだけまだマシな方です。

これが「家庭用ゲーム機用」の「課金処理の実装」となるともう地獄で、ライセンス契約を結んだ法人にしか開発環境やドキュメントが提供されないもので、機密保持契約も必要です。もちろん、このような開発環境に関する開発のノウハウはググっても出てこない訳です。公式のドキュメントを読めば適切な実装サンプルがあるはずなのですが...(以下略)

■生贄ソーシャルゲーム SocialGoat

本題に戻りましょう。
オンラインゲーム有史からチートが存在していますが、MMORPGの礎となったウルティマオンライン(以下UO、1997年~)から20年が経過しました。これらの歴史を俯瞰すると、プラットフォームの変異はあれど、同じような手法が毎度のように繰り返されています。筆者が知る限り、ゲーム会社の企業内における別チームとの技術交流はあっても、企業間の技術交流は聞いたことがありません。長年続いているタイトルでも、ノウハウが引き継がれることなく開発者が入れ替わるせいか(開発会社、運営会社ごと入れ替わるタイトルも普通に存在します)、過去にあったような脆弱性が再び作りこまれてしまうケースも少なくありません。

ここで、事例として実在するソーシャルゲームを挙げて説明しようとすると、いろいろな意味で問題が発生するので、うまくフィルタリングして「やられサーバー」化させた『生贄ソーシャルゲーム SocialGoat』を自作しました。

SocialGoat 紹介

名前だけはIPAの『AppGoat』のパロディですが、SocialGoatは「オンラインゲームセキュリティ」(実際はソーシャルゲーム寄りですが)に特化させたものです。

オンラインゲームのクライアントは様々な配布形態がありますが、SocialGoatはシンプルなブラウザゲームです(Flash未使用)。診断の際には、HTTPデバッガだけでなくブラウザ標準のF12キーも活躍します。

SocialGoatは、CentOS + Apache + MariaDB + PHP(フレームワーク未使用)というシンプルな構成ですが、これには理由があります。リッチな外見にするのが大変であるというのが第一ではありますが、今日一般的とされるクオリティとボリュームを目指して作りこんでしまうと、スマホアプリ(ipa/apk)の基本構造から、各種フレームワークやゲームエンジンの理解など様々な前提知識が必要になってしまいます(逆に言うと、実務レベルではこれらの知識が必須です)。SocialGoatの狙いは「サーバーサイドの脆弱性を修正できるようになること」なので、クライアントサイドの話は枝葉であると割り切りました。

SocialGoatには、様々なゲームに実在する(という設定の)チート行為を許してしまう脆弱性を、意図的かつ大量に盛り込んでいます。これはゲームの作り方としてはひねくれていますが、(異なる脆弱性を抱えた)ガチャだけで3種類もあります、ってガチャの数だけ充実しているソーシャルゲームは珍しくはないですね...。

SocialGoat ガチャ紹介1 SocialGoat ガチャ紹介2

ガチャに限らず、作者が遭遇したり見聞きした(という設定の)、よくある機能のよくある脆弱性を参考にしています。SocialGoatに搭載されているすべての脆弱性をマスターすると、リリースされたばかりのソーシャルゲームの×割ぐらいは(おそらく)刺さってしまうと思います。

一部の脆弱性については、同僚から「いくらなんでもこんな酷い実装はないだろう」というツッコミを頂戴した訳ですが、実際にあった(という設定の)実装を基にしているので何とも言えない訳です。

「徹夜が続いてぼーっとしてますけどSocialGoatができています。
 これはソーシャルゲームの形をしたものの×割を一瞬のうちに
 チートする技術を勉強できる...恐ろしいウェポンです。
 警視庁の近所で使わないでくださいね。
 さぁ、持ってっていいです。」
(SocialGoatを手に入れた)
「また何かあったらメールします。」

とあるゲームのセリフをもじってみたものの、現時点ではSocialGoatを公開する予定はありません。あと、SocialGoatの開発は片手間に開発したものなので、徹夜はしていません。

■続きはインターンで

近年になって、ようやくソーシャルゲームのセキュリティが話題になることはありますが、実は「クラック対策ツール」の宣伝であったり、いかにしてクライアントプログラムを改造するかといった話に終始しており、サーバーサイドでどう守るかという話題はほとんど見かけません。

情報セキュリティ業界では日本でもようやく「攻撃と防御は表裏一体」というコンセンサスが確立しましたが、オンラインゲーム業界に同じコンセンサスがあるのだろうか...と考えると、UO公開は1997年で、もう20年も戦いが続いているにも関わらず、業界を見回す限りちょっと一人で判断できることではなさそうです。SocialGoatを公開する予定はないとした理由はここにあります。

インターンに参加すると、SocialGoatを遊びながら(ゲーム性はともかく)脆弱性の診断を体験することができます。ゲームと書くと技術的にはニッチな領域に思えますが、ウェブアプリケーションを中心とした様々な技術要素が組み合わさって出来た一つの形態です。

本物のオンラインゲームセキュリティは、ウェブセキュリティのような高レイヤーと、バイナリ解析のような低レイヤーの両方の知識が必要になるので、興味深い分野だと思うのですが如何でしょう。

興味のある方は参加いただけたらと思います。

▽インターンシップの詳細はこちら▽

2019年卒向けインターンシップ

▼SocialGoatを使った脆弱性体験学習に興味がある方は、▼
こちらよりお問い合わせください。