SECCON 2016 × CEDEC CHALLENGE
ゲームクラッキング&チートチャレンジ

SECCON 2016 × CEDEC CHALLENGE 2016827 23:05

 約1か月前になりますが、8月26日にゲーム開発者向けのカンファレンス「CEDEC 2016」にて「SECCON 2016 x CEDEC CHALLENGE ゲームクラッキング&チートチャレンジ」というセッションを行いました。
 そのセッションで題材として使用したサンプルゲーム「SUNIDRA2」のソースコード一式をgithubに公開しました。もうひとつの「Survival Shooter」についてはUnityのtutorialプログラムなので、Asset Storeからダウンロードしてください。また、競技時に使用した問題ファイルも一式公開しています。

SUNIDRA2ソースコード
https://github.com/kenjiaiko/SUNIDRA2
Survival Shooter公式ページ
https://unity3d.com/jp/learn/tutorials/projects/survival-shooter-tutorial
問題ファイル一式
http://1drv.ms/u/s!AtaQw-wbmFVpey-cWSc8e4RQJlQ

 SUNIDRA2はゲームサーバを動作させているので、githubにあるソースコードをビルドすれば競技時と同様の環境でプレイできます。また問題ファイルに入れていたのはapk(Android向け)のみでしたが、ipa(iOS向け)も新しくビルド、作成しました。もし興味があればipaファイルも解析してみてください。



 SECCON 2016 x CEDEC CHALLENGEは、近年のスマートフォン向けゲームに対するセキュリティ、特にチート、改造対策について扱うセッションです。ただ、普通のセッションとは少し異なり、運営側が用意したスマートフォンゲームを実際に解析し、どのようなチート行為が可能なのかを調査してもらい、その結果をプレゼーンテーション資料にまとめた方が発表者となるため、発表内容はより具体的な手法を扱うことになります。
 攻撃者の視点に立って調査を行った人が発表者として攻撃手法を話すという、かなりリアリティを追求したセッションとなっています。

開催概要
http://2016.seccon.jp/news/#19

SECCON 2016 x CEDEC CHALLENGE ゲームクラッキング&チートチャレンジ
http://cedec.cesa.or.jp/2016/session/ENG/6536.html


SECCON 2016 × CEDEC CHALLENGEの模様
今年は昨年と比較し会場が広くなりすべての方が聴講できた。

 今年は実際に業務でゲームのセキュリティ診断を行っているDeNAの杉山俊春氏もお招きし、優勝者とともにゲームセキュリティについて発表していただきました。杉山氏は主にCocos2d-x製のゲームに対するチート手法やセキュリティについてDemoも含めて話し、優勝者は今回題材となったUnity製のゲーム「SUNIDRA2」と「Survival Shooter」について分析した結果を解説されました。

DeNAの杉山俊春氏

優勝者のtotem氏

