スマホネイティブゲームのチート対策

はじめに

オンラインゲームの開発では、常にチート対策を考えなければならない。
特にスマホネイティブゲームの場合、クライアント解析、通信改竄、サーバ脆弱性への攻撃と、ブラウザゲームと比べてもアタックポイントの範囲が広く、常にチート、及びセキュリティリスクの可能性を意識してシステム設計、実装を行う必要がある。

ただ、現在はチートツールも広く出回っており、手法が多様化している。そのため、チート手法とその対策はイタチごっこの様相を呈しており、ここに必要以上の労力をつぎ込んでも、それに見合うリターンを得るのは難しいだろう。
そこで、チートを100%防ぐことは不可能であるという認識を持ち、あくまでもその認識を前提とした上で、何を守るべきなのか、どう対策するのかを考えるべきである。

守るべきもの

チートを100%防げないとはいえ、必ず守らなければいけないポイントがある。これを最重要ポイントとして位置づけ、ここには十分なリソースを投入すべきである。

個人情報漏洩

個人情報というと個人を特定できるような情報を指すが、それ以外にもユーザーのゲームデータ流出などは、著しく信頼を損なうため防がなければならない。特にAndroidにおいては、アプリ情報を他アプリから読み出されるようなリスクもあるため、注意が必要である。

ゲーム内順位への影響

個人的なパラメータ改竄やリリース前コンテンツの使用など、チートがユーザー個々の範囲に収まるものであれば、大きな影響は出ない。それに比べ、ランキングポイントの改竄や順位改竄といった、ゲームバランスの崩壊につながるチートは、ソーシャル要素が大きな役割を占めるスマホネイティブゲームでは致命的であり、ゲームそのものクローズにつながる危険もある。

売り上げへの影響

特にF2Pゲームは、アプリ内課金によって成り立っているため、当然課金システムのクラックや、課金販売しているゲーム内通貨の不正入手といったチートは防がなければならない。

チート対策の方針

カジュアルクラックを防ぐ

一口にチートといっても様々な種類や技術レベルがある。リバースエンジニアリングするような専門的技術を用いたチートは稀であり、ほとんどはネットで配布されているツールを使った、特に専門知識を必要としないチート、いわゆるカジュアルクラックである。
有名なゲームになると、そのゲーム専用に作られたツールも存在するが、一般的には PME (Process Memory Edit) などが出回っている。
これらのツールを使ったチートは対策も難しくなく、これによりほとんどのチートは防ぐことができるため、まず対策すべきものである。

チートされない設計を行う

冒頭で挙げたように、チートされるポイントは大きく分けて、以下の3つが考えられる。

  • クライアント解析
  • 通信改竄
  • サーバ脆弱性への攻撃

この内、サーバ脆弱性への攻撃については、破られた時のリスクが大きいものの、従来のオンラインゲームでの知見が活かせること、及びクライアントに比べリモート環境で実行難度が高いことから、比較的守りやすいと言える。

逆にクライアントはユーザーの手元で自由に手を加えられることから、メモリ解析、ロジック解析、リソース解析、プロセスアタッチと攻撃手法も多く、非常に守りづらい。

つまり、ゲームシステムの根幹に関わる重要なロジックをクライアント側に持たせることは非常に大きなリスクであり、やってはいけない。もちろん、全てのゲームロジックをサーバ側に持っていくことは、サーバリソース的な問題も発生することから現実的ではないが、必ず守らなければいけないポイントに関するロジックについては、必ずサーバ側で処理しなければならない。ガチャの判定をクライアントで行うなどもってのほかだ。

チートを検知する仕組みを導入する

前述の通り、チートを100%防ぐことはまずできない。その代わり、チートされた時にそれを検知する仕組みをサーバ側に導入することが重要になる。

具体的には以下の2点が重要である。

  • 異常なパラメータが送られてきた時にそれを検知すること (チートの検知)
  • パラメータ遷移についてのログを保存すること (チート手法の解析及びエビデンスの取得)

ログの保存については、サーバリソースの問題から全てのログの保存は難しいかもしれないが、重点的に守るべきポイントについては必ず取ることが重要である。

チートされない実装を行う

チートされない実装としては、最低限以下のような対策が必要である。

クライアント
  • Jailbreak / root 端末検知
  • メモリスクランブル
  • リソースデータ (主にマスタデータなど) の暗号化
  • リソースデータや設定の適切なパーミッション設定
  • 端末内データベースや設定ファイルへの重要データの平文保存回避
  • ソースコードへの重要データの保存回避
  • 不要なシンボル情報の削除、及び難読化
通信
  • 通信内容の暗号化、及びハッシュ付加 (SSLだけでは不十分)
  • 不要なメッセージ情報の削除 (エラーメッセージなど)
サーバ