Google Play ゲームはオープンベータ版です。

完全性の保護

招待されたデベロッパーは、完全性の保護を提供する以下のような機能を利用できます。Play Integrity API と Automatic Integrity Protection は、Google Play ゲームとモバイル プラットフォームの両方で機能します。

Play Integrity API

Play Integrity API を使用すると、潜在的なリスクや不正行為からゲームを保護することができ、不正行為、偽装、不正アクセスなどの攻撃や不正使用のリスクを軽減するために適切な措置を講じることができます。ゲームのバックエンド サーバーでシグナルを受信することで、配布チャネル(Play ストアからライセンス取得またはインストールされていること)、アプリ パッケージ(改変や改ざんがまったくないこと)、デバイス本体(root 権限が取得されたデバイスや不正使用されたデバイスなどではないこと)に関するチェックを行えます。この API は Google がサポートしており、ユーザーが他の仮想環境ではなく、Google Play ゲームを利用しているという信頼できるシグナルを提供する唯一のソリューションです。これにより、以下が可能になります。

  • APK が Google Play で配布、インストールされたものであると保証することで、不正アクセスから保護します。
  • 改変されていないバイナリとゲームのバックエンド サーバーがやり取りしていることを確認することで、APK の改ざんから保護します。
  • 新たに公開した x86 バイナリが Google Play ゲームの仮想環境で実行され、サポートされていないサーフェス上での攻撃からは保護されることを保証します。

Play Integrity API を使用すると、複数のシグナルを暗号化されたトークンにまとめることができます。正規の Android デバイスと、Google Play の完全性チェックに合格している仮想環境の場合、完全性について合格と判定されます。Play Integrity API は、アプリの実行中に重要なゲームイベントが発生したときに使用することをおすすめします。たとえば、ユーザーがアプリ内購入を行ったり、ゲームにユーザーのスコアを保存したりする場合です。事前に設定した時間に API を呼び出すなど、事前に規定した方法でこの API を使用することはおすすめしません。

この API は柔軟に利用できますが、信頼できるサーバーで実行するコードを追加する必要があります。デバイス上での検証は安全ではないため、おすすめしません。ソリューションを完成するには、完全性チェックとレスポンスの検証に必要な基盤を提供するコンポーネントをサーバー側に含める必要があります。デバイスに「yes / no」の答えをバイナリで返すのではなく、Play Integrity API が提供する判定に基づいてアプリの動作を微調整することを強くおすすめします。

Play Integrity API は、SafetyNet Attestation API(SNAA)と Play App Licencing API の両方の後継となります。SNAA は Google Play ゲームの完全性の確認時に、負のシグナルしか返さないので、Google Play ゲームでは使用できません。

デバイスの完全性フィールド

deviceIntegrity フィールドには deviceRecognitionVerdict という値のみが含まれます。この値は、デバイスがアプリの完全性をどの程度徹底できるかを表します。デフォルトでは、deviceRecognitionVerdict は以下のいずれかのラベルを持ちます。

  • MEETS_DEVICE_INTEGRITY: アプリは Google Play 開発者サービスを備えた Android デバイスで実行されています。このデバイスはシステム完全性チェックに合格し、Android の互換性要件を満たしています。
  • MEETS_VIRTUAL_INTEGRITY: アプリは Google Play 開発者サービスを備えた仮想 Android 環境で実行されています(現在 Google Play ゲームに限定されています)。この環境は Android の互換性に関する主要な要件を満たしており、Google Play の完全性チェックに合格しています。
  • ラベルなし(空の値など): アプリは、API フックなどの攻撃やルート権限取得などのシステム侵害の兆候があるデバイス、または Google Play の完全性チェックに合格していない仮想デバイス(エミュレータなど)で実行されています。

Play Integrity API は、deviceRecognitionVerdict のラベル MEETS_VIRTUAL_INTEGRITY を使用して、ゲームが Google Play ゲームで実行されていることを示します。Play Integrity API からのレスポンスを渡す例を次に示します。

deviceIntegrity: {
    // "MEETS_VIRTUAL_INTEGRITY" indicates the game is running on Google Play Games
    deviceRecognitionVerdict: ["MEETS_VIRTUAL_INTEGRITY"]
}

検証ロジックで Google Play ゲームの MEETS_VIRTUAL_INTEGRITY ラベルをチェックしていることを確認してください。

モバイルでも楽しめるクロス プラットフォーム ゲームを提供している場合は、同様に、検証ロジックで MEETS_DEVICE_INTEGRITY ラベルもチェックしていることを確認します。

詳しくは、Play Integrity API のドキュメントをご覧ください。

Automatic Integrity Protection

Automatic Integrity Protection は、ゲームを開くたびに Google Play によって実行されるランタイム チェックです。ゲームが改ざんされている場合や、Google Play 以外でインストールされている場合、Automatic Integrity Protection により、ゲームの実行を阻止できます。その際に、デバイスはチェックしません。デバイスの完全性のステータスを確認するには、Play Integrity API を使用する必要があります。

Automatic Integrity Protection は、以下の機能によって完全性を保護します。

  • Google Play からのインストールを求める: アプリが Google Play からインストールされたかどうかを確認するチェックを追加します。このチェックが失敗した場合、Google Play からアプリを入手するよう求めるメッセージがユーザーに表示されます。この推奨機能はデフォルトでオンになっていますが、オフにすることもできます。この機能をオフにすると、有料アプリの著作権侵害の保護が無効になります。
  • 改変を制限する: アプリが改変されていないかどうかを確認するチェックを追加します。このチェックが不合格だった場合、アプリは実行されません。この機能は常にオンになっており、オフにすることはできません。
  • リバース エンジニアリングを制限する: 難読化などの高度な手法を追加して、ランタイム チェックの削除を難しくします。この機能は常にオンになっており、オフにすることはできません。

Automatic Integrity Protection については、デベロッパーがオプトインする必要があります。デベロッパーの作業(コードの変更など)は不要です。保護機能は、データ接続やインターネット接続の有無にかかわらず実行され、サーバー側のコンポーネントは必要ありません。なお、デバイス上の Play ストア アプリが長時間オフラインだった場合、「Google Play からのインストールを求める」チェックでは定期的にデータ接続が必要になります。

Google Play ゲームに関するその他の考慮事項

Play は、ゲームの保護に役立つ完全性に関するプロダクトのコレクションを提供しています。利用可能なプロダクトの詳細については、Play Integrity のドキュメントをご覧ください。このセクションでは、Google Play ゲームでこうしたプロダクトを使用する際の特別な考慮事項について説明します。

信頼できないデバイスを配信対象から除外する

Google Play Console には、完全性チェックに合格しないデバイスに Google Play からアプリをインストールできないようにする設定があります。

現在この機能は Google Play ゲームと互換性がなく、プラットフォームにゲームを配信できません。デバイス カタログでこの除外ルールを有効にしないでください。

Play Integrity API

Play Integrity API は、deviceRecognitionVerdict のラベル MEETS_VIRTUAL_INTEGRITY を使用して、Google Play ゲームでゲームが実行されていることを示します。Play Integrity API からのレスポンスを渡す例を次に示します。

deviceIntegrity: {
    // "MEETS_DEVICE_INTEGRITY" is one of several possible values.
    deviceRecognitionVerdict: ["MEETS_VIRTUAL_INTEGRITY"]
}

検証ロジックで必ずラベル MEETS_VIRTUAL_INTEGRITY をチェックするようにしてください。

詳しくは、Play Integrity API のドキュメントをご覧ください。