コンテンツにスキップ

GraphQL Debug Mode Enabled

GraphQLデバッグモードが有効

説明

GraphQLデバッグモードは、有効にすると、詳細なエラーメッセージ、スタックトレース、および追加のデバッグ情報が応答として提供される機能です。これは開発中には非常に貴重ですが、本番環境で有効にしたままにすると、サーバーの内部構造や実装の詳細に関する機密情報が公開される可能性があります。

Django Grapheneでは、デバッグモードは通常、DjangoのDEBUG設定と、Graphene構成にDjangoDebugMiddlewareを含めることによって制御されます。

デバッグモードが有効な場合、エラー応答には以下が含まれる可能性があります。 - 詳細なスタックトレース - データベースクエリ情報(SQLクエリを含む) - 内部サーバーパスとファイル名 - 機密の構成の詳細

Django Grapheneでデバッグモードを有効にした応答の例:

{
  "errors": [
    {
      "message": "Cannot query field \"nonexistentField\" on type \"Query\".",
      "locations": [
        {
          "line": 3,
          "column": 3
        }
      ],
      "path": ["nonexistentField"]
    }
  ],
  "data": null,
  "extensions": {
    "debug": {
      "sql": [
        {
          "sql": "SELECT \"auth_user\".\"id\", \"auth_user\".\"password\", \"auth_user\".\"last_login\", \"auth_user\".\"is_superuser\", \"auth_user\".\"username\", \"auth_user\".\"first_name\", \"auth_user\".\"last_name\", \"auth_user\".\"email\", \"auth_user\".\"is_staff\", \"auth_user\".\"is_active\", \"auth_user\".\"date_joined\" FROM \"auth_user\" WHERE \"auth_user\".\"id\" = %s LIMIT 21",
          "time": "0.000",
          "params": ["1"]
        }
      ],
      "python_version": "3.8.5",
      "django_version": "3.1.3",
      "graphene_version": "2.1.8",
      "graphql_version": "3.0.0"
    }
  }
}

GraphQLデバッグモードのセキュリティへの影響: - 情報漏えい: デバッグ情報から、GraphQLサーバーの構造、依存関係、および潜在的な脆弱性に関する内部の詳細が明らかになり、攻撃者がより標的を絞った攻撃を計画するために利用される可能性があります。 - 機密データの公開: スタックトレース、エラーメッセージ、特にSQLクエリには、データベースの構造、内部ファイルパス、または環境変数などの機密情報が意図せず含まれる可能性があります。 - 悪用の容易化: 詳細なエラーメッセージやSQLクエリは、悪意のあるクエリの何が機能し、何が機能しなかったかに関する即時のフィードバックを提供することで、攻撃者が攻撃を洗練させるのに役立ちます。 - パフォーマンス情報の漏えい: SQLクエリに提供されるタイミング情報は、攻撃者がデータベースの構造を推測したり、タイミング攻撃(タイミング攻撃)を実行したりするために使用される可能性があります。

推奨事項

GraphQLデバッグモードに関連するリスクを軽減するために、次の推奨事項を検討してください。

  1. 本番環境でのデバッグモードの無効化: 本番環境ではGraphQLのデバッグモードが無効になっていることを確認します。デバッグ情報は、開発環境とテスト環境でのみ利用できるようにする必要があります。

  2. 環境固有の設定の使用: デバッグモードとエラーの詳細度を制御するために、環境固有の構成を実装します。

  3. カスタムエラー処理の実装: 本番環境のクライアントにエラーメッセージを送信する前にサニタイズし、機密情報をすべて削除しながらも有用なフィードバックを提供するカスタムエラー処理メカニズムを作成します。

  4. 安全なロギング: デバッグモードを通じてエラー情報を公開するのではなく、後の分析のために詳細なエラー情報を保存する安全なロギングメカニズムを実装します。

Django Grapheneでデバッグモードを制御する例:

# settings.py

DEBUG = False  # Set to True only in development

GRAPHENE = {
    'MIDDLEWARE': [
        'graphene_django.debug.DjangoDebugMiddleware',
    ] if DEBUG else []
}

# カスタムエラー処理
from graphene_django.views import GraphQLView
from django.http import JsonResponse
from django.conf import settings

class CustomGraphQLView(GraphQLView):
    @staticmethod
    def format_error(error):
        if settings.DEBUG:
            return GraphQLView.format_error(error)
        return {"message": "An error occurred"}

    def execute_graphql_request(self, *args, **kwargs):
        result = super().execute_graphql_request(*args, **kwargs)
        if result.errors:
            errors = [self.format_error(e) for e in result.errors]
            return JsonResponse({"errors": errors})
        return result

# urls.pyでCustomGraphQLViewを使用する

この設定により、詳細なデバッグ情報(SQLクエリを含む)は開発環境でのみ利用可能になります。本番環境では、情報の漏洩を防ぐためにエラーがサニタイズされます。

他のGraphQLサーバーの実装については、デバッグモードを制御し、安全なエラー処理を実装する方法に関する特定のドキュメントを参照してください。

リンク

標準

  • PCI_STANDARDS:
    • REQ_6_5
    • REQ_11_3
  • OWASP_MASVS_L2:
    • MSTG_ARCH_9
  • OWASP_ASVS_L3:
    • V7_4_1
  • SOC2_CONTROLS:
    • CC_6_1
    • CC_6_7
    • CC_7_1
  • HIPAA_CONTROLS:
    • SECURITY212
    • SECURITY213
    • SECURITY255