お二人の発表内容はとても興味深いものでしたが、このブログではそこには触れず、そもそもどういった題材(ゲーム)だったのかについて解説したいと思います。ソースコードを眺めながら読んでもらえればと思います。
 まずは調査対象となった二つのゲームSUNIDRA2とSurvival Shooterについてですが、どちらもUnityで作られており、SUNIDRA2はIL2CPPを、Survival ShooterはそのままILでビルドしています。SUNIDRA2はゲームサーバを持つ、いかにもスマートフォンゲームといったようなスタンダードなものに(できるだけ)しており、対してSurvival Shooterはネットワーク通信はなくUnityのtutorialをベースに作成したシンプルなゲームとなっています。
 あらかじめ想定していた攻撃手法は大きく以下の5つです。
 
 ・単純なメモリ探索における値の改ざん
 ・端末に保存されたファイルの改ざん
 ・ゲーム内時間の加速/減速
 ・ネットワーク通信のキャプチャ/改変
 ・IL/ARMの解析/改造

 スマートフォンゲームに限らず、一般的なゲームにおいて行う調査と基本的には同じです。Androidではroot化していれば/proc以下からメモリ探索できるため、Survival Shooterの方にSCOREやHPといった値を探して改変できるように実装していました。GameHacker、GameGuardianといったいわゆるチートツールを使うと手軽にメモリの探索/改ざんができます。
 SUNIDRA2の方では少々対策を行っていて、ゲーム内で使う一部の値は文字列として保存しておき、アクセスのタイミングでdecodeする実装にし、メモリ探索では容易に見つけられないようにしています。ファイルの改ざんについては、UnityのPlayerPrefsを使うとxmlファイルとして特に暗号化もされずlocalに保存されるため、それを使って脆弱性を実装しました。
 メモリ探索とファイル改ざん、そしてゲーム内時間の加速/減速はツールを使うだけで行えるため、特に技術的な内容にはなりませんが、小手調べの意味も含め、どちらのゲームにも実装しています。
 ネットワーク通信についてはHTTPSで行っていますが、SSL Pinningをしていないため、MITMにより通信をキャプチャ、改変できます。SSL Pinningを行っていない理由は、経験的に実装されているゲームが世の中に少ない(気がする)というだけであり、本来なら実装した方がよいと思います(以下のsiteはとても参考になります)。

[Unity/C#]WWW/HttpWebRequestにおける中間者攻撃の危険性を考慮した通信プログラムまとめ
http://qiita.com/harmegiddo/items/b72ca4f430292251c8a6

 SUNIDRA2はゲーム内で別途独自で暗号化しているため、MITMだけでは通信内容を解読できません。ただし、リピートアタックや任意のPacketのブロックなどはできるため、それによって攻撃(ゲーム内ステータスの改ざん)ができる設計になっていました。
 通信内容を完全に解読したり、ゲーム内の処理を変更(改造)するためには、Survival Shooterは暗号化されたILを復号する必要があり、SUNIDRA2はIL2CPPにより出力されたARMアセンブラを読む必要があります。現在のスマートフォンゲームのほとんどはJavaやObjective-Cで1から作られることはなく、多くはゲームエンジンが利用されます。特にUnity、Cocos2d-x製が多く、これらで作られたゲームを解析するためにはIL、アセンブラ(ARM)の知識が必要になります。よって、最終的にはIL/アセンブラを読み、DLL/soファイルを改ざんして、改造バージョンのapkを作ることができたら、それが一応のゴールになるかな、というのが個人的な感想です。優勝者はSurvival Shooterをメモリダンプし、DLLを抽出、改造し、自作の偽DLLをロードさせることでSurvival Shooterの処理を書き換えていました。実際に行った作業を事細かに解説しており、とても興味深い内容でした。
 想定していた攻撃手法は以上です。私自身、優勝者や杉山氏の発表を見て勉強になった部分があり、思った以上にいろんなやり方があるなぁと感じました。
 もともとPCゲーム、コンシューマゲームに関わらず、ゲームに対するセキュリティ(違法コピーやチート行為)は古くから問題視されている分野です。対象がAndroid/iOSといったプラットフォームに変わっただけで、その行為そのものは昔からありました。しかし、それに対してゲーム開発者とセキュリティ技術者が議論、情報共有する機会というのはさほど多くなかったように思います。SECCONでは、そのような情報共有の場、他業種との交流をもっと広めようという目的で、去年からSECCON x CEDEC CHALLENGEを開催しています。
 どの競技イベントも同じですが、問題を作る人がいなければ続けられないため、来年も開催できるかどうかは分かりません。ただ、このような他業界のエンジニアの方々に喜んでもらえる取り組みというのは、できるだけ継続していけたらと考えています。
 もしこのような取り組みに興味がある、あるいは問題作成に協力していただけるといた方がいましたら、気軽にSECCON事務局(info2016@seccon.jp)宛にメールをいただければと思います。

SECCON実行委員 愛甲 健二(LINE 株式会社)