Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Unityでのチート対策を簡単かつ高品質に行う為の取り組み

trapezoid
February 03, 2023

 Unityでのチート対策を簡単かつ高品質に行う為の取り組み

モバイルゲームにおけるチート対策はユーザ体験の為にも重要な要求である一方で、チート対策の実装やゲームへの組み込みには相応の工数や深い知見が必要になり、非常に難しい領域になっています。
DeNAでは社内/社外の開発問わず横断チームからチート対策へのサポートを幅広く行っており、高品質なチート対策を高い透過性で組み込める仕組みを、横断部門から提供しています。
本セッションでは、チート対策の強度を高める手法ではなく、組み込みにあたっての透過性を高めるために行っている工夫にフォーカスを当てて解説していきます。

trapezoid

February 03, 2023
Tweet

More Decks by trapezoid

Other Decks in Programming

Transcript

  1. 自己紹介 2 • 大竹 悠人(Haruto Otake) ◦ ゲーム事業本部開発事業部開発二部テクノロジー推進グループ ◦ Twitter:

    @Trapezoid • 2013年よりDeNAにジョイン ◦ Unityに関連した技術サポートと様々な内製ライブラリの実装・保守に従事 ◦ クライアントチート対策のサポート /実装も複数のタイトルで担当
  2. モバイルゲームのチート対策の大分類 4 • クライアントチート対策 ◦ クライアントアプリへの不正な操作を 困難にし、検出する ◦ 完璧に防ぐことは不可能 ▪

    対策の強度が高ければ、 攻撃者にとっての合理性 を低くすることは出来る ◦ 突破されては対策してを繰り返す、一定のイタチごっこが必要 • サーバチート対策 ◦ サーバ側への入力を検証して不正な操作や状態遷移を阻止する ◦ 入力として有効な範囲で行われたクライアントチート の検出は困難 ゲームに適合するバランスで両立することが必要
  3. モバイルゲームのチート対策の大分類 5 • クライアントチート対策 ◦ クライアントアプリへの不正な操作を 困難にし、検出する ◦ 完璧に防ぐことは不可能 ▪

    対策の強度が高ければ、 攻撃者にとっての合理性 を低くすることは出来る ◦ 突破されては対策してを繰り返す、一定のイタチごっこが必要 • サーバチート対策 ◦ サーバ側への入力を検証して不正な操作や状態遷移を阻止する ◦ 入力として有効な範囲で行われたクライアントチートの検出は困難 今回はクライアントチート対策に関しての話
  4. 透過性の高いクライアントチート対策を行うための体制 10 • 透過性の高いチート対策ライブラリ を横断部門から各タイトルに提供 ◦ 横断部門の専門性の高いメンバーが、専門性が必要な領域を担える ◦ チート対策ライブラリのアップデートによる簡単な強度強化も可能に •

    各タイトルの担当者は、チート対策を必要なだけ導入する ◦ 透過性が高いので好きな時に、限りなく少ない影響で安全に 導入できる 高品質なクライアントチート対策を できるだけ少コストで利用可能な環境を実現する
  5. 11 主なクライアントチート対策 動作中のアプリの メモリを改ざんする (読み込まれたマスタ/プレイヤー データやステータスを、有利な状態 に強制的に変更する ) 行為を制限し、検出する。 メモリ改ざんソフトや、チート対策

    の回避を行うソフトの 動作環境となる環境 (Root / 脱獄, エミュレータ等)で のアプリの動作を制限する ゲームロジックそのものや他の チート対策を解読して、チート対策 の回避をしたり、ゲームの挙動を 変化させる 行為を制限し、検出する。
  6. 20 クライアントチート対策の手動実装を代替するコンパイラ • 手動実装時のクライアントチート対策の流れはかなり固定的 ◦ ある関数を通った時に(When) ◦ 様々なチート検知ロジックを実行し (What, To)

    ▪ 改ざん検知 / 不正環境(Root/脱獄/エミュレータ…)の検知 など ◦ チート検知時にアプリケーションの終了等の処理を行う関数を呼び出す (Then) • チート対策用C++コンパイラ ◦ clang等のC++コンパイラと差し替えて利用するチート対策ソリューション ◦ コンパイル時に透過的にLLVM IRを改変し、ソース変更せずにチート対策を施す ◦ コンパイル時に動くので、関数単位での改竄検知も可能 • When/What/To/Thenを設定として記述することで、チート対策の内容を指定する
  7. 21 チート対策用C++コンパイラの選択肢 • Digital.ai App Protection (EnsureIT) ◦ Digital.ai社開発の有償ソリューション ◦

    保護の品質はとても高い(外部ベンダのソリューションの為、詳細は省略 ) • DeClang ◦ DeNA セキュリティ部により提供されている DeNA内製のプロダクト ◦ OSSとして公開していて、無料で利用可能。 Unity(IL2CPP)に対応 ◦ DeNA専用の拡張版が存在(OSS版にはないチート対策機能を多数搭載 )
  8. 25 多層的な改竄検知によるチート対策の強化 • 改竄検知処理自体を改竄検知する ◦ 改竄検知処理自体の改竄によって突破 されても、その改竄を検出できる ◦ これを何重にも積み重ねる ◦

    すべてを改竄しないと突破できない • クライアントチート対策全般を巻き込んで保護 ですると非常に効果が大きい ◦ 下層で不正環境検知を行ったり、メモリ 保護のコードを改竄検知する
  9. 26 チート対策用コンパイラ(のUnityでの)共通のメリット/デメリット • メリット ◦ コードを変更せずチート対策を差し込める事による、 透過性の高さ ▪ 開発用に検知を外すコードパスを用意する必要がなくなる (ビルドフローで対応可

    ) ▪ パフォーマンス問題があったときに強度を弱めるなどの調整が容易 ◦ 手動実装では困難な多層的な改竄検知による、強力なチート対策性能 • デメリット ◦ コードに強く依存する設定としてチート対策の構成を生成する必要がある ▪ いつ/どの対象の/どんな事象を検知し違反時にどうするか ▪ シンボル名ベースで指定する必要があり、 IL2CPPの命名規則を知る必要も ◦ 多層的な改竄検知を構築するにはチート対策への深い理解と多大な工数が必要 ◦ 設定の形式は実際のチート対策用コンパイラ毎に異なり、ロックインされる
  10. 33 C#コード(対象/起点)の指定 • 単体指定と範囲指定で宣言的に区別 ◦ 保護の起点は単体指定 ◦ 保護の対象は範囲指定 • リファクタリングでも追跡される記述

    ◦ Generics / nameof / typeof ◦ コードと設定の乖離を防止 • 合成をサポート ◦ 単体 + 単体 = 範囲 ◦ 範囲 + 範囲 = 範囲 FunctionExpression.OfMethod<Chara>( nameof(Chara.DealDamage) ); 対象はメソッド単体 対象のクラス 対象のメソッド RangeExpression.OfClass<Chara>(); 対象はクラス全体の 範囲 対象のクラス RangeExpression rangeExpression = functionExpression1 + functionExpression2; 単体指定同士を 範囲指定に合成
  11. 34 保護内容の指定(の擬似コード) • 保護内容の種類毎のプロパティに指定 ◦ 対象がある場合引数にコードを指定 ◦ 保護対象毎にオプションも指定 ▪ 強度や起点の選択条件など

    • いくつかの設定は演算子で合成可能 ◦ 設定の責任範囲の分解が可能になる ◦ ライブラリ側で難読化や改竄検知を行うべき 範囲を定義できる ◦ 内製サーバSDK等で実施 new GuardNetworkBuilder( //利用ミドルウェアとプラットフォームを指定 MiddlewareTypes.DeClang, MiddlewareTargetPlatforms.Android ) { Seed = seed, FirePointSets = new () { //保護起点をFunctionExpressionで指定 scene1Start, scene2Start }, CheckSumPoints = new (){ //改竄保護対象を指定 charaClass, enemyClass, scene1Start, scene2Start }, Obfuscates = new (){ //難読化対象を指定 (強度も指定できる ) {charaClass, 2f}, enemyClass, scene1Start, scene2Start }, //Root検知を実施 DetectJailbreakAndRooted = DetectJailbreakAndRootedSource .OfDefaultPhase() /* 省略 */ );
  12. 37 従来の問題点の解決 • コードに強く依存する設定としてチート対策の構成を生成する必要がある ◦ C#で使った記述を可能にし、実際のコードへの追従性を担保 • 多層的な改竄検知を構築するにはチート対策への理解と多大な工数が必要 ◦ 定義するべきことを絞り、本当に知るべきことだけを知るだけで設定可能

    ◦ 実際の検知の構築を自動化して、多層的な改竄検知の品質を安定させる • 設定の形式は実際のチート対策用コンパイラ毎に異なり、ロックインされる ◦ 設定手法は共通なので、どちらを使ってもノウハウを共有することが可能 ◦ 導入後の切り替えや、どちらにするかの意思決定の遅延が可能
  13. 40

  14. 41