ゲームセキュリティ運営から見たチート対策としてのモニタリングについて

はじめに

こんにちは。LINEのgame securityチームでLINE GAMEのセキュリティ運営を担当している李明宰です。

LINE GAMEが誕生してから6年以上(https://6thanniversary.game.line.me/)経ちますが、今回はその6年間を通して、セキュリティ運営から見たゲームのチート対策とそのモニタリングについて、皆さんにご紹介したいと思います。

チートとは、悪意のあるユーザー(以下、アビューザー)により、ゲームを有利に攻略する目的でアプリが改ざんされる行為全般を指します。

近年、スマートフォン環境向けのゲームアプリが人気を集めており、LINEがリリースしているゲームもほとんどが、iOS/Android向けのゲームアプリであるため、今回のブログでご紹介する話は、スマートフォン向けのゲームアプリの話とご理解いただければ幸いです。

LINEでは、LINE GAMEのユーザーの皆さんが安心できるように、ゲームアプリのリリース後、様々な取り組みを通じて、ゲーム内に存在するアビューザーの分析や対応を行っております。

特にチート対策の考え方として、アプリ側での対策のほか、後ほどご紹介するモニタリングを中心とした対応の観点にも着目してお読みいただければと思います。

LINE GAMEの特徴

まず、ゲームチートについて話す前に、LINE GAMEの特徴の幾つかをご紹介したいと思います。

一つ目は、LINEログインと連動ができることです。LINEログインをすることで、LINEの友だちとランキングを競ったり、ゲームをするためのハートを送ったりしながらゲームを楽しむことが出来ます。またスマートフォンを機種変更する場合は、アカウント引継ぎの役割もあります。

二つ目は、ゲーム内の通貨が2種類あることです。課金して購入する通貨を一次通貨と言い、一次通貨で交換できる通貨を二次通貨と言います。

最近リリースしたLINE シェフであれば、diamondが一次通貨でcoinが二次通貨として考えていただければと思います。
一次通貨と二次通貨は、ゲーム内でガチャを回したり、ゲーム内のアイテムを購入する際に使えます。

三つ目は、ゲーム内の通貨やアイテムをゲーム内で転売できないことです。ユーザー自身のみがゲーム内の通貨やアイテムを使うことができます。

ゲームチートの種類

ゲームのチートは、今に始まったことではなく、昔から現在まで続くPCゲームやコンソールゲームにもよくある問題でした。そして、インターネットやスマートフォンの普及により、オンライン上でもゲームを遊べる時代になった今でもゲームチートは存在します。

運営から見たチートの種類は主に三つ挙げられます。

メモリチート系

メモリ上の値を書き換えるチートです。例えば、ゲーム内の通貨やアイテムの数をメモリ上で検索して、改ざんすることでゲーム内の通貨やアイテムの数を増やしたりします。

近年では、メモリの検索や書換えを容易に手助けするツールがインターネット上に多く公開されているため誰でも入手することが可能です。この記事では、ツールの名前や使い方については言及しませんが、ツールの使い方などの情報もインターネットで多く見かけるため専門知識がなくてもメモリチートに挑戦するアビューザーも多いでしょう。

メモリチートの対策としては、ゲーム内の通貨やアイテムなど重要な変数の暗号化などが挙げられます。

パケット改ざん系

ゲームの通信を改ざんするチートです。例えば、ゲームのプレイ結果のパケットを分析し、改ざんすることでゲーム内の通貨やアイテムの数を増やしたりします。

多くのnativeゲーム(#1)は、クライアント上でプレイを行い、プレイ結果をゲームサーバー上に送ります。このプレイ結果のパケットを分析し改ざんするためには、場合によって専門知識が必要かも知れませんがよく見かけるチートでもあります。

パケット改ざんの対策としては、ゲームのサーバー側でゲームプレイ結果(パラメータ)の妥当性をチェックすることです。また、1回のプレイで得られる通貨やアイテムの数などを制限すると万が一、チートが発生しても被害を抑える効果も得られるでしょう。

バイナリ改ざん系

ゲームのクライアントアプリを改ざんするチートです。例えば、Androidであれば.apkファイルを、iOSであれば.ipaファイルを改ざんします。

クライアントのバイナリの中には、ステータスの演算に使われる変数やロジックなどが多く存在します。その変数やロジックを改ざんすることでゲーム内の通貨やアイテムの数を増やしたり、味方を強くしたりすることができます。
バイナリは、それぞれのスマートフォンの環境に合わせてビルドされたファイル内に存在し、主に専門知識を持った人によって解析されます。(#2)

バイナリ改ざんの対策は、非常に難しいものであると考えます。なぜならば、クライアント側のファイルはユーザーがいつでも触れることができるためです。(ユーザ自身が端末にインストールしたゲームアプリを取り出すことが可能)

スマートフォンで動作するnativeゲームの場合、細かいコントロールのため、クライアント側に重要な演算ロジックを実装する場合も多いです。

専門知識を持つ人が、時間と努力をかければ、クライアントはいつかは破れるものだと考えます。

そのため、バイナリ改ざんの対策としては、リバースエンジニアリングの分析を難しくするような難読化などが挙げられますが完全な対策ではありません。

(もちろん難読化を実装したほうが改ざんに対する対抗性が高まるためお勧めします。難読化製品によっては、ファイルのサイズや起動時間が増えたりするものもありますが今回の記事では割愛します)

以上三つのチートについて説明しましたが、殆どがクライアント側のハックと言えるでしょう。クライアントハックの防止とは、日々チート手法の動向を観察し、クライアント側を改善して行く一連の努力だと考えます。場合によってはいたちごっこになってしまうこともありますが、この努力は無駄になることはないでしょう。

LINEでは、クライアント側のハックへの対策も大切であると考える一方で、これからご紹介するアビューザーをモニタリングできる体制を作ることを、ゲームチートの一番重要な対策として考えています。

チート対策としてのモニタリング

先に、ゲームチートの三つの種類を述べましたように、スマートフォンのnativeゲームの場合、細かいコントロールをクライアント側で実装する場合も多く、当然クライアント側のハックを狙ったチートも多いでしょう。またクライアント側は、ユーザーがいつでも触れることができるものであって、アビューザーにとっても一番優先的にハックの対象にするものでもあります。

クライアント側の対策には限界があるため、次のステップとしてチート行為に関係する指標をモニタリングすることで、アビューザーをいち早く検知し、事後対応(#3)を迅速に行うことも重要になってきます。

LINEでは、モニタリングの基本観点として、主に以下の2点をチェックします。

・ゲームクライアント側に悪意のある行為がないか?
・チートの結果としてゲームサーバー側に不正データがないか?

ゲームクライアント側の悪意のある行為のモニタリング

このモニタリングで使われる指標は、以下のようなものがあります。

  • 実機以外の環境(RootingやJailbreak環境、Emulator環境)でゲームアプリをインストール・実行したユーザーはどのぐらい存在するのか
  • チートツールをインストール・実行したユーザーはどのぐらい存在するのか
  • 正常バイナリとは異なるhashを持つバイナリ(あるいはファイル)をインストール・実行したユーザーはどのぐらい存在するのか
  • 一つの端末で複数のアカウントログインがあるのかなど

例えば、RootingやJailbreak環境で、チートツールをインストール・実行したユーザーは、メモリチート系を試した可能性があるので、この指標をモニタリングしていて、急激に数値が増加した場合、メモリチート系のアビューザーが存在すると推測できるかもしれません。

また、Emulator環境で、アプリのインストールを繰り返しているユーザーは、リセマラ(#4)を試した可能性があるのでこの指標をモニタリングしていて、急激に数値が増加した場合、アカウントを売買するといったチート系以外の行為が発生する可能性があると推測できるかもしれません。(この限りではありません。)

また一つの端末で複数のアカウントログインがあると、チート代行者が存在すると推測できるかもしれません。

下図は、Rooting/JailbreakやEmulator環境、チートツールの検知状況を表す一部のデータの例ですが、このような指標をモニタリングすることでアビューザーの存在を推測できます。

[図1] モニタリング画面の例:Rooting/JailbreakやEmulator環境、チートツールの検知状況

また、正常とは異なるhashを持つバイナリをインストール・実行しているユーザーは、バイナリ改ざん系を試した可能性があるので、この指標をモニタリングしていて、急激に数値が増加した場合、バイナリ改ざん系のアビューザーが存在すると推測できるかもしれません。

下図は、正常バイナリとは異なるhashを持つファイルの一部をモニタリングした結果ですが、この場合は、改ざんバイナリがどこかのサイトで出回って多くのユーザーに使われた可能性も否認できません。

実際に改ざんバイナリを入手できた場合は、誰がいつ使ったかをモニタリングできるようにしていますが、このように正常とは違うhashを持つバイナリ(ファイル)をモニタリングすることでアビューザーの存在を確認することもできます。

[図2] モニタリング画面の例:正常バイナリとは違うhashを持つAssembly-Csharp.dllの検知数(左)とhash別の数(右)

LINEでは、上記のような指標を毎日モニタリングしており、悪意のある行為がどのくらい行われているかを常に観察することでアビューザーがゲームに及ぼすリスク(範囲やインパクト)を管理しております。

[図3] モニタリング画面の例:Dashboard

ゲームサーバー側の不正データのモニタリング

このモニタリングで使われる指標は、以下のようなものがあります。

  • 1回のプレイでゲーム内の通貨を想定以上に獲得しているユーザーはどのぐらい存在するのか
  • 1回のプレイでスコアを想定以上に記録しているユーザーはどのぐらい存在するのか
  • 極端に短い時間でゲームをクリアしたユーザーはどのぐらい存在するのか
  • クリア(WIN)ログ記録はあるが、プレイの詳細記録はないユーザーはどのぐらい存在するのか

例えば、1回のプレイで、ゲーム内の通貨を想定以上に獲得しているユーザーやスコアを想定以上に記録しているユーザーは、メモリチート系やパケット改ざん系を試した可能性があるのでこの指標をモニタリングしていて、急激に数値が増加したら、メモリチート系やパケット改ざん系のアビューザーが存在すると推測できるかもしれません。

下図は、少ないゲームプレイ数にも関わらず、獲得した通貨がマイナスであることを表していますが、メモリチート系のチートを通じて、通貨を格納する変数の範囲よりも大きく書き換えた事例です。

例えば、通貨を格納する変数がsigned intの場合、『-2,147,483,648』から『2,147,483,647』までの数値を格納することができますが『2,147,483,647』を越えるとキャリーオーバーが発生し、マイナスになってしまいます。

[図4] モニタリング画面の例:ユーザーが獲得した通貨

また、ゲームのクリア時間が極端に短かったり、短時間で、連続でプレイが記録されているユーザーは、バイナリ改ざん系やパケット改ざん系を試した可能性があるのでこの指標をモニタリングしていて、急激に数値が増加したら、バイナリ改ざん系やパケット改ざん系のアビューザーが存在すると推測できるかもしれません。

例えば、敵のボスのHPを0にするバイナリ改ざんチートがあると、ゲームクリア時間が極端に短くなります。ゲームプレイ結果のパケットのみ送ることでゲームプレイが記録されるチートがあると連続でゲームプレイ結果パケットを送り続けるため、短時間で、連続でプレイが記録されるようになります。

下図は、本来少なくとも30秒以上が想定されるゲームプレイ時間が、極端に短時間(5秒:クライアント側で描画時間も含まれているため、実際は5秒より短い)となっていることを表しておりバイナリ改ざんチートですぐゲームをクリアされた事例です。

[図5] モニタリング画面の例:プレイ時間が極端に短いユーザー

また、正規アプリをインストールしないで、パケットのみでプレイできるいわゆるnon-client bot/サイトが作られた可能性もあります。

non-client bot/サイトでは、ゲームに必要なパケットのみ送るため、正規アプリとは異なり、記録されるログが少ない場合もあります。例えば、クリア(WIN)ログの記録はありますが、プレイの詳細記録はないなども考えられます。

LINEでは、上記のような指標を毎日モニタリングしており、ゲームサーバー側に不正データがどのぐらいの規模で存在しているか観察することでアビューザーがゲームに及ぼすリスク(範囲やインパクト)を管理しております。

その他(払い戻しを悪用するユーザーのモニタリング)

ゲームのチートはいくつかの基準を設けてモニタリングすることができますが、想定外のところで発生する場合もあります。

代表的なものとして、Google IAPの払い戻しを悪用するケースです。

Androidのアプリケーションでは、GoogleのIAP(In App Purchase)を利用した決済機能があります。またGoogleは自社の払い戻しポリシーに基づき、IAPで購入した一部のアイテムについて払い戻しを行う場合があります。

この払い戻しを悪用するユーザーが存在することを、ゲームの運営側で認識していないと、以下のように、アビューザーがアイテムを課金なしで獲得することになります。

Googleの払い戻しを悪用する行為は以下の段階を追って行われます。
1. アビューザーが、GoogleのIAPでゲーム内の通貨である1次通貨を購入する
2. アビューザーが、1次通貨を使う(ガチャを回したり、ゲーム内の2次通貨に変換したりする)
3. アビューザーが、Googleに対して払い戻しをリクエストする
4. Googleは、払い戻しポリシーに基づき、払い戻しを行う
5. No.1-No.4の行為の繰返しが何回も見られる 

仮にNo.4で払い戻しが行われたとします。ゲームの運営側が、払い戻しを把握できていない場合、アビューザーは、自分で購入した1次通貨でゲーム内のアイテムを購入してさらに払い戻しも出来たため、
結果的に、アイテムを課金なしで獲得することになります。

LINEでは、このようなアビューザーを毎日モニタリングしており、払い戻しを悪用するユーザーがどのぐらいの規模で存在しているか観察することでアビューザーがゲームに及ぼすリスク(範囲やインパクト)を管理しております。

Googleは、以下のように、Voided Purchases APIという、ユーザーが取り消した購入に関連付けられているアプリ内注文のリスト(払い戻しリスト)を提供しますのでこれを利用することでモニタリングが可能です。

https://developers.google.com/android-publisher/voided-purchases

最後に

以上、ゲームのチート対策としてのモニタリングについて幾つかの例を紹介しましたが、これは、クライアント側のハックを防ぐ努力を事前対応とすれば、チート行為を測る指標をモニタリングすることでアビューザーに対する措置(チートで得られた通貨やアイテムの回収、プレイ停止など)を取ることを事後対応とすることができます。

冒頭でも申し上げましたように、事前対応の側面があるクライアントハックの防止は、日々チート手法の動向を観察し、クライアント側を改善して行く一連の努力であり、この努力は無駄になることはないですが、事後対応の側面があるモニタリングを通じたアビューザー対応も欠かせないチート対策であると思います。

例えば、クライアントハックでよくあるバイナリ改ざん系のチートがあり、改ざんバイナリ(.ipa)がインターネットのどこかに配布されたと想定してみましょう。

その改ざんバイナリを利用したいと思うゲーマーにとっては、

  • 課金しないでゲームを有利にすることが可能
  • 特別な環境(jailbreak)ではなくても動作する
  • ウェブサイト上にアクセスしインストールすればipaファイルのインストールする手間や事前知識がなくても利用できる

などができるため、殆どの場合、自己責任で使うケースが多いでしょう。

(ユーザーによっては、配布先が信頼できないなどの理由でインストールを拒否することや利用を恐れるユーザーもいるでしょう)

このように、万が一、クライアント側でチートが発生した場合でも、チート行為を測る指標をモニタリングする体制が整えば、ゲームサービスにおけるリスク管理がしっかり行えるでしょう。

(#1)スマートフォンゲームのアプリのうち、ブラウザなど他のアプリを介さずに直接実行できる形式のものを意味します。

(#2)例えば、Unityで開発されたアプリの場合、Assembly-CSharp.dllが分析されるケースがよくあります。この記事では、チートの詳細な説明について割愛しますが

以下の資料も合わせてご参照ください。

(#3)モニタリングでアビューザーとして判定された場合の装置を意味します。チートで得られた通貨やアイテムの回収やプレイ停止など

(#4)リセットマラソン(reset marathon)を省略してリセマラと呼びます。主にゲームアプリのインストールとアンインストールを何度も繰り返すことで、自分が目的とするアイテムの入手する方法として知られています。

Related Post