環境を保護する

Google は、アプリが安全で信頼できる環境で実行されているかどうかを検出するための一連の API とサービスを提供しています。中心となるのは Play Integrity API です。これは、リスクが潜んでいる可能性のある不正な操作を検出して、操作が正規のものであることを確認するのに役立ちます。Play Integrity API では、アプリとデバイスの完全性に加えて、アクセスとユーザー補助のリスクGoogle Play Protectデバイスの最近のアクティビティに関する情報を提供できるようになりました。不正行為対策戦略をさらに強化するために、Android プラットフォームには、アプリに関連する可能性のある特定のシナリオ用の API が用意されています。

Play Integrity API

Play Integrity API の機能

Play Integrity API を使用すると、アプリが実行されているデバイスのセキュリティ状態を確認できます。これにより、適切なユーザーが機密情報にアクセスしていることを確認できます。

信頼できる環境で、操作とサーバー リクエストが正規のアプリバイナリからのものかどうかを確認できます。

  • 正規のアプリバイナリ: Google Play で認識されている、改変されていないバイナリとやり取りしているかどうかを判断します。
  • 正規の Play インストール: 現在のユーザー アカウントにライセンスが付与されているかどうか(つまりユーザーが Google Play でアプリまたはゲームのインストールや支払いを行ったかどうか)を判断します。
  • 正規の Android デバイス: Google Play 開発者サービスを搭載した正規の Android デバイスでアプリが実行されているかどうかを判断します。
  • 既知のマルウェアが含まれていない: Google Play プロテクトがオンになっているか、危険なアプリのインストールがデバイスで検出されたかを判断します。
  • 他のアプリによるアクセスのリスクが低い: 画面をキャプチャしたり、デバイスやアプリへの入力を制御したりする可能性のあるアプリが他に実行されているかどうかを判断します。

不正行為の軽減に役立つ仕組み

ユーザーがアプリで重要な操作を実行したら、Play Integrity API を呼び出すことができます。そうでなかった場合、アプリのバックエンド サーバーは、攻撃や不正行為を防ぐための対処方法を決定できます。たとえば、追加のユーザー確認を要求したり、機密性の高い機能へのアクセスを拒否したりできます。

Play Integrity API の意思決定フロー

アプリアクセスのリスク

アプリアクセス リスク シグナルは、アプリの実行時にデバイス上の他のアプリが画面を参照してキャプチャしたり、ユーザー補助権限を使用してアプリにアクセスしたりする可能性があるかどうかを評価するのに役立ちます。検証済みのユーザー補助アプリは、これらの判定結果から自動的に除外されます。リクエスト元アプリはインストール済みのアプリを識別することがなく、判定結果はユーザー ID やデバイス ID にリンクされないため、アプリアクセス リスクを利用することで、デベロッパーはユーザーのプライバシーを損なうことなくアプリを保護できます。

特定のアプリを閉じるように求めるスマートフォンのスクリーンショット。

この共同作業により、より深い分析情報を提供してお客様をより効果的に保護するために必要なシグナルを取得できます。
—Nubank、早期アクセス パートナー

アプリアクセス リスクには、次のリスクレベルがあります。

  • キャプチャ レスポンスとは、画面をキャプチャできる他のアプリが実行されていることを意味します。
  • 制御レスポンスとは、デバイスを制御できる他のアプリが実行されていることを意味します。つまり、画面をキャプチャしたり、アプリへの入力を制御したりする可能性があります。

アプリアクセス リスクの適用

アプリやゲームで、Play Integrity API で保護する価値の高いアクションや機密性の高いアクションを特定します。これにより、アクセスを完全に拒否する必要がなくなります。可能であれば、価値の高いアクションを許可する前に、リスクの高いトラフィックを検証します。たとえば、アプリアクセス リスクにより、画面をキャプチャする可能性のあるアプリが実行されていることが示されている場合は、保護したい機能の実行を許可する前に、画面をキャプチャできるアプリを無効にするかアンインストールするようユーザーに求めます。

次の表に、判定結果の例を示します。

