App Attest と DeviceCheck を使用して iOS デバイスでの不正行為を軽減する方法

アプリ開発者は、Apple が提供する 2 つのツールである App Attest と DeviceCheck を使用することで、不正行為を最小限に抑えることができます。これらを使用して、アプリへの不正な変更を防ぎ、ユーザーがプレミアム コンテンツを不正に取得するのを防ぐ方法を次に示します。

アプリ開発者は、自分の作品から収益を得る方法がいくつかあります。ただし、誰もが喜んでお金を払うわけではなく、それでも一部の有料プレミアム機能にアクセスしたいと考えているかもしれません。

開発者はこの種の動作を避けようとします。ここで、Apple の App Attest と DeviceCheck が介入します。

Apple の DeviceCheck フレームワークを使用すると、承認されたユーザーのみがプレミアム コンテンツやプロモーションにアクセスできるようになります。

デバイスチェック

Appleが提供するのは、デバイスチェックアプリがプレミアム アプリ機能の不正使用の試みを減らすのに役立つフレームワーク。

DeviceCheck は、アプリ内のプロモーションに関する詐欺を軽減するのに役立ちます。

たとえば、アプリがプロモーションやプレミアム コンテンツを提供している場合、一部のユーザーはその機能を悪用して複数の無料アイテムを入手しようとする可能性があります。アプリをアンインストールしてから再インストールすることでこれを行うことができます。

DeviceCheck フレームワークを使用すると、特定のハードウェア デバイスがプロモーション オファーをすでに受け取っているかどうかをアプリで確認できます。

これらのチェックは、各 Apple デバイスの Secure Enclave に関連付けられています。これらは、認証を確実にするために Apple アカウントと秘密暗号キーと組み合わせられます。

このチェックには次のものが含まれます。

  1. Apple がタイムスタンプとともに保存する 2 つのデバイス状態ビット
  2. デバイスごと、開発者ごと
  3. ハードウェアデバイスのリセット後も持続

Apple が保存する 2 ビットが各 Apple を結び付ける開発者アプリごとに以前に登録されたプロモーションを既知の状態にします。タイムスタンプとともにビットを任意の方法で使用して、アプリがプロモーション ステータスを判断することができます。

DeviceCheck は、デバイスごと、アプリ開発者ごとにデバイスを追跡します。

Apple デバイスが工場出荷時の状態に完全にリセットされると、DeviceCheck の状態はデバイスのリセット後も保存されます。

これらのチェックをアプリで使用すると、特定のプロモーションが、任意の Apple デバイス上の任意の Apple アカウントの任意のアプリで以前に使用されているかどうかを確認できます。

アプリの認証

App Attest も DeviceCheck.framework の一部であり、アプリの機能を追跡して、そのサービスがアプリで認識されるサービスであるかどうかを判断できます。

App Attest を使用するには、App Attest リクエストとともにユーザーのデバイスからハードウェア ベースのトークンを受信するサーバーまたはクラウド ベースのサービスが必要です。その後、サーバーは検証のためにこれらのアプリ要求を Apple App Attest サーバーに転送する必要があります。

Apple サーバーがアプリとサービスが有効であることを返した場合、サーバーは送信デバイスにリクエストが有効であることを通知します。

各リクエストは特定のデバイスのハードウェア情報に関連付けられているため、リクエストを他のデバイスに偽造したりコピーしたりすることはできません。

また、App Attest は、プレミアム アプリまたはサービス機能の不正なコピーが、あるデバイスから別のデバイスにコピーされることを防ぎます。

簡単な3品

App Attest は、リクエストが認証された本物の Apple デバイスからのものであることを確認するためにアプリで使用できる 3 つの重要な情報を提供します。

  1. Apple純正デバイス
  2. 本物のアプリケーション ID
  3. 信頼できるペイロード

正規の Apple デバイスを確認すると、アプリとプレミアム コンテンツが実際に実際の Apple デバイスで実行されていることを確認できます。

本物のアプリケーション ID により、リクエストを行っているアプリが自分のアプリであり、それが正規のコピーであることが確認されます。からダウンロードしたものアプリストア

