安全でない API の使用

OWASP カテゴリ: MASVS-PLATFORM: プラットフォームのインタラクション

概要

多くのモバイル アプリケーションは、外部 API を使用して機能を提供しています。従来、サービスに接続するアプリケーションの認証には、静的トークンまたはキーが使用されていました。

ただし、クライアント サーバー設定(またはモバイルアプリと API)のコンテキストでは、一般的に、静的キーの使用は機密データやサービスにアクセスするための安全な認証方法とは見なされません。内部インフラストラクチャとは異なり、このキーにアクセスできるユーザーは、外部 API にアクセスしてサービスを不正使用できます。

たとえば、静的キーは、アプリケーションからリバース エンジニアリングされるか、モバイル アプリケーションが外部 API と通信するときに傍受される可能性があります。また、この静的キーがアプリケーション内にハードコードされる可能性も高くなります。

API のデータとサービスに対するリスクは、十分に安全な認証とアクセス制御が使用されていない場合に発生します。

静的キーを使用すると、リクエストを再生したり、(傍受またはリバース エンジニアリングされた)キーを使用して新しいリクエストを構築したりすることで、時間制限なしで API を不正使用できます。

影響

デベロッパーが AI または ML API サービスに対して料金を支払っている場合、攻撃者がこのキーを盗んでサービスで借金を増やしたり、偽のコンテンツを作成したりするのは比較的簡単です。

API に保存されているユーザーデータ、ファイル、PII が自由に利用可能になり、漏洩につながる可能性があります。

攻撃者はこのアクセス権を使用して、不正行為を行ったり、サービスをリダイレクトしたり、まれにサーバーを完全に制御したりする可能性があります。

リスクの軽減

Stateful API

アプリでユーザー ログインが提供されている場合や、ユーザー セッションを追跡できる場合は、アプリとのステートフル統合に Google Cloud などの API サービスを使用することをおすすめします。

また、API サービスが提供する安全な認証、クライアント検証、セッション制御を使用し、静的キーの代替として動的トークンの使用を検討してください。トークンの有効期限が妥当な短時間(通常は 1 時間)であることを確認します。

この動的トークンは、API へのアクセス権を付与するための認証に使用する必要があります。このガイドラインでは、OAuth 2.0 を使用してこれを実現する方法について説明します。これらのガイドラインに加えて、次の機能を実装することで、OAuth 2.0 をさらに強化して Android アプリの脆弱性を軽減できます。

適切なエラー処理とロギングを実装する:

  • OAuth エラーを適切に処理し、ユーザーに表示して、デバッグ用にログに記録します。
    • 攻撃対象領域を縮小することで、発生する可能性のある問題を特定してトラブルシューティングすることもできます。
    • ログに記録されるメッセージやユーザーに表示されるメッセージは、明確でありながら、攻撃者にとって有用な情報を含まないようにしてください。

アプリケーションで OAuth を安全に構成します。

  • 認可エンドポイントとトークン エンドポイントの両方に redirect_uri パラメータを送信します。
  • アプリでサードパーティ サービスとの OAuth を使用している場合は、クロスオリジン リソース シェアリング(CORS)を設定して、アプリのリソースへのアクセスを制限します。
    • これにより、不正なクロスサイト スクリプティング(XSS)攻撃を防ぐことができます。
  • 状態パラメータを使用して CSRF 攻撃を防ぎます。

セキュリティ ライブラリを使用します。

  • AppAuth などのセキュリティ ライブラリを使用すると、安全な OAuth フローの実装を簡素化できます。
    • これらの Android ライブラリは、前述のセキュリティのベスト プラクティスの多くを自動化するのに役立ちます。

Firebase や Google ID トークンなどの他の認証方法については、OpenAPI ドキュメントをご覧ください。

ステートレス API

API サービスが前述の推奨事項のいずれも提供しておらず、ユーザー ログインなしのステートレス セッションが必要な場合は、デベロッパーが独自のミドルウェア ソリューションを提供する必要があるかもしれません。

これには、アプリと API エンドポイント間のリクエストの「プロキシ」が含まれます。この方法の 1 つは、JSON ウェブトークン(JWT)と JSON ウェブ署名(JWS)を使用するか、前述のように完全に認証されたサービスを提供することです。これにより、脆弱な静的キーをアプリケーション(クライアント)ではなくサーバーサイドに保存できます。

モバイル アプリケーションでエンドツーエンドのステートレス ソリューションを提供するには、固有の問題があります。最も重要な課題としては、クライアント(アプリ)の検証と、デバイスへの秘密鍵またはシークレットの安全な保存があります。

Play Integrity API は、アプリとリクエストの完全性の検証を提供します。これにより、このアクセスが不正使用される可能性のあるシナリオの一部を軽減できます。キー管理については、多くの場合、キーストアが秘密鍵の安全な保管場所として最適です。

一部のモバイル アプリケーションでは、登録フェーズを使用してアプリの完全性をチェックし、安全な交換を使用して鍵を提供します。これらの方法は複雑であり、このドキュメントの範囲外です。ただし、クラウド鍵管理サービスは、潜在的なソリューションの 1 つです。

リソース