アプリアクセス リスク判定結果のレスポンス例 解釈
appsDetected:
["KNOWN_INSTALLED"]
Google Play で認識されているインストール済みアプリ、またはデバイス メーカーによってシステム パーティションにプリロードされているアプリのみがあります。 CAPTURING、CONTROLLING、OVERLAYS という判定結果となるアプリは実行されていません。
appsDetected:
["KNOWN_INSTALLED",
"UNKNOWN_INSTALLED",
"UNKNOWN_CAPTURING"]
Google Play によってインストールされたアプリ、またはデバイスのメーカーによってシステム パーティションにプリロードされたアプリがあります。画面の表示や、他の入出力のキャプチャに使用できる権限が有効になっている実行中の他のアプリがあります。
appsDetected:
["KNOWN_INSTALLED",
"KNOWN_CAPTURING",
"UNKNOWN_INSTALLED",
"UNKNOWN_CONTROLLING"]
画面の表示や他の入出力のキャプチャに使用できる権限が有効になっている Play アプリまたはシステムアプリが実行されています。また、デバイスの制御やアプリへの入力の直接制御に使用できる権限が有効になっている実行中の他のアプリがあります。
appAccessRiskVerdict: {} 要件が満たされていないため、アプリアクセス リスクは評価されませんでした。(たとえば、デバイスの信頼性が十分ではなかった場合など)。

Play プロテクト シグナル

Play プロテクト シグナルは、Play プロテクトがオンになっているか、および有害な既知のアプリのインストールがデバイスで検出されたかどうかを判定します。

environmentDetails:{
  playProtectVerdict: "NO_ISSUES"
}

アプリやユーザーデータにとってマルウェアが特に懸念事項である場合は、この判定結果を確認したうえで、ユーザーに対し Play プロテクトをオンにするか、先に有害なアプリを削除することを求めることができます。

Play プロテクトを有効にするダイアログ

playProtectVerdict の値は次のいずれかになります。

判定結果 解説 推奨される対処方法

NO_ISSUES

Play プロテクトはオンになっていますが、デバイスにおいてアプリの問題は検知されませんでした。

Play プロテクトがオンになっていて、問題は検出されていないため、ユーザーの操作は必要ありません。

NO_DATA

Play プロテクトはオンになっていますが、まだスキャンが実行されていません。デバイスまたは Google Play ストア アプリが最近リセットされた可能性があります。

Play プロテクトがオンになっていて、問題は検出されていないため、ユーザーの操作は必要ありません。

POSSIBLE_RISK

Play プロテクトがオフになっています。

Play プロテクトがオンになっていて、問題は検出されていないため、ユーザーの操作は必要ありません。

MEDIUM_RISK

Play プロテクトがオンになっており、有害な可能性があるアプリがデバイスにインストールされていることが検知されました。

リスク許容度に応じて、Play プロテクトを起動し、Play プロテクトの警告に対応するようユーザーに依頼できます。ユーザーがこれらの要件を満たすことができない場合は、サーバー アクションからブロックできます。

HIGH_RISK

Play プロテクトがオンになっており、危険なアプリがデバイスにインストールされていることが検知されました。

リスク許容度に応じて、Play プロテクトを起動し、Play プロテクトの警告に対応するようユーザーに依頼できます。ユーザーがこれらの要件を満たすことができない場合は、サーバー アクションからブロックできます。

UNEVALUATED

Play プロテクトの判定結果は評価されませんでした。

次のような原因が考えられます。

  • デバイスの信頼性が十分でない。
  • ゲームのみ: ユーザー アカウントが LICENSED ではない。

最近のデバイスのアクティビティ

最近のデバイスのアクティビティをオプトインすることもできます。これにより、過去 1 時間にアプリが特定のデバイスで完全性トークンをリクエストした回数を確認できます。最近のデバイスのアクティビティを使用することで、予期せぬ不審なアクティビティを過剰に行っている(アクティブな攻撃を示している可能性がある)デバイスからアプリを保護できます。一般的なデバイスにインストールされたアプリが 1 時間ごとに完全性トークンをリクエストする回数の予測に基づいて、最近のデバイスのアクティビティの信頼レベルを決定できます。