信頼できるペイロードをチェックして、プレミアム機能またはプロモーション コンテンツが承認され、購入され、改ざんされていないことを確認できます。

これら 3 つの情報を使用することで、アプリはユーザーがコンテンツを利用できるようにすることができます。これにより、ハッカーや脱獄者が、別の Apple デバイスで料金を支払って承認されたプレミアム コンテンツをダウンロードしたり再利用したりしようとすることが防止されます。

本物のデバイスのチェックは、Secure Enclave によって使用される、デバイス上の安全なキー ペアの検査によって行われます。これは、有効なキー ペアを使用して生成されたデバイスからの App Attest リクエストと結合されます。

安全なキー ペアは、いわゆる公開鍵インフラストラクチャ(PKI) 暗号化を使用して安全なキーを作成し、ネットワーク経由で送信します。

安全なキーとデジタル署名を使用することで、アプリとデバイスはリクエストの送信元を確認できます。

PKI は非常に安全であり、世界で最も高性能なスーパーコンピューターでさえ、それを解読するには何年もかかります。

アプリが App Attest リクエストを行う場合、安全なキーを使用してリクエストを行うことができ、そのキーはサーバーによって検証されます。各セキュア キーはインストールごとに一意であり、デバイス間で同期またはコピーされません。

要求している各アプリのエンコードされたコピーバンドルIDも検証リクエストごとに送信されます。

鍵証明書を生成します。

アプリにアプリ証明書を追加する

アプリにアプリ証明書を追加するにはXcodeを使用するには、まず、各プロジェクト ターゲットのフレームワーク ペインの [ビルド情報] タブに DeviceCheck.framework を含める必要があります。

アプリで App Attest を使用するには、Secure Enclave を備えたデバイスでアプリが実行されている必要があります。したがって、実際に使用する前に、アプリで App Attest を使用できるかどうかを必ず確認する必要があります。

App Attest をアプリに追加するには、次の 3 つの部分があります。

  1. AppAttest キーの生成
  2. キーの検証
  3. アサーションの生成と検証

アプリのコードで AppAttest キーを作成するには、.sharedのプロパティDCAppAttestService次のようなクラスオブジェクト:

let appAttestService = DCAppAttestService.shared

これにより、という名前のローカル変数が作成されます。appAttestServiceからの.sharedプロパティを作成し、共有サービス オブジェクトのコピーを保存します。

のインスタンスを取得したら、.sharedプロパティを使用してキーを作成できます。

アプリ認証用のデバイスキーを生成します。

上記のコードでは、まず、DCAppAttestServiceクラス。次に、それを確認します.isSupportedプロパティを使用して AppAttest がこのデバイスで利用可能であることを確認し、次のキーを使用してキーを生成します。.generatekey方法。

もし.generatekeyエラーが返された場合は、それをチェックして処理します。そうでない場合は、キーが返されます。keyId

キーを取得したら、後で使用するためにそれを保管できます (通常は、以前に定義して作成したオブジェクトに保管します)。

DeviceCheck.framework は、Objective-C インターフェイスの代わりにその言語をまだ使用している場合、そのインターフェイスもサポートします。迅速

もし.isSupported財産の返還NOまたはキーが返されますnilアプリで AppAttest を使用することはできません。

コードが依然として返される場合があることに注意してください。NOのために.isSupported。デバイスに Secure Enclave が含まれている場合でも (通常、コードがアプリ拡張機能から呼び出される場合)。

アプリはこれらのケースにも対応できるように準備する必要があります。このような状況では、呼び出し元が信頼されていないと想定し、一連のリスク評価ルールに基づいて独自のコード ロジックを考案し、プレミアム機能を許可するかどうかを決定します。

このアプローチは、次善の検証です。.isSupported財産の返還NO

キーを検証する

上記のコードから有効なキーを持っていると仮定すると、次のステップは検証するか、証言する鍵。

これを行うには、アプリで 1 回限りのサーバー チャレンジを作成する必要があります。このチャレンジは、サーバーからのチャレンジで生成したキーを証明するように設計されており、ユーザー アカウント情報と組み合わせてキーを検証します。

