NHN Cloud Meetup 編集部
[Security]モバイル生態系を脅かす改ざんアプリ(Mod)と対応方法
2019.12.04
2,638
1. 改ざんアプリ(MOD)とは?
MODは修正と変更を意味するModificationの略で、修正されたり変更されたアプリを意味します。ハッカーはMODを製作するために、既存のアプリをデコンパイル(逆コンパイル)して、ソースコードを確認し、悪意のある動作をするようにソースコードを変更して、ハッキングサイト、SNS、SMSなどを通じて配布します。
以下は、一般的なアプリの改ざんタイプをまとめたものです。
PCで流行したマルウェアの行為が、モバイル環境に移行してきており、この他にも様々な方法でハッキングの事故事例が増加しています。
タイプ | 説明 |
---|---|
通貨修正 | 正常なアプリで通貨(アプリ内のお金、ポイント)の値を検索し、コードを変更 |
個人情報の引き継ぎ | 正常なアプリから個人情報を探して、ハッカーのサーバーに転送するコードを追加 |
アドウェア | 正常なアプリでハッカーが利益を得る広告を実行するコードを追加 |
ランサムウェア | 正常なアプリで特定ファイル(個人画像、動画、文書など)を暗号化したり、携帯電話のパスワードを変更するコードを追加 |
以下は、RPGゲームアプリの改ざんタイプです。他にも、ゲームのジャンルや特性に応じて多様に改ざんがなされています。例えば、FPSジャンルのゲームでは、ウォールハック(相手の位置を壁を通過して確認)と無反動(銃の反動を除去)などが作られ、AOSとMOBA(多対多の戦いを意味する「Multiplayer Online Battle Arena」の略)ジャンルでは、マップハック(マップの視野を確保)などが製作され配布されています。モバイルゲームのハックは、PCゲームのそれに比べて種類があまり多くありませんでしたが、モバイルゲームの製作が増加するにつれてPCゲームのような様々な種類のハックが発生しています。
タイプ | 説明 |
---|---|
一撃ハック(One Hit) | 自分の攻撃力を増加させたり、相手のHPと防御力を減少させて一発で相手(他のユーザーとモンスター)を殺すようにコードを変更する |
無敵ハック(God Mode) | 相手の攻撃力を減少または削除させたり、自分の防御力を増加させて、自分が無敵になるようにコードを変更する |
スピードハック | 攻撃速度、クールタイム速度など、ゲームエンジンのスピードに関連する値を変更して、ゲーム内の速度を増加または減少させるようにコードを変更する |
能力ハック | HP、MP、スキルなどの能力値に関連する値を変更して、悪意のある行動をするようにコードを変更する |
通貨ハック | 通貨の習得量、確率を変更して利得を得るようにコードを変更する |
改ざんアプリで広告を表示させる事例です。
[図1]強制広告表示改ざんアプリ
ほとんどの改ざんアプリは有名人気アプリになりすましてアプリのインストールを誘導します。NHNの場合でも、占いアプリにおいて悪意のあるコードが追加され、図1のように強制的に広告が表示されたり、図2のように一般的な方法で削除しづらくさせる事例がありました。事故発生後、TOAST AppGuardを利用して解決しましたが、この経験からゲーム以外の一般アプリでも、事前に改ざんアプリ対応が必要であることを学びました。
[図2]削除妨害改ざんアプリ
ゲームアプリの改ざん事例としては、このようなものがあります。
正常なアプリの場合、ゲーム開始時にミニマップから敵の位置が把握することはできませんが、改ざんゲームの場合、レーダーハック(マップハック)使用時にすべての敵の位置が表示され、ゲームでの攻撃と防御に有利に働きます。
2. 開発者ができる保護方法は?
ファイルの整合性チェック
・元のクライアントファイルのハッシュ値を事前にクライアントやサーバーに保存して、アプリ実行時に実行されるクライアントファイルのハッシュ値と比較することで検出できます。
・Androidでは、元のAPKハッシュ値とインストールされたAPKハッシュ値を比較することで、改ざんを確認できます。
・ゲームの場合は、エンジンとビルドによって検査するクライアントファイルが異なります。違いは、以下の表のとおりです。
ゲームエンジン | クライアントファイル(Android、AOS) |
---|---|
Unity Mono | ゲームクライアントコードがあるdllファイル(ほとんどがAssembly-CSharp.dllにあります) |
Unity Il2cpp | libil2cpp.so |
Unreal | libUE(バージョン).so / libUE3.so、libUE4.so |
Cocos2d-x | libgame.soあるいはlib(カスタム).so |
署名値検査(Android)
・Android改ざんアプリの場合は、コードを修正した後、リパッケージの作業中に、従来の開発者の署名ではなく、ハッカーの署名で配布されます。
・署名値は固有の値であるため、既に配布で使用している署名値をあらかじめ保存しておき、ゲーム実行時に比較することで改ざんの確認ができます。関連するコードは、下表のとおりです。
Android Code | Unity Code |
---|---|
Activity activity = this; // Activity |
AndroidJavaClass player = new AndroidJavaClass(“com.unity3d.player.UnityPlayer”); AndroidJavaObject activity = player.GetStatic(“currentActivity”); AndroidJavaObject packageManager = activity.Call(“getPackageManager”); string packageName = activity.Call(“getPackageName”); int GET_SIGNATURES = packageManager.GetStatic(“GET_SIGNATURES”); AndroidJavaObject packageInfo = packageManager.Call(“getPackageInfo”, packageName, GET_SIGNATURES); AndroidJavaObject[] signatures = packageInfo.Get<AndroidJavaObject[]>(“signatures”); string signaturesHash = signatures[0].Call.(“hashCode”).ToString(“X”); |
コード難読化
・難読化されていないコードは、分析時にターゲットとなるシンボル情報を利用して、改ざんする位置をすぐに見つけることができますが、難読化されたコードの場合、改ざんする位置を検索したり、分析を困難にする利点があります。
・コード難読化の製品とプラグインの使用を推奨しますが、使用が制限されている場合、重要なクラス、関数、変数名を手動で変更することをお勧めします。
[図3]難読化前
[図4]難読化後
データサーバーの検証
・データサーバーの検証は、最も強力な方法で異常なデータを確認して遮断する方法です。
・可能な限りの値をサーバーで処理するように実装する必要があり、ランダム値が発生する場合は、閾値の設定をお勧めします。
一般的なアプリのデータ検証例 | ゲームアプリのデータ検証例 |
---|---|
アプリで商品購入時、ポイントの積み立て数値が3%と仮定すると、サーバーから3%以上の値が入る場合、ブロックします。
アプリで商品購入時、金額と数量を検証し、少額で大量商品を購入する異常な行為をブロックします。 |
攻撃を増加させた改ざんアプリの場合、ステージを高速でクリアすることになります。
そこでサーバーでステージクリア最小時間を確認し、異常に速くクリアする場合にブロックします。 |
ファイルの整合性チェックと署名値検査は
TOAST AppGuardに基本適用されており、検出および遮断を提供しています。
3. ユーザーができる保護方法は?
正規マーケット利用
・大半の改ざんアプリは異常な経路からインストールを誘導するため、下記のような正規マーケットの利用を推奨します。
・また、Androidの場合、設定> セキュリティ>提供元不明アプリの許可機能をoffにすることをお勧めします。
[図5]正規マーケット
[図6]提供元不明アプリの設定画面
不要な権限を確認する(Android)
・Androidでは、マーケットからインストールする前にアプリの権限リストを表示します。不要な権限がある場合は、インストールを控えた方がよいでしょう。
・Android 6.0以上の機器では、アプリで権限が必要な場合はユーザーから許可を受けるようになっており、不要な場合は、拒否をお勧めします。ユーザーが権限を許可しても、設定> アプリケーション> アプリケーション> 権限から変更が可能です。
[図7]アプリのインストール権限
[図8]権限の確認
データバックアップ
・近年増加しているランサムウェアに備えて、PC及びクラウドでデータのバックアップをお勧めします。