recentDeviceActivity を受け取ることをオプトインした場合、deviceIntegrity フィールドには以下の 2 つの値が含まれるようになります。

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

まず、データを確認して、すべてのデバイスでアプリの一般的なデバイス アクティビティ レベルを確認する必要があります。次に、デバイスがリクエストを過剰に送信している場合にアプリがどのように応答するかを決定します。アクティビティが少し多い場合は、後でもう一度お試しいただくようお客様に伝えます。アクティビティが非常に多い場合は、より厳しい違反措置を講じることをおすすめします。

標準リクエストとクラシック リクエストの比較

Play Integrity の実装の一環として、次の 2 種類のリクエストを考慮することが重要です。ほとんどの場合、最も速いレスポンスを提供するために標準リクエストを使用する必要があります。デバイス構成証明レコードに対して新しく生成されたリクエストが必要な場合は、クラシック リクエストを使用する必要があります。

クラシック リクエスト

標準リクエスト

リクエストに時間がかかるため、頻度を抑える必要があります。

たとえば、価値の高いアクションまたは機密性の高いアクションが真正なものかどうかを確認するために、低い頻度で 1 回限り実行します。

使用頻度が低い

リクエストは低レイテンシで、オンデマンドで使用できます。

標準リクエストは以下の 2 つの部分で構成されます。

  • 完全性トークン プロバイダを準備する(1 回限り)
  • 完全性トークンをリクエストする(オンデマンド)

オンデマンドで使用する

標準リクエストとクラシック リクエストの詳細については、Play Integrity のドキュメントをご覧ください。

実装

Play Integrity API の使用を開始するには:

デフォルトでは、Play Integrity API ではアプリごとに 1 日あたり最大 1 万件のリクエストが許可されます。1 日あたりの最大リクエスト数の引き上げを希望される場合は、こちらの手順に沿ってご連絡ください。リクエストの 1 日あたりの上限を引き上げるには、アプリで Play Integrity API を正しく実装し、他の配信チャネルに加えて Google Play でもアプリが利用できる必要があります。

Play Integrity API で留意すべき点

Automatic Integrity Protection(API 23 以降)

Automatic Integrity Protection は、不正な改変や再配布という形で行われる完全性の侵害からアプリを保護する改ざん防止コード保護サービスです。データ接続がなくても機能し、テスト前のデベロッパーの作業やバックエンド サーバーの統合は不要です。

不正行為の軽減に役立つ仕組み

Automatic Integrity Protection を有効にすると、Google Play はアプリのコードにチェックを追加し、高度な難読化とリバース エンジニアリング対策の手法を使用して、これらのチェックを削除しにくくします。実行時に、保護機能はアプリが改ざんまたは再配布されていないか確認します。

  • インストーラ チェックに失敗した場合、Google Play でアプリを入手するよう求めるメッセージがユーザーに表示されます。
  • 改変チェックに失敗した場合、アプリは実行されません。

これにより、改変されたバージョンのアプリからユーザーを守ることができます。

実装

現在、Automatic Integrity Protection を利用できるのは一部の Play パートナーのみです。Google Play Console でこの機能が利用できない場合は、アクセスを希望される旨を Google Play デベロッパー サポートにお問い合わせください。

保護を有効にするには、リリースの作成時または [アプリの完全性] ページ([リリース] > [アプリの完全性])で有効にします。Automatic Integrity Protection を使用するには、アプリで Play アプリ署名を使用する必要があります。

リリースを本番環境に昇格させる前に、保護されたアプリを必ずテストしてください

注意点

  • アプリの保護されていないバージョンを公開しない
  • 改ざん対策を組み合わせる際は注意する
  • 保護されたアプリを本番環境にリリースする前にテストする
  • 通常どおりに統計情報をモニタリングし、クラッシュの増加がないか確認する
  • アプリのクラッキングされたバージョンを Google Play に報告できます