キー証明の発生ごとにこれを行うには、サーバー側のコードも考案する必要があります。

キー構成証明は、中間者攻撃やリプレイ攻撃を防止することで、さらなるセキュリティ レベルを提供します。

このプロセスの最初のステップは、キー証明書を生成することです。上記と同じアプリ証明書サーバー オブジェクトを使用しますが、.attestKey方法。

このメソッドを使用すると、元のkeyID、クライアント データ ハッシュ、attestationObject、およびオプションのエラー変数。.attestKeyメソッドは入力として受け取ります。

戻ってくると、attestationObjectサーバーチャレンジに使用できます。

の目的.attestKeyこの方法は、デバイスの秘密キーを使用して、不透明なハードウェア構成証明要求を作成することです。 1 つはキーとこの特定のデバイスに関連付けられています。

このハードウェア構成証明は、ハードウェア検証のために Apple 構成証明サーバーに送信されます。検証が完了すると、Apple サーバーは匿名の証明書オブジェクトをアプリに返します。

Apple のサーバーだけが、送信された情報に基づいてデバイスをハードウェア レベルで検証する方法を知っているため、ハッカーがリクエストを傍受し、プレミアム機能を有効にする誤検知を返すことが非常に困難になります。

アプリが Apple から応答を受信し、それが有効であることを確認したら、最終検証のためにカスタム ペイロードとともに応答をサーバーに送信する必要があります。

このかなり複雑なプロセスと Apple のハードウェア検証および秘密キーを組み合わせることで、誰でもプレミアム機能をハッキングして未承認のコンテンツを有効にすることが非常に困難になります。

アップルのWWDC2021年のビデオタイトルApp Attest と DeviceCheck で不正行為を軽減このプロセスについて詳しく説明します。

セクションもありますDeviceCheck 秘密キーを作成するApple 開発者アカウントのドキュメントの「機能の構成」領域にあります。

DeviceCheck フレームワークのドキュメントには、チェックしていただきたい追加セクションが 4 つあります。

  1. デバイスごとのデータへのアクセスと変更
  2. 不正行為のリスクを評価する
  3. アプリの整合性を確立する
  4. サーバーに接続するアプリの検証

エラーの処理

上記のコードでは、Apple の DeviceCheck API の一部がオプションのエラー コードを返すことがわかりました。

アプリはこれらのコードを処理し、エラーが発生した場合にユーザーに通知する必要があります。

のドキュメントを確認してください。DCDeviceそしてDCErrorDeviceCheck フレームワークのクラス。

を返す DeviceCheck フレームワーク API からユーザーが表示可能なエラー コードを取得することもできます。DCErrorその値を取得することで、.Code財産。これは次のように定義されますenum(数値) は、事前定義された Apple エラー コードのセットにマッピングできます。

標準の Swift/C の使用caseステートメントを使用すると、エラー コードの結果を、アプリがユーザーに表示するユーザー表示可能な文字列にマッピングできます。

現在、事前に定義されているのは 5 つありますDCErrorApple によって設定されたコード:

  1. 機能がサポートされていません
  2. 無効な入力
  3. 無効なキー
  4. サーバーが利用できません
  5. 不明なシステム障害

featureUnsupportedDeviceCheck API の一部またはすべてが利用できないことを意味します。invalidKey使用しようとしたキーが失敗したことを意味します。

Apple API またはキー構成証明からエラーが返された場合、アプリはローカライズされた適切なテキスト文字列をユーザーに表示し、機能しなかった理由を通知する必要があります。

グローバル変数も確認できますDCErrorDomainエラーの後、最後に発生したエラーのドメインを特定します。

エラードメインを次のように考えてください。カテゴリエラーは次のように整理されます。を使用することで、DCErrorDomain文字列を使用すると、発生したエラーの種類に関する追加の有用な情報をユーザーに提供できます。

DeviceCheck と AppAttest は、Apple アプリ開発への歓迎された追加です。これらをアプリで使用することで、余分な作業をせずにプレミアム機能と収益を確保できます。